前言:
這是一個比較容易而且很常用的場景需求,但還是要總結一下,目的是要規范化,其中還是有很多細節的地方
這里的標題欄是指:包含多個標題按鈕的view
自問自答:
1.為什么要用代碼創建,而不用xib創建呢?
這里需要先搞清楚兩點:
? ? ? ? ?1.1 什么時候用xib不用代碼描述?
如果一個控件里面包含復雜的子控件,這里的復雜指的是:控件種類,位置,內容不同,用xib描述
? ? ? ? ?1.2 什么時候用代碼不用xib描述?
如果包含結構簡單的子控件,這里的簡單指的是:種類相同,位置排列有規律,內容相似,用代碼描述,不是說不可以用xib,而是不需要用,可總結為:一個控件中包含多個相似的子控件
2.創建控件的結構
先在viewDidLoad中調用方法創建標題欄控件,[self setupTitlesView],創建標題的方法setupTitleButtons應該放在setupTitlesView中調用,這樣的結構是合理的,因為是屬于它的子控件,而不是并列的放在viewDidLoad中
總結為:子控件的創建方法調用放在創建父控件的方法內部,創建好父控件,緊接著創建子控件
3.多個按鈕的創建過程及標題的顯示
3.1
必然是用for循環,創建好之后,先addSubView,然后再設置按鈕的frame和標題屬性,以前認為都設置好了,再加到父控件上才是合理的,但是實際上這樣的認識是錯誤的,子控件對象的屬性可以在任何時刻設置,無論是在addSub前還是addSub后,現在覺的addSub后感覺上更好些,先加上去,再調整自身屬性
3.2
frame的設置注意:以前經常直接在里面寫上了寬度的計算過程,這里要注意提成變量,并且放倒for外面,因為放倒for里面,不停創建,不停銷毀,多消耗資源,frame里面如果有值,都用變量描述
-(void)setupTitleButtons
{
NSArray *titles = @[@"11",@"22",@"33",@"44",@"55"];
NSUInteger count = titles.count;
CGFloat titleButtonW = self.titlesView.bt_width / count;
CGFloat titleButtonH = self.titlesView.bt_height;
for (int i = 0; i < count; i++) {
UIButton *titleButton = [[UIButton alloc] init];
[titleButton addTarget:self action:@selector(titleButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.titlesView addSubview:titleButton];
//frame
titleButton.frame = CGRectMake(i * titleButtonW, 0, titleButtonW, titleButtonH);
//文字
[titleButton setTitle:titles[i] forState:UIControlStateNormal];
}
}