gpt4 book ai didi

iphone - 我可以在同一 View 上使用 setFrame 和自动布局吗?

转载 作者:行者123 更新时间:2023-12-03 18:09:25 24 4
gpt4 key购买 nike

我想为所有按钮添加填充,因此我对 UIButton 进行了子类化,除其他更改外,我想通过使用 setFrame 方法添加固定填充。除了 setFrame 之外,一切正常。我检查了一下,发现如果我取消选中该 View 上的“使用自动布局”,那么我可以使用 setFrame,并且它可以工作。有没有解决的办法?我真的很想使用自动布局,因为它有助于使应用程序在 iPhone 5 和更早的设备上看起来都不错。但我也想在我的子类中使用 setFrame,让我的生活更轻松一些。

总而言之,我的问题是:我可以使用自动布局并以编程方式调整 UIView 的框架吗?

最佳答案

是的,这是可以做到的。

如果您设置 View 的 translatesAutoresizingMaskIntoConstraints = YES ,然后调用setFrame:在运行时根据 View 的当前 autoresizingMask 自动转换为布局约束。这使您可以将基于框架的布局与基于约束的布局混合在一起。

例如,您可以使用自动布局来定义 View 的所有 subview 的布局,但仍然调用 setFrame:设置 View 本身的大小和位置。从您的角度来看,您正在使用自动布局和直接框架操作的组合来进行布局。但系统实际上是使用约束来处理一切的。

但是,使用 translatesAutoresizingMaskIntoConstraints 有一个很大的警告。 .

当您执行此操作时,您仍然需要确保这些自动约束可以满足其余约束

例如,假设已经存在确定 View 大小和位置的约束,然后您设置 translatesAutoresizingMaskIntoConstraints = YES并调用setFrame: 。调用setFrame:将会在 View 上生成新的约束,这可能会与已经存在的约束发生冲突。

(事实上,这个错误经常发生。如果您看到一条日志消息提示约束冲突,并且这些约束之一是 NSAutoresizingMaskLayoutConstraint ,那么您看到的是与自动约束的冲突。这这是一个很容易犯的错误,因为 translatesAutoresizingMaskIntoConstraints = YES 是默认值,因此如果您在代码中配置约束,则需要记住在不需要这些自动约束时将其关闭。)

相反,再次假设已经存在确定 View 大小和位置的约束,但随后您设置 translatesAutoresizingMaskIntoConstraints = NO在您调用 setFrame: 之前。在这种情况下,您的setFrame:调用不会产生新的约束,因此单独的约束之间不会发生冲突。然而,在这种情况下,约束和您设置的框架值之间仍然存在“冲突”。下次调用自动布局时,它将查看 View 上已经存在的约束,计算它们所需的框架值,并将框架设置为所需的值本身,从而破坏您手动设置的值。

有关更多详细信息,请查看 Apple Cocoa Auto Layout Guide 中的“采用自动布局”部分。 .

关于iphone - 我可以在同一 View 上使用 setFrame 和自动布局吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13186908/

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