一个UIView的边界大小是否可以与其所包含的frame大小不同?
每当我设置它们中的任何一个,我都会注意到两者都会改变,而且它们始终保持同步。是否存在这样一个特殊情况,两者大小不同步的情况?
一个UIView的边界大小是否可以与其所包含的frame大小不同?
每当我设置它们中的任何一个,我都会注意到两者都会改变,而且它们始终保持同步。是否存在这样一个特殊情况,两者大小不同步的情况?
是的,例如,一个变换后(如旋转)的视图具有不同(且无用)的帧大小。
帧仅仅是一种便利,如果必须的话,您完全可以没有它;边界大小和中心点共同准确而始终地描述了视图的位置和大小。
是的,请参考以下关于frame和bounds的简单区别:
视图的frame是一个矩形,相对于其所在的父视图表达为位置(x,y)和大小(宽度,高度)。
视图的bounds是一个矩形,相对于其自身的坐标系表达为位置(x,y)和大小(宽度,高度)。
bounds
"描述视图在其自己的坐标系中的位置和大小"。
frame
"定义了视图在其父视图的坐标系中的原点和尺寸"。
因此,对于使用不同坐标系的任何视图,这两个应该有所不同。关键是:
但是,如果 transform 属性包含非恒等变换,则 frame 属性的值未定义,不应进行修改。在这种情况下,您可以使用 center 属性重新定位视图,并使用 bounds 属性调整大小。
这是苹果提供给您的一个示例,说明什么时候 frame
的定义与 bounds
没有可预测的关系:每当您设置了非恒等变换时。
(所有引用的来源都是 UIView 文档)
它们是不同的。
假设我有一个标签:
label.frame = CGRect(x: 0, y: 0, width: 200, height: 20)
它当前的frame和bounds(print(label.frame, label2.bounds)
)如下:
(0.0,0.0,200.0,20.0) (0.0,0.0,200.0,20.0)
注意它们目前是相同的。按顺序显示x位置、y位置、宽度、高度。
现在我将对标签应用一个Y轴比例为2:
label.transform = CGAffineTransform(scaleX: 1, y: 2)
它的新frame和bounds如下:
(0.0,-10.0,200.0,40.0) (0.0,0.0,200.0,20.0)