Ios 停止UILabel文本更改以触发自动布局
我有一个用AutoLayout初始化的ViewController视图。作为此视图的一部分,我还有一个UIImageView,其中包含一些约束条件—0顶部、0左侧、0右侧、300底部 在某些时候,我会执行一系列动画,其中一些会放大并更改图像的中心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,正如我所注意到的,它将触发自动布局,
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;
}
}