是的,这是可以做到的。
如果您设置视图的translatesAutoresizingMaskIntoConstraints = YES
,则调用setFrame:
会在运行时根据视图的 current 自动转换为布局约束autoresizingMask
。这使您可以混合基于框架的布局和基于约束的布局。
例如,您可以使用 Auto Layout 来定义视图的所有子视图的布局,但仍然调用setFrame:
来设置视图本身的大小和位置。从您的角度来看,您正在使用自动布局和直接框架操作混合进行布局。但系统实际上是使用约束来处理所有事情。
但是,使用translatesAutoresizingMaskIntoConstraints
.
当你这样做时,你仍然需要确保这些自动约束可以满足你的其余约束。
因此,例如,假设已经存在确定视图大小和位置的约束,然后您还设置translatesAutoresizingMaskIntoConstraints = YES
并调用了setFrame:
. 调用setFrame:
将在视图上生成新的约束,这可能会与已经存在的约束冲突。
(事实上,这个错误经常发生。如果您曾经看到一条日志消息抱怨约束冲突,并且其中一个约束是 a NSAutoresizingMaskLayoutConstraint
,那么您看到的是与自动约束的冲突。这是一个简单的错误,因为translatesAutoresizingMaskIntoConstraints = YES
是默认值,因此如果您在代码中配置约束,如果您不想要这些自动约束,则需要记住将其关闭。)
相比之下,再次假设已经存在确定视图大小和位置的约束,但是您translatesAutoresizingMaskIntoConstraints = NO
在调用setFrame:
. 在这种情况下,您的setFrame:
调用不会产生新的约束,因此单独的约束之间不会有冲突。但是,在这种情况下,约束和您设置的帧值之间仍然存在“冲突” 。下次调用 Auto Layout 时,它会看到视图上已经存在的约束,计算它们需要的框架值,并将框架设置为本身所需的值,从而破坏您手动设置的值。
有关更多详细信息,请查看 Apple 的Cocoa 自动布局指南中的“采用自动布局”部分。