更改视图的边界不会改变绘制的位置

时间:2013-11-04 15:42:26

标签: ios cocoa-touch uiview bounds cgrect

viewDidLoad中,我创建一个{100}的UIView,大小为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}}

我认为一个视图只会吸引它的界限。我对观点和界限缺少什么?为什么不改变我的视图边界会改变它绘制的位置?

这是它的样子:

enter image description here

2 个答案:

答案 0 :(得分:2)

根据Maddy的建议,对于您的用例,您只需更改frame即可。以下是幕后发生的事情:

更改框架就像更改视图的bounds center一样。因此,如果您想使用bounds,也请更改center。请注意,size的{​​{1}}不一定与frame边界相同,因为视图可能会被轮换。

因此,你的陈述“我认为一个视图只会引入它的界限。”如果不是不正确,至少不够精确。如果您将size of the视图旋转45度,其{200,200}仍为bounds,但{200,200}的宽度和高度均为frame.size200 * sqrt(2)引用视图的自己的坐标系,bounds指向 superview 的坐标系。{1}}。

答案 1 :(得分:0)

Mundi说了什么,但我想补充一点,如果你曾经想过为什么 bounds 甚至存在,那么在滚动时它会很有意义。 NSScrollView的 NSClipView 的边界是可见的NSScrollView文档视图的一部分。因此滚动时scrollView.contentView.bounds会发生变化,但scrollView.contentView.frame 显然不会