阻止 UILabel 文本更改触发自动布局

Stop UILabel text change from triggering auto layout

我有一个使用 AutoLayout 初始化的 ViewController 视图。作为此视图的一部分,我还有一个带有一些约束的 UIImageView - 0 顶部、0 左侧、0 右侧、300 底部

有时,我会执行一系列动画,其中一些会放大并更改图像的中心

self.imageView.center = CGPointMake(w*s/widthDivider, h-h*s/heightDivider);

一切看起来都很好,直到我不得不更改页面上的一些 UILabel 文本,正如我注意到的那样,它会触发 AutoLayout,它将我的缩放图像放回其初始约束并打破我的布局。

self.label.text = [NSString stringWithFormat:@"%d", 23];

有什么方法可以在更改上述标签的文本时停止 AutoLayout 触发器?

重构使图像居中的动画也基于约束将是一个解决方案,如果我无法在文本更改时停止 AutoLayout 触发器,我必须在某个时候采取这种解决方案。

编辑

我添加了子类的想法。请注意,我能够使用所有这些方法来防止自动布局触发。

使用约束

我认为这是一个设计问题,您需要进行重构。下面只是一些尝试的想法。并不是真正阻止自动布局,而是试图阻止标签触发它。

动画完成后,如果您删除或停用所有标签的约束会怎样。所以做一些像

// Remove all constraints
[label removeConstraints:label.constraints];

// Deactivate constraints
for ( NSLayoutConstraint * c in label.constraints )
{
    c.active = NO;
}

这些将阻止约束更新并且可能完全阻止自动布局触发。

子类化

这是我后来加的。它还会阻止自动布局,但您的情况似乎又有所不同。总之,这个怎么样。子类 UILabel 并覆盖其 invalidateIntrinsicContentSize 消息,如下所示。 self.stopLayout 是一个 BOOL,当我不想再触发自动布局时,我将其设置为 YES,它在这一侧运行良好。

- ( void ) invalidateIntrinsicContentSize
{
    if ( ! self.stopLayout )
    {
        super.invalidateIntrinsicContentSize;
    }
}