何爲分類,UIImageView舉例

終於開始本身這個「聚水成洋」的路程了。編程

通過近一年的iOS學習和開發,遇到不少困難,一開始的陌生和畏懼,中途的困惑和糾結,解決問題後的豁然開朗和總結提高,本身就在這樣一個不斷的循環中逐漸成長起來了。編程語言

很難說一我的接下來的路會是怎樣,就如本身跌跌撞撞就開始了iOS開發同樣,可是,只要堅持和不斷總結提高,如今看起來陌生困難的事,也會被咱們的倔強磨平坦。ide

爲了避免讓本身迷失,因此我選擇不斷回頭和總結,時刻認清本身的過去和如今的位置,繼續走在夢想的道路上。學習

 

好了,我開始總結第一個知識點了。spa

何爲分類。code

OC語言真的是一門優雅的編程語言,如同天然語言同樣,讓編程者着迷。那我也但願本身的總結是天然的,而不是代碼的堆砌,那就太偷懶了。blog

分類這個概念頗有意思,就像是類的分身,但同時指向類的本體,也就是說一旦在影響範圍內,任何變化都會影響本體類。影響範圍是個很重要的點,就算是存在分身,可是咱們不使用,那確定也是不會影響本體的。這裏的使用,就能夠理解爲「#import」。繼承

分類名與本體類名的關係是:在本體類名後面加上「+擴展名」。例如我接下來舉例的UIImageView+ForTextViewScrollIndicator分類。開發

新建好分類之後,會發現.h文件和.m文件的類名爲UIImageView(ForTextViewScrollIndicator),括號裏面的就是擴展名了。class

其實,當咱們任意新建一個類後,.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,返回。

看到沒,分類仍是能夠採用子類的寫法,只是在層次關係上,是對本類的補充擴展,算是平級關係。一樣能夠對本類方法進行重載和重寫。

分類就是這樣的一種類,也是一種特性,使用起來,並無父類子類之分,就好像本類自己多了新的方法。

這就是對分類的總結了,也記錄了一個分類例子,之後會堅持記錄總結本身的學習心得。

相關文章
相關標籤/搜索