UIButton

  • 繼承自UIControl
  • 非常重要的UI控件---UIButton包归,俗稱“按鈕”
    • 一般情況下,點擊某個控件后,會做出相應反應的都是按鈕
    • 按鈕的功能比較多大年,既能顯示文字,又能顯示圖片玉雾,還能隨時調(diào)整內(nèi)部圖片和文字的位置

UIButton的狀態(tài)

  1. normal(普通狀態(tài))
    • 按鈕默認狀態(tài)(Default)
    • 對應的枚舉常量:UIControlStateNormal
    [button setImage:image forState:UIControlStateNormal];
    
  • highlighted(高亮狀態(tài))

    • 按鈕被按下去的時候(手指還未松開)
    • 對應的枚舉常量:UIControlStateHighlighted
    • 為了保證高亮狀態(tài)下的圖片正常顯示翔试,必須設置按鈕的type為custom
    [button setImage:image forState:UIControlStateSelected];
    
  • selected(選中狀態(tài))

    • 按鈕被選中的時候
    • 對應的枚舉常量:UIControlStateSelected
    [button setImage:image forState:UIControlStateSelected];
    
  • disabled(失效狀態(tài))

    • 如果enabled屬性為NO,就是處于disable狀態(tài)复旬,代表按鈕不可以被點擊
    • 失效狀態(tài)會對按鈕中的圖片做“變淡”處理垦缅。如果不想出現(xiàn)這種效果,應該通過Btn.userInteractionEnabled = NO實現(xiàn)
    • 對應的枚舉常量:UIControlStateDisabled
    [button setImage:image forState:UIControlStateDisabled];
    

UIButton 常用方法

// 設置按鈕的文字
[button setTitle:@"點我啊" forState:UIControlStateNormal];
// 設置按鈕的文字顏色
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

// 設置按鈕內(nèi)部的圖片
[button setImage:image forState:UIControlStateNormal];

// 設置按鈕的背景圖片
[button setBackgroundImage:image forState:UIControlStateNormal];
// 設置按鈕的背景顏色
[button setBackgroundColor:[UIColor redColor]];

// 監(jiān)聽按鈕
// UIControlEventTouchUpInside:手指按下后抬起執(zhí)行監(jiān)聽方法
[button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];

// 設置邊框顏色
button.layer.borderColor = [UIColor redColor].CGColor;
// 設置邊框?qū)挾?button.layer.borderWidth = 1;
// 設置圓形邊框
button.layer.cornerRadius = button.frame.size.width * 0.5;

// 按鈕可用設置
button.enabled = !button.enabled;

UIButton 其他方法

// 設置按鈕的文字字體(需要拿到按鈕內(nèi)部的label來設置)
btn.titleLabel.font = [UIFont systemFontOfSize:13];

//水平對齊
[button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter];
//垂直對齊
[button setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];

按鈕常見的訪問方法

// 獲取當前狀態(tài)按鈕圖片
[button imageForState:UIControlStateNormal].size;
button.currentImage.size;

// 獲取當前狀態(tài)按鈕背景圖片
[button backgroundImageForState:UIControlStateNormal];
button.currentBackgroundImage;

// 獲取當前狀態(tài)按鈕文字
[button titleForState:UIControlStateNormal];
button.currentTitle;

// 獲取當前狀態(tài)按鈕文字顏色
[button titleColorForState:UIControlStateNormal];
button.currentTitleColor;

按鈕布局

  • 方案一:調(diào)整按鈕的內(nèi)邊距
    // 邊距結(jié)構體
    typedef struct UIEdgeInsets {
    CGFloat top, left, bottom, right;
    

} UIEdgeInsets;

// 設置按鈕內(nèi)容的內(nèi)邊距(影響到imageView和titleLabel)
btn.contentEdgeInsets = UIEdgeInsetsMake(10, 0, 0, 0); //imageView和titleLabel均下移10

// 設置titleLabel的內(nèi)邊距(imageView不動驹碍,文本動)
btn.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0); //titleLabel右移10

