亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

詳解iOS App開發中改變UIButton內部控件的基本方法

2020-07-26 03:24:49
字體:
來源:轉載
供稿:網友

UIButton內部默認有個UIImageView、UILabel控件,可以分別用下面屬性訪問:

復制代碼 代碼如下:

@property(nonatomic,readonly,retain) UIImageView *imageView;
@property(nonatomic,readonly,retain) UILabel     *titleLabel;

UIButton之所以能顯示文字,完全是因為它內部的titleLabel也,也就是說,UIButton的setTitle:forState:方法設置的字符串就是顯示到了titleLabel上

 UIButton的setImage:forState:方法設置的圖片顯示到了內部的imageView上。

注意:
1.設置按鈕的文字或文字顏色,必須用下面的方法

復制代碼 代碼如下:

- (void)setTitle:(NSString *)title forState:(UIControlState)state;
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state;

warnning:不能直接拿到titleLabel設置文字和文字顏色,比如下面的做法是錯誤的:
復制代碼 代碼如下:

button.titleLabel.text = @"12323";
button.titleLabel.textColor = [UIColor redColor];

2.設置按鈕內部的小圖片,必須用下面的方法

復制代碼 代碼如下:

- (void)setImage:(UIImage *)image forState:(UIControlState)state;

warnning:不能直接拿到imageView設置圖片,比如下面的做法是錯誤的:
復制代碼 代碼如下:

button.imageView.image = [UIImage imageNamed:@"abc.png"];

好了,回顧完之后,我們下面來進入本文的主題~

改變UIButton內部控件
當給UIButton設置title和image后,就相當于UIButton是由一個UIButtonLabel + 一個UIImageView組成。但是它們默認的格式是固定的,即左面是一個UIImage,右面是一個UIButtonLabel。現在如果我們想讓UIImage顯示在這個button的上面,讓UIButtonLabel顯示在這個button的下面。

我們可以完全自定義一個控件來實現上面所說的,也可以在UIButton的基礎上改變它的內部子控件。這里采用第二種方法。

1.首先,如果想改變子控件的位置,那么最先想到的可能是拿到這個button,然后通過訪問它的imageView和titleLabel屬性。

我們可以首先對這個button打印一下看看內部的結構:

復制代碼 代碼如下:

NSLog(@"%@", self.button.subviews);

打印的結果是一個空數組!這是怎么回事呢?

實際上UIButton內部的子控件采用的是懶加載,也就是說如果沒有使用到相應的子控件,那么是不會加載的。

那么我們就重新給這兩個控件的frame賦值,這樣不僅用到了這兩個控件使其加載,也可以看看是否可以直接改變這兩個控件的frame以達到將這兩個控件重新排列的目的。

但是如果你這么做,你會發現實際顯示的這個button內部并沒有改變,說明直接改變UIButton內部控件的frame是無法達到重新排列的目的的。

接著將這個button內部的子控件打印出來:

復制代碼 代碼如下:

NSLog(@"%@", self.button.subviews);

會發現subviews這個數組里現在是一個UIImageView + 一個UIButtonLabel,現在它們有了值(因為前面用到了這兩個控件,所以進行了懶加載)。

可是仔細觀察,會發現這兩個控件的frame明明是我們剛剛賦值的frame,但是顯示出來的為什么又不是按這個frame顯示的呢?

因為打印出來的frame只是我們剛剛設置的,而UIButton在顯示的時候會根據它的UIImageView和UIButtonLabel里面的內容重新計算大小,所以即使我們改變了子控件的frame,也無法真正更改子控件的位置和尺寸。

2.第二種思路是可以繼承UIButton,在原來的按鈕的基礎上進行改變。

比如我們創建一個UIButton的子類CYLButton,在CYLButton的實現文件中實現下面的方法:

復制代碼 代碼如下:

- (CGRect)titleRectForContentRect: (CGRect)contentRect // 控制label顯示在哪和大小
{
    return CGRectMake(0, contentRect.size.width, contentRect.size.width, contentRect.size.height - contentRect.size.width);
}

