首页 > 解决方案 > 阻止 UILabel 文本更改触发自动布局

问题描述

我有一个使用 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 触发器,那么重构使图像居中的动画也基于约束将是我必须在某个点采取的解决方案。

标签: iosobjective-cswiftautolayout

解决方案


编辑

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

使用约束

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

动画完成后,如果您删除或停用所有标签的约束会怎样。所以做类似的事情

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

或者

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

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

子类化

我后来添加了这个。它还可以防止自动布局,但您的情况似乎又有所不同。无论如何,这个怎么样。子类化UILabel并覆盖其invalidateIntrinsicContentSize消息,如下所示。当我不再想触发自动布局时,我设置了它,它在这方面工作得self.stopLayout很好BOOLYES

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

推荐阅读