UIView及NSView等控件常有的frame和bounds有何不同呢?
UIView的bounds是一个矩形,它表示在自身坐标系中的位置(x、y)和大小(width、height)。
UIView的frame也是一个矩形,它表示该视图在父视图坐标系中的位置(x、y)和大小(width、height)。
因此,假设现在有view大小为100x100,在父视图的位置为(25,25),如下代码打印出bounds和frame:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"bounds.origin.x: %f", label.bounds.origin.x);
NSLog(@"bounds.origin.y: %f", label.bounds.origin.y);
NSLog(@"bounds.size.width: %f", label.bounds.size.width);
NSLog(@"bounds.size.height: %f", label.bounds.size.height);
NSLog(@"frame.origin.x: %f", label.frame.origin.x);
NSLog(@"frame.origin.y: %f", label.frame.origin.y);
NSLog(@"frame.size.width: %f", label.frame.size.width);
NSLog(@"frame.size.height: %f", label.frame.size.height);
}
输出结果如下:
bounds.origin.x: 0
bounds.origin.y: 0
bounds.size.width: 100
bounds.size.height: 100
frame.origin.x: 25
frame.origin.y: 25
frame.size.width: 100
frame.size.height: 100
我们可以看到,在这两种情况下,视图的bounds还是frame中宽度和高度都是相同的,不同的是视图的x、y的位置。在bounds的情况下,x和y坐标是(0,0)因为这些坐标相对于视图本身。然而,frame的x和y坐标相对于视图在父视图中的位置(之前我们说过是在(25,25))。
图文并茂
当bounds和frame为如下值时:
Frame
origin = (0, 0)
width = 80
height = 130
Bounds
origin = (0, 0)
width = 80
height = 130
效果如下:
这幅图的框架和边界是完全一样的。让我们看一个它们不同的例子。
Frame
origin = (40, 60) // That is, x=40 and y=60
width = 80
height = 130
Bounds
origin = (0, 0)
width = 80
height = 130
使用场合
因为frame与视图在父视图中的位置相关,所以当您向外进行更改时,比如更改其宽度或查找视图与父视图顶部之间的距离时,就会使用它。
当您向内进行更改时,如绘制内容或在视图中安排子视图时,请使用bounds。如果你对视图做了一些变形,也可以使用bounds来获得视图的大小。