是否在更改视图大小时调用layoutSubviews?

时间:2011-09-04 00:15:20

标签: ios cocoa-touch uiview

在我的印象中,使用autoresizesSubviews = YES,每次更改视图的大小时都应调用layoutSubviews。但我发现我的观点并非如此。我的期望是错的吗?

4 个答案:

答案 0 :(得分:6)

根据Apple的消息来源,

应该在视图大小发生变化时调用

“ - [UIView layoutSubviews]。”


他们还从iOS的View Programming Guide中引用了我这个:

“每当视图大小发生变化时,UIKit会应用该视图子视图的自动调整行为,然后调用视图的layoutSubviews方法让它进行手动更改。您可以在自定义视图中实现layoutSubviews方法自动化行为本身并不能产生你想要的结果。“


此时,您最好的举措是创建一个小型示例项目,其中layoutSubviews未使用BugReporter调用(或发送现有项目)文件与Apple的错误,并包含该示例项目你的错误。

答案 1 :(得分:1)

如果您在调整视图大小时需要执行某些操作,则还可以为您的班级覆盖setBounds:setFrame:以确保其发生。它看起来像这样

-(void)setBounds:(GCRect newBounds) {
    // let the UIKit do what it would normally do
    [super setBounds:newBounds];

    // set the flag to tell UIKit that you'd like your layoutSubviews called
    [self setNeedsLayout];
}

-(void)setFrame:(CGRect newFrame) {
    // let the UIKit do what it would normally do
    [super setFrame:newFrame];

    // set the flag to tell UIKit that you'd like your layoutSubviews called
    [self setNeedsLayout];
}


我有时会(暂时)覆盖这些方法的另一个原因是我可以在调试器中停下来看看它们何时被调用以及通过什么代码。

答案 2 :(得分:0)

根据我的理解,当视图的边界发生变化时,会调用layoutSubviews。这意味着如果其位置在其超级视图中更改(但不是其大小),则layoutSubviews将不会更改(因为边界中的原点位于视图的坐标系中 - 因此它几乎总是0,0)。简而言之,只有大小的改变才会导致这种情况发生。

答案 3 :(得分:-1)

每当您想手动调整视图大小并自动调整大小时,请调用 layoutSubViews 方法

-(void)layoutSubviews
{

    [super layoutSubviews];

    CGRect contentRect = self.contentView.bounds;

    CGFloat boundsX = contentRect.origin.x;

    CGRect frame,itemlabelframe,statuslabelframe;

    frame= CGRectMake(boundsX+1 ,0, 97, 50);

    itemlabelframe=CGRectMake(boundsX+100, 0, 155, 50);

    statuslabelframe=CGRectMake(boundsX+257, 0, 50, 50);
    ItemDescButton.frame=itemlabelframe;


    priorityButton.frame = frame;
    statusButton.frame=statuslabelframe;
    //    ItemDescLabel.frame=itemlabelframe;
    //    statusLabel.frame=statuslabelframe;

}