UIButton - 按鈕

weixin_34391445發表於2016-03-12

作為 幾乎所有頁面的常客,也稍微寫一點東東,留下一點內容。(UIButton 繼承自 UIControl,下次在研究哦)

基礎建立 與 屬性

// 建立一般使用 類方法,
    self.testButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    
// 設定一些 屬性,並對應幾個狀態
    [self.testButton setTitle:@"點選測試" forState:UIControlStateNormal];
    [self.testButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [self.testButton setTitleShadowColor:[UIColor greenColor] forState:UIControlStateNormal];
    [self.testButton setImage:[UIImage imageNamed:@"jpg_test"] forState:UIControlStateNormal];
    [self.testButton setBackgroundImage:[UIImage imageNamed:@"jpg_test"] forState:UIControlStateHighlighted];
    
// 屬性字串 需要的話看另一篇 Foundation 中的 NSAttributedString 篇。
    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:@"testAttributed" attributes:@{NSForegroundColorAttributeName:[UIColor blueColor],NSUnderlineStyleAttributeName:@(1)}];
    [self.testButton setAttributedTitle:attributedString forState:UIControlStateHighlighted];
    
  • 對應設定的屬性,反過來也可以獲取到屬性內容
    只舉一個例子,其他的返三吧。
// 對應狀態的 title
    NSString *testButtonTitle = [self.testButton titleForState:UIControlStateNormal];

// 當前的 title
    NSString *testButtonCurrentTitle = [self.testButton currentTitle];

狀態 - UIControlState 簡單說明

注意:UIControlState 是 NS_OPTIONS 型別,所以注意下面第四個 比較特殊。在貼圖片,而且會正常-選中 切換是可能會用到哦。

    [self.testButton setTitle:@"正常時" forState:UIControlStateNormal];
    [self.testButton setTitle:@"選中時" forState:UIControlStateSelected];
    [self.testButton setTitle:@"正常 高亮狀態" forState:UIControlStateHighlighted];
    [self.testButton setTitle:@"選中時 高亮狀態" forState:UIControlStateHighlighted | UIControlStateSelected];
    

內容位置調整 - UIEdgeInsets

  • 1 對button 的title 或者 image ,其一設定 UIEdgeInsets 時,比較方便好用。
  • 2 但是,由於 button 帶有 title 和 image 2個屬性,同時存在時,調整這兩個屬性用 UIEdgeInsets 不是很好用。他們2個本身就有一定的調整,而且與image 大小與button大小也有一定關係,推薦使用重繪。
    [self.testButton setTitleEdgeInsets:UIEdgeInsetsMake(10, 20, 30, 40)];
// 簡單調整 title 位置 
// 關於位置調整偏移 檢視 UIKit -  UIGeometry.h 類。

UIEdgeInsets- 重繪

- (CGRect)backgroundRectForBounds:(CGRect)bounds;
- (CGRect)contentRectForBounds:(CGRect)bounds;
- (CGRect)titleRectForContentRect:(CGRect)contentRect;
- (CGRect)imageRectForContentRect:(CGRect)contentRect;

簡單舉例:上面 2/3 是圖片,下面1/3 是文字

- (CGRect)titleRectForContentRect:(CGRect)contentRect {
    return CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds) * 2 / 3);
}

- (CGRect)imageRectForContentRect:(CGRect)contentRect {
    return CGRectMake(0, CGRectGetHeight(self.bounds) * 2 / 3, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds) / 3);
}

其他

    self.testButton.reversesTitleShadowWhenHighlighted = YES;// 文字陰影 高亮時反向
    
    self.testButton.showsTouchWhenHighlighted = YES; // 觸控 有 亮光
    self.testButton.adjustsImageWhenHighlighted = NO; // 圖片 點選 不變灰
    self.testButton.adjustsImageWhenDisabled = NO; // 圖片 失效 不變灰

addTarget:action:為啥木有?? 在 UIControl 類,另講。

相關文章