UIView的边界大小与框架大小

3

一个UIView的边界大小是否可以与其所包含的frame大小不同?

每当我设置它们中的任何一个,我都会注意到两者都会改变,而且它们始终保持同步。是否存在这样一个特殊情况,两者大小不同步的情况?

4个回答

5

是的,例如,一个变换后(如旋转)的视图具有不同(且无用)的帧大小。

帧仅仅是一种便利,如果必须的话,您完全可以没有它;边界大小和中心点共同准确而始终地描述了视图的位置和大小。


你可能想要阅读我关于这个主题的书,从这里开始:http://www.apeth.com/iOSBook/ch14.html#_frame - matt
我不会说变换后的框架是“没用”的。如果你想要知道旋转视图所占区域,以便父视图可以根据此进行布局,则需要使用框架。 - CIFilter

3

是的,请参考以下关于frame和bounds的简单区别:

视图的frame是一个矩形,相对于其所在的父视图表达为位置(x,y)和大小(宽度,高度)。

视图的bounds是一个矩形,相对于其自身的坐标系表达为位置(x,y)和大小(宽度,高度)。


边界不总是具有原点为(0,0)。 - Aaron Brager

0

bounds "描述视图在其自己的坐标系中的位置和大小"。

frame "定义了视图在其父视图的坐标系中的原点和尺寸"。

因此,对于使用不同坐标系的任何视图,这两个应该有所不同。关键是:

但是,如果 transform 属性包含非恒等变换,则 frame 属性的值未定义,不应进行修改。在这种情况下,您可以使用 center 属性重新定位视图,并使用 bounds 属性调整大小。

这是苹果提供给您的一个示例,说明什么时候 frame 的定义与 bounds 没有可预测的关系:每当您设置了非恒等变换时。

(所有引用的来源都是 UIView 文档


0

它们是不同的。

假设我有一个标签:

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)

请注意,它自己的边界仍然保持不变,而框架已经改变(高度从20增加到40,y位置向上移动10以补偿增加的20,以保持居中)。
这与其他答案/文档所说的相符。两者都不是无用的,根据您的需求使用它们。
虽然晚了7年才参加派对,但希望这仍然能帮助其他人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接