// 設置imageView的內(nèi)邊距(文本不動壁涎,imageView動)
btn.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 10); //imageView左移10
```
  • 方案二:layoutSubviews方法中重新布局按鈕控件

    - (void)layoutSubviews
    {
        [super layoutSubviews];// 必須調(diào)用
    
        // 布局代碼
    }
    
  • 方案三:實現(xiàn)titleRectForContentRect:imageRectForContentRect:方法,修改titleLabel和imageView的frame志秃。

    • 方案二可以統(tǒng)一設置怔球,所以一般不使用方案三
    -(CGRect)titleRectForContentRect:(CGRect)contentRect
    {
        // 文本控件布局代碼
    }
    
    -(CGRect)imageRectForContentRect:(CGRect)contentRect
    {
        // 圖片控件布局代碼
    }
    

自定義按鈕

  • 手段:代碼和xib都可以
  • 步驟:
    • 提供類和對象初始化方法
    • 創(chuàng)建子控件,設置父子控件基本屬性
    • layoutSubviews布局(xib可以不用)
    • 提供模型屬性浮还,重寫set方法設置子控件變動屬性
  • 與通過UIView創(chuàng)建的差異:
    • 按鈕是分狀態(tài)顯示的竟坛,所以圖片和文本等要分狀態(tài)設置,而UIView自定義控件不用碑定;
    • 按鈕有圖片和背景圖片兩種流码,UIImageView只有一種
    • 通過往UIView中放入imageViewlabel設置圖片和文本;而按鈕自帶的圖片和文本分別是imageViewtitleLabel
    • 調(diào)整內(nèi)部子控件的frame延刘,詳見“按鈕布局”

九宮格布局

[圖片上傳失敗...(image-d148cc-1511343696229)]

// 每行最多顯示數(shù)量
// maxNumPerRow = 3則是上圖的九宮格漫试;也可以不為3
#define maxNumPerRow 10

/** 計算位置 */
-(CGRect)calculateFrame
{
    /** 子控件數(shù)量 */
    NSInteger count = self.view.subviews.count;

    /** 計算行、列標 */
    NSInteger rowIndex = count / maxNumPerRow;
    NSInteger colIndex = count % maxNumPerRow;

    /** 設置間隔 */
    CGFloat marginX = 20;
    CGFloat marginY = 20;

    /** 計算控件的寬高 */
    CGFloat viewW = (self.view.frame.size.width - marginX * (maxNumPerRow - 1)) / maxNumPerRow;
    CGFloat viewH = viewW;

    /** 計算控件X,Y */
    CGFloat viewX = (viewW + marginX) *colIndex;
    CGFloat viewY = (viewH + marginY) *rowIndex;

    return CGRectMake(viewX, viewY, viewW, viewH);
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碘赖,一起剝皮案震驚了整個濱河市驾荣,隨后出現(xiàn)的幾起案子外构,更是在濱河造成了極大的恐慌,老刑警劉巖播掷,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件审编,死亡現(xiàn)場離奇詭異,居然都是意外死亡歧匈,警方通過查閱死者的電腦和手機垒酬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來件炉,“玉大人勘究,你說我怎么就攤上這事≌迕幔” “怎么了口糕?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長磕蛇。 經(jīng)常有香客問我景描,道長,這世上最難降的妖魔是什么秀撇? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任超棺,我火速辦了婚禮,結(jié)果婚禮上呵燕,老公的妹妹穿的比我還像新娘说搅。我一直安慰自己,他們只是感情好虏等,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著适肠,像睡著了一般霍衫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侯养,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天敦跌,我揣著相機與錄音,去河邊找鬼逛揩。 笑死柠傍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的辩稽。 我是一名探鬼主播惧笛,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逞泄!你這毒婦竟也來了患整?” 一聲冷哼從身側(cè)響起拜效,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎各谚,沒想到半個月后紧憾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡昌渤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年赴穗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膀息。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡般眉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出履婉,到底是詐尸還是另有隱情煤篙,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布毁腿,位于F島的核電站辑奈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏已烤。R本人自食惡果不足惜鸠窗,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胯究。 院中可真熱鬧稍计,春花似錦、人聲如沸裕循。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剥哑。三九已至硅则,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間株婴,已是汗流浹背怎虫。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留困介,地道東北人大审。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像座哩,于是被迫代替她去往敵國和親徒扶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 前言:UI控件整理之UIButton 一根穷、顯示圖片(復選框) UIButton *button = [UIButt...
    心如止水的魚閱讀 280評論 0 0
  • UIButton內(nèi)部文本和圖片的布局是我們?nèi)粘4a中酷愧,不可缺少的部分驾诈,按鈕默認左邊圖片右邊文本,那要實現(xiàn)左邊文本溶浴,...
    Lsx_f閱讀 1,086評論 1 2
  • 一個UIButton的實例變量乍迄, 使一個按鈕(button)在觸摸屏上生效。一個按鈕監(jiān)聽觸摸事件士败,當被點擊時闯两,給目...
    wushuputi閱讀 1,509評論 0 1
  • UIVIew: 一、UIView的概念: UIView表示屏幕上的一塊矩形區(qū)域谅将,它在App中占有絕對重要的地位漾狼,因...
    曉明兒閱讀 1,712評論 0 1
  • 文/韓大爺?shù)碾s貨鋪 1 昨天一位讀者朋友發(fā)私信提醒我:“韓大爺隅熙,有人在評論區(qū)里罵你稽煤。” 我一聽囚戚,大喜過望酵熙。 入駐簡...
    韓大爺?shù)碾s貨鋪閱讀 11,209評論 195 402