1

在阅读 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 仅设置了约束,那么在此之前是否还有其他地方知道它的边界?

很抱歉所有问题,但它们似乎都有关联。谢谢你的样子。

4

1 回答 1

1

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

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

于 2013-02-03T22:22:55.213 回答