前言:
这是一个比较容易而且很常用的场景需求,但还是要总结一下,目的是要规范化,其中还是有很多细节的地方
这里的标题栏是指:包含多个标题按钮的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];
}
}