ios - 阻止 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 触发器,那么重构使图像居中的动画也基于约束将是我必须在某个点采取的解决方案。
解决方案
编辑
我添加了子类的想法。请注意,我能够防止自动布局触发所有这些方法。
使用约束
我认为这是一个设计问题,您需要进行重构。下面只是一些尝试的想法。并没有真正阻止自动布局,而是试图阻止标签触发它。
动画完成后,如果您删除或停用所有标签的约束会怎样。所以做类似的事情
// 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;
}
}
推荐阅读
- python - 我想为这个特定网站中的链接提取 href
- javascript - H3Index在哪个Hexagon?
- rs485 - 特定硬件的 RS485 通信问题
- php - 强类型与弱类型
- python - 如何使用 Python+selenium 单击此选项?
- asp.net-core - 如何将画面嵌入 asp.net core blazor?
- php - laravel 路由从控制器获取自动 ::index。所以 index@index 不存在显示。(检查图像)
- django - 使用 django-translations 在表单中显示所有语言
- node.js - 我无法从 xlsx 文件中读取多行
- docker - 部署为 kubernetes pod 时,容器中的文件丢失