老生常谈:frame和Bounds的区别

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

效果如下:

enter image description here

这幅图的框架和边界是完全一样的。让我们看一个它们不同的例子。

Frame
    origin = (40, 60)  // That is, x=40 and y=60
    width = 80
    height = 130

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

enter image description here

使用场合

因为frame与视图在父视图中的位置相关,所以当您向外进行更改时,比如更改其宽度或查找视图与父视图顶部之间的距离时,就会使用它。

当您向内进行更改时,如绘制内容或在视图中安排子视图时,请使用bounds。如果你对视图做了一些变形,也可以使用bounds来获得视图的大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值