阻止 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;
}
}
我有一个使用 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;
}
}