iOS-开发中遇到的自定义控件布局的问题
在做一个自定义UITableView的UITableViewHeaderFooterView类型的控件时,遇到一个问题:明明已经将UITableViewHeaderFooterView里的子空间的Frame设置了,可是在程序运行时,表头的子控件的显示就是不正确。后来找到了原因,因为我在UITableView的Init方法设置的。
那这样就存在一个问题:
//1.设置按钮的frame self.btn.frame = self.bounds;
上面是自定义表头空间里的UIButton控件的Frame,而在init里执行上面的代码,self.bounds 得到的frame全部是0.也就是说,在控件的初始化是,获得的Frame是不准确的。
要解决这个问题,就应该在能获取Frame的时候来进行设置子控件的Frame。我的解决方案是,在系统提供的两个方法进行设置,例如
1.- (void)layoutSubviews
// 该方法在控件的frame被改变的时候就会调用
// 该方法一般用于调整子控件的位置。 例如:
- (void)layoutSubviews { #warning 切记重写layoutSubviews方法一定要调用父类的layoutSubviews [super layoutSubviews]; // 1.设置按钮的frame self.btn.frame = self.bounds; // 2.设置label的frame CGFloat padding = 20;// 间隙 CGFloat labelY = 0; CGFloat labelH = self.bounds.size.height; CGFloat labelW = 150; CGFloat labelX = self.bounds.size.width - padding - labelW; self.label.frame = CGRectMake(labelX, labelY, labelW, labelH); }
该方法还有一个注意点就是,一定要执行:[super layoutSubviews]; 这个方法在Xcode5之前,如果缺少就会出错。虽然在Xcode6之后不会,但是我还是建议
执行[super layoutSubviews]。
2.- (void)didMoveToSuperview
当一个控件被添加到其它视图上的时候会调用以下方法,代码例如:
// 已经被添加到父视图上的时候会调用 - (void)didMoveToSuperview { // 在这个方法中就快要拿到最新的被添加到tableview上的头部视图修改它的图片 if (self.qqGroup.isOpen) { self.btn.imageView.transform = CGAffineTransformMakeRotation(M_PI_2); } }

浙公网安备 33010602011771号