3

viewDidLoad中,我UIView在 100,100 处创建一个大小为 200x200 的对象,然后将其边界更改为具有 -100,-100 的原点。我原以为这会将整个视图移回左上角,或者只为框架和边界的交叉点绘制一个较小的矩形。它根本不影响绘制区域。

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect rect = CGRectMake(100, 100, 200, 200);
    greenView = [[UIView alloc] initWithFrame:rect];
    [greenView setBackgroundColor:[UIColor greenColor]];

    CGRect bounds = CGRectMake(-100, -100, 200, 200);
    [greenView setBounds:bounds];
    [greenView setClipsToBounds:YES];
    [greenView setContentMode:UIViewContentModeRedraw];

    [self.view addSubview:greenView];
}

框架和边界日志如下:

Frame: {{100, 100}, {200, 200}}
Bounds: {{-100, -100}, {200, 200}}

我认为一个视图只会吸引它的边界矩形。关于视图和边界,我缺少什么?为什么改变我的视图的边界不会改变它的绘制位置?

这是它的样子:

在此处输入图像描述

4

2 回答 2

2

正如 Maddy 所建议的,对于您的用例,您只需更改frame. 以下是幕后发生的事情:

改变框架就像改变bounds center改变视图。所以如果你想用bounds,也改一下center。请注意, 的size不一定frame与边界相同,size of the因为视图可能会旋转。

因此,你的陈述“我认为一个视图只绘制它的边界矩形。 ”如果不是不正确的话,至少不够精确。如果将{200,200}视图旋转 45 度,它bounds仍然是{200,200},但它frame.size200 * sqrt(2)宽度和高度都是。bounds指的是视图自己坐标系,frame指的是超级视图的坐标系。

于 2013-11-04T16:18:10.453 回答
0

Mundi 说了什么,但我想补充一点,如果您曾经想过为什么会存在边界,那么滚动时会很有意义。NSScrollView的NSClipView边界是可见的 NSScrollView 文档视图的一部分。所以 scrollView.contentView.bounds 会随着你滚动而改变,但 scrollView.contentView.frame显然不会。

于 2013-11-04T16:47:09.527 回答