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);
    }
}

 

 

 

posted @ 2014-04-15 20:03  W.Sir  阅读(754)  评论(0)    收藏  举报