self.frame 与 self.layer.bounds(在 iOS 中)

Posted

技术标签:

【中文标题】self.frame 与 self.layer.bounds(在 iOS 中)【英文标题】:self.frame vs self.layer.bounds (in iOS) 【发布时间】:2012-07-26 14:16:50 【问题描述】:

我有一个自定义的UIView 设置为我的UIViewController's rootView。我以横向模式启动应用程序,但我在 rootView 的边界方面遇到了一些问题。经过一些调试后,我只是使用 Xcode 的控制台来检查发生了什么。 ITCustomView's 类是我的 UIViewController's rootView,它是 UIView's 子类。所以我做了:

po self

结果:

ITCustomView: 0x15af30; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x15b070>>

然后我做了:

po [self layer]

结果:

CALayer:0x15b070; position = CGPoint (394 512); bounds = CGRect (0 0; 1024 748); delegate = <ITCustomView: 0x15af30; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x15b070>>; sublayers = (<CALayer: 0x15a390>, <CALayer: 0x15b2c0>, <CALayer: 0xce2f6a0>); transform = CATransform3D (0 -1 0 0; 1 0 0 0; 0 0 1 0; 0 0 0 1); backgroundColor = <CGColor 0x15b040> [<CGColorSpace 0x1356e0> (kCGColorSpaceDeviceRGB)] ( 0.818317 0.818317 0.818317 1 )

所以我的问题真的是:

    在横向中不应该根据方向更改框架吗?

    这些变换(方向变化)是否仅在图层上“可见”?

    我是否应该使用self.layer.bounds 而不是self.frame 开始检查边界(以了解UIView's 子类何时结束)?

    由于可能的转换,始终使用self.layer.bounds 是否更安全(又名:最佳实践)?

我觉得现在才注意到这种行为很奇怪(也有点为自己感到羞耻)。

【问题讨论】:

【参考方案1】:

frame 仅从超级视图的角度来看才真正相关,因为它在超级视图的坐标系中表示。

对于任何内部目的,应使用视图的bounds rect。

所以,对于您的子问题:

    不,改为检查边界。 不,改为检查边界。 不,改为检查边界。 不,改为检查边界。

你不需要检查图层的边界,你可以使用视图的边界。所以,你的问题应该真正标题为 self.frame vs self.bounds,而且 bounds 通常会获胜。

【讨论】:

以上是关于self.frame 与 self.layer.bounds(在 iOS 中)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 self.frame.maxY 没有显示在 iPad 的屏幕上

self.view.frame 在横向模式下意外更改大小

frame 与 bounds的区别

UIButton 放置和约束

基于tkinter的简易加减乘除计算器

在 iOS 7 中动态调整标签大小