改变UIView的CALayer框架(self.view.layer.frame = ...)似乎没有效果

时间:2011-10-22 14:42:02

标签: iphone ios cocoa-touch core-animation

我确定我错过了一些基本的东西。我正在试用CALayers的“hello world”代码:

http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

做第一个例子。 xcode 4.2中的新单视图项目。没有更改笔尖/故事板。导入QuartzCore。将以下代码添加到ViewController.m中的ViewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.layer.backgroundColor = [UIColor blueColor].CGColor;
    self.view.layer.cornerRadius = 30.0;    
    self.view.layer.frame = CGRectMake(20, 20, 20, 20);
}

我运行这个(ipad 2或ipad模拟器)并得到一个带圆角的全屏蓝色矩形。我希望得到的是20x20蓝色矩形偏移20/20。

我清楚地控制了视图层(如颜色和圆角所示)。但是,调整框架似乎没有任何影响。我在设置它之前/之后已经对NSLog进行了设置,并且它已经改变了。根层的框架是否锁定到uiview框架?

我没有充分的理由改变视图图层框架,我只是试图通过正在发生的事情来推理。希望这是一个简单的问题......

谢谢!

2 个答案:

答案 0 :(得分:10)

实际上,之前的答案(你不能设置uiview.layer.frame,因为它总是填充uiview)很接近,但还不完全。阅读完答案后,我注册了原始网站并评论该教程存在问题。在这样做的过程中,我发现在第一遍中我没有看到过的评论。使用这些,我开始做一些测试。

底线,如果将self.view.layer.frame设置代码从viewDidLoad移动到viewWillAppear,它可以正常工作。这意味着您可以更改视图根层的框架。但是,如果你在viewDidLoad中执行它,它将在稍后撤消。

然而,之前的答案仍然非常接近。我NSLog了根层的框架和视图的框架。更改根层框架会更改视图框架。因此,view.layer.frame始终填充view.frame的答案是正确的。但是,设置图层帧会重置视图帧以匹配。 (我猜uiview.frame属性只返回uiview.layer.frame ...)

因此,在2010年到今天的某个时间点,环境中的某些东西发生了变化。具体来说,在viewDidLoad之后和viewWillAppear之前,uiview / layer框架似乎被重置为nib指定值。这将覆盖viewDidLoad中的任何更改。在viewWillAppear中所做的更改似乎有效。

罗宾的回答让我走上了正确的轨道,但我想详细说出完整的答案。

答案 1 :(得分:9)

教程错了。设置视图主图层的框架无效。主图层是“特殊的”,并将始终填充视图的边界。你需要做的是创建主层的子层,如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];

    CALayer *newLayer = [[CALayer alloc] init];

    newLayer.backgroundColor = [UIColor orangeColor].CGColor;
    newLayer.cornerRadius = 20.0;
    newLayer.frame = CGRectMake(100.0f, 100.0f, 200.0f, 200.0f);

    [self.view.layer addSublayer:newLayer];

    [newLayer release]; // Assuming you're not using ARC
}

此外,在您的代码中,宽度为20pt且高度为20pt的图层太小,无论如何都不能有30pt的圆角。