gpt4 book ai didi

ios - LayoutSubviews 问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:45:55 27 4
gpt4 key购买 nike

对于 Xcode 6 和 iOS8,我的应用程序出现了奇怪的问题。问题出在我用 xib 文件制作的自定义 UITableViewCell 中。在 iOS8 模拟器上,layoutSubviews 方法被无限次调用。就像它在“while(1)”中一样,或者一次又一次地调用自己。这是布局 subview 方法:

- (void)layoutSubviews
{
[super layoutSubviews];

UIEdgeInsets insets = UIEdgeInsetsMake(1, 1, 1, 1);
self.contentView.frame = UIEdgeInsetsInsetRect(UIEdgeInsetsInsetRect(self.bounds, insets), insets);

NSLog(@"Layout");
}

当我删除 self.contentView.frame 行时,一切正常。此外,如果我使 self.contentView.translatesAutoresizingMaskIntoConstraints = NO,递归停止,但它打破了我所有的约束。此问题仅在 iOS8 中发生,同样的方法在 iOS6 和 iOS7 中都可以正常工作。

为什么我不能在这个方法中改变 self.contentView.frame?是否有关于它的新文档?

最佳答案

我在我的一个项目中看到了类似的行为,这是我根据观察认为正在发生的事情。在 iOS7 中,如果您使用自动布局然后修改 View 的框架,则不会调用 layoutSubviews。因此,您的框架更改将被应用并且一切正常。在 iOS8 中,UIView 在内部发生了一些变化。现在每次框架改变时都会调用 layoutSubviews。

因此,如果我们查看您的代码,我认为正在发生的事情是调用了 layoutSubviews。您修改框架,这会再次触发 layoutSubviews。当 [super layoutSubviews] 被调用时,它会重新应用您的原始约束,这会重置您之前所做的帧调整。然后你再次更改框架,这会触发另一个 layoutSubviews。这无限重复。

可能的解决方案:

Don't modify the frame, modify the constraints instead.

您可以为约束创建 IBOutlets 并修改它们以获得您想要的新框架。这样一来,当重新应用约束时,它们就是您所做的修改后的约束,并且不会发生无限循环。

您可以在以下位置获得更多信息:

When is layoutSubviews called?

关于ios - LayoutSubviews 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24625348/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com