- (CGRect)imageRectForContentRect: (CGRect)contentRect // 控制image顯示在哪和大小
{
    return CGRectMake(0, 0, contentRect.size.width, contentRect.size.width);
}

// contentRect一般來代表UIButton的bounds.size

// 我們也可以在initWithFrame:方法中設置UIButton的內部控件的屬性
- (instancetype)initWithFrame: (CGRect)frame
{
      if (self = [super initWithFrame: frame]) {
        self.titleLabel.backgroundColor = [UIColor blueColor];
          self.titleLabel.textAlignment = NSTextAlignmentCenter;
          self.imageView.backgroundColor = [UIColor yellowColor];
      }
      return self;
}


可以看到這種方法可以滿足我們的要求。但是也有弊端,如果我們在其中一個方法中設置的某一些想在另一個方法中也用到,那么就不是很方便。

3.更好的方法是重寫layoutSubviews方法,因為這個方法可以很方便地調整子控件。

復制代碼 代碼如下:

- (void)layoutSubviews
{
    [super layoutSubviews];

      CGFloat imageW = self.bounds.size.width;
      CGFloat imageH = imageW;
      self.imageView.frame = CGRectMake(0, 0, imageW, imageH);

      CGFloat titleY = imageH;
      CGFloat titleW = imageW;
      CGFloat titleH = self.bounds.size.height - titleY;
    self.titleLabel.frame = CGRectMake(0, titleY, titleW, titleH);
}


這樣做可能會很奇怪,因為剛才在這個類的外面我們也改變的是imageView和titleLabel的frame,可是毫無作用,而在layoutSubviews方法里同樣修改,為什么會起作用了呢?

因為剛才我們在外面修改子控件的frame,但是當執行到內部的layoutSubviews方法的時候會重新將它們的frame設置為image和title對應的大小。而現在我們直接在layoutSubviews中修改它們的frame,相當于覆蓋了之前將它們的frame設置為默認大小這一步驟,所以現在是可以成功的,并且因為在一個方法中,是可以共享變量的。

另外需要注意,如果繼承自UIButton(比如CYLButton),那么當有了數據模型,想在CYLButton的setter方法中給子控件賦值的時候,不能直接這樣:

復制代碼 代碼如下:

self.imageView = ...
self.text = ...

因為self(CYLButton)是繼承自UIButton,所以無論是image還是title都是分狀態的,所以需要這樣:
復制代碼 代碼如下:

[self setImage...];
[self setTitle...];

