【问题标题】:Stop UILabel text change from triggering auto layout [closed]阻止 UILabel 文本更改触发自动布局[关闭]
【发布时间】:2021-02-04 02:35:44
【问题描述】:

我有一个使用 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 触发器,则重构使图像居中的动画也是基于约束的一种解决方案。

【问题讨论】:

  • self.label.translatesAutoresizingMaskIntoConstraints = NO ?
  • 我在设置文本之前确实尝试过。不幸的是,它并没有解决问题
  • 如果你使用自动布局,你不应该直接修改视图的框架,否则当自动布局再次运行时它会被重置。你应该做的是改变你的图像视图的约束而不是它的框架
  • 是的,我在帖子中提到过。我最近读了很多,我计划在某个时候这样做,但是有很多重构要做,我正在寻找一种解决方法
  • 也许将宽度设置为一个很大的数字 - 然后宽度是固定的,会适应变化,也许你不会触发

标签: ios objective-c swift autolayout


【解决方案1】:

编辑

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

使用约束

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

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

// 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;
    }
}

【讨论】:

  • 不幸的是,这也不起作用。我想唯一的方法是重构它并使用约束。
  • 好吧,事情就是这样——祝你好运。我实际上认为您需要检查动画。如果它正确地更改了约束,那么这应该不是问题。动画后约束不应该重置?
  • @BogdanDaniel - 看看我在建议中添加的另一种方法。它可能会起作用,并且可以节省您重新制作动画的工作量。它基于子类化UILabel,并在我编辑的答案中进行了更详细的讨论。
  • 谢谢。最新的编辑效果很好。你为我节省了很多重构和重新思考动画的时间。
  • 很好,我很高兴 - 感谢您让我知道。该子类功能强大,是一个不错的选择。
猜你喜欢
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2011-10-31
  • 2013-06-14
相关资源
最近更新 更多