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

我确定我错过了一些基本的东西。 我正在尝试以下的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模拟器)并得到一个带圆角的全屏蓝色矩形。 我希望得到的是20×20蓝色矩形偏移20/20。

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

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

谢谢!

保罗

实际上,之前的答案(你不能设置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中所做的更改似乎很难实现。

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

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

 - (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的圆角。