- 繼承自UIControl
- 非常重要的UI控件---UIButton包归,俗稱“按鈕”
- 一般情況下,點擊某個控件后,會做出相應反應的都是按鈕
- 按鈕的功能比較多大年,既能顯示文字,又能顯示圖片玉雾,還能隨時調(diào)整內(nèi)部圖片和文字的位置
UIButton的狀態(tài)
- 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中放入
imageView
和label
設置圖片和文本;而按鈕自帶的圖片和文本分別是imageView
和titleLabel
- 調(diào)整內(nèi)部子控件的frame延刘,詳見“按鈕布局”
- 按鈕是分狀態(tài)顯示的竟坛,所以圖片和文本等要
九宮格布局
[圖片上傳失敗...(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);
}