zoukankan      html  css  js  c++  java
  • 何为分类,UIImageView举例

    终于开始自己这个“聚水成洋”的路程了。

    经过近一年的iOS学习和开发,遇到很多困难,一开始的陌生和畏惧,中途的困惑和纠结,解决问题后的豁然开朗和总结提升,自己就在这样一个不断的循环中逐渐成长起来了。

    很难说一个人接下来的路会是怎样,就如自己跌跌撞撞就开始了iOS开发一样,但是,只要坚持和不断总结提升,现在看起来陌生困难的事,也会被我们的倔强磨平坦。

    为了不让自己迷失,所以我选择不断回头和总结,时刻认清自己的过去和现在的位置,继续走在梦想的道路上。

    好了,我开始总结第一个知识点了。

    何为分类。

    OC语言真的是一门优雅的编程语言,如同自然语言一样,让编程者着迷。那我也希望自己的总结是自然的,而不是代码的堆砌,那就太偷懒了。

    分类这个概念很有意思,就像是类的分身,但同时指向类的本体,也就是说一旦在影响范围内,任何变化都会影响本体类。影响范围是个很重要的点,就算是存在分身,但是我们不使用,那肯定也是不会影响本体的。这里的使用,就可以理解为“#import”。

    分类名与本体类名的关系是:在本体类名后面加上“+扩展名”。例如我接下来举例的UIImageView+ForTextViewScrollIndicator分类。

    新建好分类以后,会发现.h文件和.m文件的类名为UIImageView(ForTextViewScrollIndicator),括号里面的就是扩展名了。

    其实,当我们任意新建一个类后,.m文件里可以看到一个“[新建类名]()”,注意,这就是Xcode为我们自动创建的一个匿名分类,作用在于将影响范围仅仅限于当前类,同时隐藏匿名分类里面声明的变量和方法。

    分类的好处:可以任意扩展本体类,这样就可以在基础类之上扩展功能,也避免了复杂的层层继承关系,减少了由于继承带来的冗余层次关系。

    分类的坏处:大量的分类,可能会导致本体类功能模糊,难以分辨是哪个分类造成的影响。需要注意这一点。

    下面就用我自己写的一个分类来描述:UIImageView+ForTextViewScrollIndicator

    需求:在一个固定size的TextView控件里,当内容超过能显示的容量,就一直显示垂直滚动条。

    TextView控件的原理是,当内容不能完全显示,滚动条会一闪而过,如何才能让其始终显示呢?那就要搞清楚滚动条是什么。其实滚动条本质上就是UITextView中的一个UIImageView,所看到的是一个显示的UIImageView,一闪而过,实际上就是hide了。怎么hide的?执行了UIImageView的-(void)setAlpha:(CGFloat)alpha方法。明白了吧,就是alpha从1变为了0。

    那很明显了,就是要重写这个TextView的滚动条UIImageView,而且就是setAlpha方法。

    首先,标记UITextView一个tag值,在分类的实现里面添加如下代码:

    -(void)setAlpha:(CGFloat)alpha
    {
        if(self.superview.tag == noDisableVerticalScrollTag){
            if(alpha == 0){
                if(self.frame.size.width <10 && self.frame.size.height > self.frame.size.width){
                    UITextView *textView = (UITextView*)self.superview;
                    if(textView.frame.size.height < textView.contentSize.height){
                        [super setAlpha:1];
                        return;
                    }
                }
            }
        }
        
        if (self.superview.tag == noDisableHorizontalScrollTag) {
            if (alpha == 0) {
                if(self.frame.size.height<10 && self.frame.size.width > self.frame.size.height){
                    UITextView *textView = (UITextView*)self.superview;
                    if (textView.frame.size.width < textView.contentSize.width) {
                        [super setAlpha:1];
                        return;
                    }
                }
            }
        }
        
        [super setAlpha:alpha];
    }

    两个标记值分别代表显示垂直滚动条还是水平滚动条。

    当TextView的滚动条alpha变为0时,就比较UIImageView自身的高和宽;如果符合即将显示的滚动条特征,就进一步比较UITextView的高度/宽度和其contentSize属性的高度/宽度,如果滚动条比内容短,则调用本类的setAlpha,将其置为1,返回。

    看到没,分类还是可以采用子类的写法,只是在层次关系上,是对本类的补充扩展,算是平级关系。同样可以对本类方法进行重载和重写。

    分类就是这样的一种类,也是一种特性,使用起来,并没有父类子类之分,就好像本类本身多了新的方法。

    这就是对分类的总结了,也记录了一个分类例子,以后会坚持记录总结自己的学习心得。

  • 相关阅读:
    body标签中l的相关标签
    PostgreSQL&PostGIS完全安装
    PostgreSQL常用函数
    Linux 路由 学习笔记 之一 相关的数据结构
    OSPF学习中的问题
    对TCP重传的进一步认识
    TCP 接收窗口自动调节
    [转]struct 用法深入探索
    Memcached缓存瓶颈分析
    C++的try_catch异常
  • 原文地址:https://www.cnblogs.com/A-Long-Way-Chris/p/3656486.html
Copyright © 2011-2022 走看看