欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解iOS App開(kāi)發(fā)中改變UIButton內(nèi)部控件的基本方法

 更新時(shí)間:2016年03月24日 09:05:52   作者:ForeverYoung21  
這篇文章主要介紹了iOS App開(kāi)發(fā)中改變UIButton內(nèi)部控件的基本方法,文章開(kāi)頭也順帶總結(jié)了一些UIButton的基本用法,示例代碼為Objective-C,需要的朋友可以參考下

UIButton內(nèi)部默認(rèn)有個(gè)UIImageView、UILabel控件,可以分別用下面屬性訪問(wèn):

復(fù)制代碼 代碼如下:

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

UIButton之所以能顯示文字,完全是因?yàn)樗鼉?nèi)部的titleLabel也,也就是說(shuō),UIButton的setTitle:forState:方法設(shè)置的字符串就是顯示到了titleLabel上

 UIButton的setImage:forState:方法設(shè)置的圖片顯示到了內(nèi)部的imageView上。

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

復(fù)制代碼 代碼如下:

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

warnning:不能直接拿到titleLabel設(shè)置文字和文字顏色,比如下面的做法是錯(cuò)誤的:
復(fù)制代碼 代碼如下:

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

2.設(shè)置按鈕內(nèi)部的小圖片,必須用下面的方法

復(fù)制代碼 代碼如下:

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

warnning:不能直接拿到imageView設(shè)置圖片,比如下面的做法是錯(cuò)誤的:
復(fù)制代碼 代碼如下:

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

好了,回顧完之后,我們下面來(lái)進(jìn)入本文的主題~

改變UIButton內(nèi)部控件
當(dāng)給UIButton設(shè)置title和image后,就相當(dāng)于UIButton是由一個(gè)UIButtonLabel + 一個(gè)UIImageView組成。但是它們默認(rèn)的格式是固定的,即左面是一個(gè)UIImage,右面是一個(gè)UIButtonLabel?,F(xiàn)在如果我們想讓UIImage顯示在這個(gè)button的上面,讓UIButtonLabel顯示在這個(gè)button的下面。

我們可以完全自定義一個(gè)控件來(lái)實(shí)現(xiàn)上面所說(shuō)的,也可以在UIButton的基礎(chǔ)上改變它的內(nèi)部子控件。這里采用第二種方法。

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

我們可以首先對(duì)這個(gè)button打印一下看看內(nèi)部的結(jié)構(gòu):

復(fù)制代碼 代碼如下:

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

打印的結(jié)果是一個(gè)空數(shù)組!這是怎么回事呢?

實(shí)際上UIButton內(nèi)部的子控件采用的是懶加載,也就是說(shuō)如果沒(méi)有使用到相應(yīng)的子控件,那么是不會(huì)加載的。

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

但是如果你這么做,你會(huì)發(fā)現(xiàn)實(shí)際顯示的這個(gè)button內(nèi)部并沒(méi)有改變,說(shuō)明直接改變UIButton內(nèi)部控件的frame是無(wú)法達(dá)到重新排列的目的的。

接著將這個(gè)button內(nèi)部的子控件打印出來(lái):

復(fù)制代碼 代碼如下:

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

會(huì)發(fā)現(xiàn)subviews這個(gè)數(shù)組里現(xiàn)在是一個(gè)UIImageView + 一個(gè)UIButtonLabel,現(xiàn)在它們有了值(因?yàn)榍懊嬗玫搅诉@兩個(gè)控件,所以進(jìn)行了懶加載)。

可是仔細(xì)觀察,會(huì)發(fā)現(xiàn)這兩個(gè)控件的frame明明是我們剛剛賦值的frame,但是顯示出來(lái)的為什么又不是按這個(gè)frame顯示的呢?

因?yàn)榇蛴〕鰜?lái)的frame只是我們剛剛設(shè)置的,而UIButton在顯示的時(shí)候會(huì)根據(jù)它的UIImageView和UIButtonLabel里面的內(nèi)容重新計(jì)算大小,所以即使我們改變了子控件的frame,也無(wú)法真正更改子控件的位置和尺寸。

2.第二種思路是可以繼承UIButton,在原來(lái)的按鈕的基礎(chǔ)上進(jìn)行改變。

比如我們創(chuàng)建一個(gè)UIButton的子類CYLButton,在CYLButton的實(shí)現(xiàn)文件中實(shí)現(xiàn)下面的方法:

復(fù)制代碼 代碼如下:

- (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一般來(lái)代表UIButton的bounds.size

// 我們也可以在initWithFrame:方法中設(shè)置UIButton的內(nèi)部控件的屬性
- (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;
}


可以看到這種方法可以滿足我們的要求。但是也有弊端,如果我們?cè)谄渲幸粋€(gè)方法中設(shè)置的某一些想在另一個(gè)方法中也用到,那么就不是很方便。

