Ios 编程自动布局、约束和UIView运行时

Ios 编程自动布局、约束和UIView运行时,ios,uiview,constraints,autolayout,Ios,Uiview,Constraints,Autolayout,在阅读苹果公司的《视图编程指南》时,很明显,他们并没有对其进行更新,以消除限制。有几个问题: 这里的许多帖子都谈到在初始化新的UIView或将其设置为CGRectZero或其他等效项时不使用-initWithFrame。那你怎么处理呢 -(id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self){ //Set up rounded rectangle ivar C

在阅读苹果公司的《视图编程指南》时,很明显,他们并没有对其进行更新,以消除限制。有几个问题:

  • 这里的许多帖子都谈到在初始化新的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并立即设置约束,但没有立即设置框架)。此代码集的帧=(0,0,0,0),因为尚未计算约束

    如果我们不把这个代码放在init中,我们会把它放在哪里?另外,我认为在init中初始化视图中所需的所有内容是一种很好的做法

    所以这就引出了一个问题

  • 在运行时循环中何时调用is-updateConstraints,视图何时使用这些约束计算其边界?我注意到视图在布局子视图之后才知道它的边界是什么。在此之前,如果UIView只设置了约束,它是否还知道它的边界


  • 对所有的问题感到抱歉,但它们似乎都有点关联。谢谢您的外观。

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


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

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


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

    好的,这是有道理的。我想我想说的是,有时候你需要边界信息,而使用autolayout,你不可能一直都能得到这些信息。事实上,似乎只有很少几次。我真的想知道系统在什么时候计算边界?我不确定系统何时在自动布局下计算边界。但是,当您对视图进行子类化时,这并不重要。您只知道在调用
    drawRect:
    时,需要显示当前边界(或仅显示dirtyRect)。如果边界更改对您的实现非常重要,请重写
    setBounds
    。好的,这很有意义。我想我想说的是,有时候你需要边界信息,而使用autolayout,你不可能一直都能得到这些信息。事实上,似乎只有很少几次。我真的想知道系统在什么时候计算边界?我不确定系统何时在自动布局下计算边界。但是,当您对视图进行子类化时,这并不重要。您只知道在调用
    drawRect:
    时,需要显示当前边界(或仅显示dirtyRect)。如果边界更改对实现非常重要,请重写
    setBounds