程序化自动布局,约束和UIView运行时

时间:2013-02-03 22:05:38

标签: ios uiview constraints autolayout

在阅读Apple的View Programming Guide时,很明显他们没有更新它的约束。所以有几个问题:

  1. 这里的很多帖子都谈到在初始化新的UIView或将其设置为CGRectZero或某些等效项时不使用-initWithFrame。你会怎么处理这个?:

    -(id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self){
    
        //Set up rounded rectangle ivar
        CGRect frame = [self bounds];
        CGFloat radius = frame.size.height / 2;
        _rectPath = [UIBezierPath bezierPathWithRoundedRect:frame cornerRadius:radius];
        } 
    }
    

    然后将绘图代码放在drawRect:中。我发现没有框架就不能正常启动。 (显然,我正在启动这个UIView并立即设置约束但没有框架立即)。此代码集的frame =(0,0,0,0)因为尚未计算约束。

    如果我们不将此代码放在init中,我们会把它放在哪里?另外,我认为在init中的视图中初始化我们需要的所有东西是个好习惯。

    所以这引出了一个问题......

  2. 在运行时循环中调用-updateConstraints时,视图何时使用这些约束计算它的边界?我注意到在-layoutSubviews之后,视图真的不知道它的界限是什么。在此之前还有另一个地方,UIView知道它的界限,如果只设置了约束吗?

  3. 对所有问题感到抱歉,但他们似乎都有点联系。谢谢你的外表。

1 个答案:

答案 0 :(得分:1)

您的相框问题与自动布局无关。视图大小始终在变化。它几乎从不与对象实例化期间相同。您需要在 drawRect期间创建/计算路径大小以适合当前大小,而不是在您第一次创建视图时。

init期间,您应该设置的唯一对象是您的类的其余部分依赖于特定状态中存在的属性和/或ivars。