3.更好的方法是重寫(xiě)layoutSubviews方法,因?yàn)檫@個(gè)方法可以很方便地調(diào)整子控件。

復(fù)制代碼 代碼如下:

- (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);
}


這樣做可能會(huì)很奇怪,因?yàn)閯偛旁谶@個(gè)類的外面我們也改變的是imageView和titleLabel的frame,可是毫無(wú)作用,而在layoutSubviews方法里同樣修改,為什么會(huì)起作用了呢?

因?yàn)閯偛盼覀冊(cè)谕饷嫘薷淖涌丶膄rame,但是當(dāng)執(zhí)行到內(nèi)部的layoutSubviews方法的時(shí)候會(huì)重新將它們的frame設(shè)置為image和title對(duì)應(yīng)的大小。而現(xiàn)在我們直接在layoutSubviews中修改它們的frame,相當(dāng)于覆蓋了之前將它們的frame設(shè)置為默認(rèn)大小這一步驟,所以現(xiàn)在是可以成功的,并且因?yàn)樵谝粋€(gè)方法中,是可以共享變量的。

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

復(fù)制代碼 代碼如下:

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

因?yàn)閟elf(CYLButton)是繼承自UIButton,所以無(wú)論是image還是title都是分狀態(tài)的,所以需要這樣:
復(fù)制代碼 代碼如下:

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

所以說(shuō)能不能直接修改,取決于這個(gè)屬性分不分狀態(tài)。如果分狀態(tài),那么就不能直接修改。

相關(guān)文章

  • IOS開(kāi)發(fā)代碼分享之設(shè)置UISearchBar的背景顏色

    IOS開(kāi)發(fā)代碼分享之設(shè)置UISearchBar的背景顏色

    在項(xiàng)目開(kāi)發(fā)中,我們經(jīng)常要用到UISearchBar,在網(wǎng)上看到了很多關(guān)于去除掉他背景色的方法,都已經(jīng)失效了,今天來(lái)分享一個(gè)正常使用的方法,希望能幫到大家
    2014-09-09
  • iOS畫(huà)出精美的圖表方法示例

    iOS畫(huà)出精美的圖表方法示例

    這篇文章主要給大家介紹了關(guān)于iOS如何畫(huà)出精美的圖表的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • iOS手勢(shì)密碼的實(shí)現(xiàn)方法

    iOS手勢(shì)密碼的實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了iOS手勢(shì)密碼的實(shí)現(xiàn)方法,教會(huì)大家如何實(shí)現(xiàn)手勢(shì)密碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • iOS 生成圖片驗(yàn)證碼繪制實(shí)例代碼

    iOS 生成圖片驗(yàn)證碼繪制實(shí)例代碼

    本篇文章主要介紹了iOS 圖片驗(yàn)證碼繪制實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • iOS開(kāi)發(fā)中多線程的安全隱患總結(jié)

    iOS開(kāi)發(fā)中多線程的安全隱患總結(jié)

    在本篇文章中小編給大家整理了關(guān)于iOS開(kāi)發(fā)中多線程的安全隱患的知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)參考下。
    2019-07-07
  • iOS如何利用一句話完成轉(zhuǎn)場(chǎng)動(dòng)畫(huà)

    iOS如何利用一句話完成轉(zhuǎn)場(chǎng)動(dòng)畫(huà)

    這篇文章主要給大家介紹了關(guān)于iOS如何利用一句話完成轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • iOS UITableView 與 UITableViewController實(shí)例詳解

    iOS UITableView 與 UITableViewController實(shí)例詳解

    這篇文章主要介紹了iOS UITableView 與 UITableViewController實(shí)例詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • iOS表情鍵盤(pán)的簡(jiǎn)單實(shí)現(xiàn)代碼

    iOS表情鍵盤(pán)的簡(jiǎn)單實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了iOS表情鍵盤(pán)的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • IOS中(assign,retain,copy,weak,strong)的區(qū)別以及nonatomic的含義

    IOS中(assign,retain,copy,weak,strong)的區(qū)別以及nonatomic的含義

    這篇文章主要介紹了我們?cè)诼暶鰼property 屬性時(shí),總是要在括號(hào)中寫(xiě)上assign、retain、copy、weak、strong中的一個(gè),他們的區(qū)別,需要的朋友可以參考下
    2017-03-03
  • 詳解iOS Method Swizzling使用陷阱

    詳解iOS Method Swizzling使用陷阱

    這篇文章主要介紹了詳解iOS Method Swizzling使用陷阱,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論