所以說能不能直接修改,取決于這個屬性分不分狀態。如果分狀態,那么就不能直接修改。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品成人观看视频国产奇米| 久久久久免费精品国产| 91亚洲精华国产精华| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩精品在线免费观看| 国产欧美在线播放| 欧美在线视频免费| 国产精品影院在线观看| 中文字幕亚洲欧美日韩在线不卡| 日本乱人伦a精品| 7m第一福利500精品视频| 久久亚洲欧美日韩精品专区| 久久国产精品亚洲| 97精品一区二区视频在线观看| 亚洲网站在线观看| 欧美交受高潮1| 亚洲一区二区精品| 欧美极品欧美精品欧美视频| 亚洲美女久久久| 欧美国产日韩一区| 中文字幕一区电影| 亚洲一区二区三区sesese| 欧美激情网站在线观看| 欧美激情视频在线观看| 欧美孕妇孕交黑巨大网站| 国产日产欧美精品| 欧美精品18videosex性欧美| 法国裸体一区二区| 国内精品视频一区| 岛国av一区二区| 亚洲精品女av网站| 狠狠久久亚洲欧美专区| 国产亚洲一级高清| 亚洲人成自拍网站| 国产精品午夜国产小视频| 亚洲最新av在线| 91亚洲午夜在线| 亚洲精品成a人在线观看| 久久精品久久久久久| 国产丝袜一区视频在线观看| 尤物九九久久国产精品的特点| 国产在线视频2019最新视频| 亚洲一区二区三区视频| 92裸体在线视频网站| 久久视频国产精品免费视频在线| 亚洲精品免费一区二区三区| 国产日韩综合一区二区性色av| 国产精品毛片a∨一区二区三区|国| 91人人爽人人爽人人精88v| 国产一区二区在线免费视频| 成人激情在线观看| 欧美性生交xxxxxdddd| 日韩一区视频在线| 日本久久久久久| 亚洲视频专区在线| 最近2019中文字幕第三页视频| 韩剧1988在线观看免费完整版| 日韩av影视综合网| 国产精品久久av| 国产成人精品一区二区| 国内精品美女av在线播放| 日韩在线观看免费高清完整版| 欧美日韩另类在线| 亚洲精品动漫久久久久| 欧美日韩aaaa| 久久久久久久久综合| 欧美日韩精品在线视频| 久久久久久91香蕉国产| 国产精品美女无圣光视频| 91久久精品在线| 亚洲成人久久久久| 久久久这里只有精品视频| 欧美日韩国产在线| 538国产精品视频一区二区| 亚洲精品美女视频| 色视频www在线播放国产成人| 久久成人精品一区二区三区| 国产91亚洲精品| 日韩一区视频在线| 日韩高清免费观看| 欧美寡妇偷汉性猛交| 日韩中文字幕免费| 国产高清在线不卡| 欧美日本黄视频| 日韩av不卡电影| 国产欧美va欧美va香蕉在线| 日韩高清中文字幕| 一本色道久久综合狠狠躁篇怎么玩| 成人亚洲综合色就1024| 久久激情视频免费观看| 成人97在线观看视频| 在线成人免费网站| 国产亚洲福利一区| 欧美日韩裸体免费视频| 亚洲精品乱码久久久久久金桔影视| 精品国产一区av| 亚洲综合精品一区二区| 精品国产依人香蕉在线精品| 欧美性猛交xxxx偷拍洗澡| 国产精品久久久久久久久久ktv| 亚洲精品丝袜日韩| 欧美孕妇孕交黑巨大网站| 成人免费视频在线观看超级碰| 大荫蒂欧美视频另类xxxx| 日韩成人xxxx| 日韩电影免费观看中文字幕| 日韩在线视频网站| 4438全国成人免费| 91人人爽人人爽人人精88v| 成人国产在线激情| 亚洲欧美另类中文字幕| 日韩在线视频免费观看| 成人免费看吃奶视频网站| 成人激情在线观看| 亚洲色图av在线| 国产精品美女呻吟| 日韩在线观看视频免费| 亚洲国产女人aaa毛片在线| 国产99久久精品一区二区永久免费| 51精品国产黑色丝袜高跟鞋| 色老头一区二区三区在线观看| 国产香蕉一区二区三区在线视频| 黑人巨大精品欧美一区免费视频| 日韩**中文字幕毛片| 美乳少妇欧美精品| 麻豆精品精华液| 亚洲综合自拍一区| 国产精品女主播视频| 久久在线免费观看视频| 日韩av在线影院| 亚洲第一页自拍| 久久精品国产久精国产思思| 国语对白做受69| 久久精品国产99国产精品澳门| 国产欧美日韩免费看aⅴ视频| 精品一区二区三区三区| 亚洲精品在线看| 国产精品扒开腿爽爽爽视频| 亚洲视频网站在线观看| 亚洲欧美激情在线视频| 国模精品一区二区三区色天香| 国产一区二区三区在线播放免费观看| 国产亚洲精品成人av久久ww| 欧美成人精品在线播放| 日本不卡高字幕在线2019| 亚洲区中文字幕| 久久久久久国产| 国产精品户外野外| 中文字幕国产日韩| 成人中心免费视频| 欧美精品videosex极品1| 欧美成人午夜激情| 国产欧美日韩专区发布| 久久国产精品免费视频| 美女性感视频久久久| 亚洲福利影片在线| 日韩精品免费视频| 亚洲xxxx妇黄裸体| 九九九久久久久久| 日韩久久精品电影| 欧美理论在线观看| 欧美理论在线观看| 亚洲精品99久久久久| 日韩电影第一页|