Ios 停止UILabel文本更改以触发自动布局

Ios 停止UILabel文本更改以触发自动布局,ios,objective-c,swift,autolayout,Ios,Objective C,Swift,Autolayout,我有一个用AutoLayout初始化的ViewController视图。作为此视图的一部分,我还有一个UIImageView,其中包含一些约束条件—0顶部、0左侧、0右侧、300底部 在某些时候,我会执行一系列动画,其中一些会放大并更改图像的中心 self.imageView.center = CGPointMake(w*s/widthDivider, h-h*s/heightDivider); 一切看起来都很好,直到我不得不更改页面上的一些UILabel,正如我所注意到的,它将触发自动布局,

我有一个用AutoLayout初始化的ViewController视图。作为此视图的一部分,我还有一个UIImageView,其中包含一些约束条件—0顶部、0左侧、0右侧、300底部

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

self.imageView.center = CGPointMake(w*s/widthDivider, h-h*s/heightDivider);
一切看起来都很好,直到我不得不更改页面上的一些
UILabel
,正如我所注意到的,它将触发自动布局,将缩放的图像放回初始约束,并打破布局

self.label.text = [NSString stringWithFormat:@"%d", 23];
在更改上述标签的文本时,是否有任何方法可以停止AutoLayout触发器

如果无法在文本更改时停止自动布局触发器,则在某一点上,重构以约束为中心的动画将是我必须采取的解决方案。

EDIT

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

使用约束

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

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

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

这将阻止约束更新,并可能阻止autolayout完全触发

子类化

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

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

self.label.translatesAutoresizingMaskIntoConstraints=NO
?在设置文本之前,我确实尝试过。不幸的是,这并不能解决这个问题。如果使用autolayout,则不应直接修改视图的框架,否则当autolayout再次运行时,框架将被重置。您应该做的是更改imageview的约束,而不是它的框架是的,我在文章中提到了这一点。我最近读了很多关于它的书,我计划在某个时候这样做,但是有相当多的重构要做,我正在寻找一个解决办法也许把宽度设置为一个更大的数字-然后宽度是固定的,将适应变化,也许你不会触发不幸的是,这也不起作用。我想唯一的方法就是重构它并使用约束。哦,好吧,就是这样-祝你好运。实际上我认为你需要检查动画。如果它正确地更改了约束,那么这应该不是问题。限制不应该在anim?@BogdanDaniel之后重置-看看我在建议中添加的另一种方法。它可能会工作,并节省您重新制作动画的工作量。它基于子类化
UILabel
,在我编辑的答案中有更详细的讨论。谢谢。最新的编辑效果很好。你为我节省了很多重构和重新思考动画的时间。很好,我很高兴-谢谢你让我知道。该子类功能强大,是一个很好的选择。
- ( void ) invalidateIntrinsicContentSize
{
    if ( ! self.stopLayout )
    {
        super.invalidateIntrinsicContentSize;
    }
}