【问题标题】:How to modify constraints right after they are set from storyboard?从情节提要设置约束后如何立即修改约束?
【发布时间】:2015-01-29 07:58:47
【问题描述】:

我需要知道如何在从情节提要或 nib 加载约束后修改它们。

例如,在故事板中,我横向放置了 5 个视图。在代码中,当视图控制器加载数据时,此视图的位置基于数据。那么有没有可以添加到控制器的方法?我认为 awakeFromNib 会起作用,但事实并非如此。或者也许我用错了。

谢谢你帮助我。

【问题讨论】:

    标签: ios objective-c storyboard autolayout nslayoutconstraint


    【解决方案1】:

    我以为是这个地方:initWithCoder

    或者

    数据进来后可以调用:

     [self setNeedsUpdateConstraints];
    

    然后你需要实现

     - ( void ) updateConstraints
    

    但您也可以只在代码中创建所有约束,然后只添加特定数据所需的约束。

    我要做的是:(可能是代码拼写错误,但输入的是 xCode 补全;))

    @interface ...
    @property (assign, nonatomic) BOOL update;
    @end
    
    - ( void ) whatever {
        _update = YES;
        [self setNeedsUpdateConstraints];
    }
    
    - ( void ) updateConstraints {
        [super updateConstraints];
    
        if( _update ) {
            _update = NO;
    
           ....CONSTRAINTS...
        }
    }
    

    【讨论】:

    • Init with coder 是在 Storyboard 中创建的视图的指定初始化程序。 (对于删除评论的人)
    • initWithCoder 不行,我已经试过了。有一个方法layoutSubviews,但是这个一直被调用,我只需要第一次修改。
    • 你不应该使用 layoutSubviews 而是使用我的第二种方式。 updateConstraints 是为您的问题而设计的。这样做一次,只需用 if 保护它。
    • if 语句是什么意思?所以我创建了一个类似于 initialUpdate 的 bool,它会在 updateConstraints 方法中告诉我,当这个 bool 为 YES 时,它应该更新,否则不应该更新。
    • 更新答案@KlemenZagar 因为您只想在获得数据后进行约束(异步?)并且可以多次调用 updateConstraints