pme*_*yer 6 iphone cocoa-touch core-animation ios
我确定我在这里缺少一些基本的东西.我正在尝试以下的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);
}
Run Code Online (Sandbox Code Playgroud)
我运行这个(ipad 2或ipad模拟器)并得到一个带圆角的全屏蓝色矩形.我希望得到的是20x20蓝色矩形偏移20/20.
我清楚地控制了视图层(如颜色和圆角所示).但是,调整框架似乎没有任何影响.我在设置它之前/之后已经对NSLog进行了设置,并且它已经改变了.根层的框架是否锁定到uiview框架?
我没有强烈的理由改变视图图层框架,我只是想通过正在发生的事情来推理.希望这是一个简单的问题......
谢谢!
保罗
pme*_*yer 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中所做的更改似乎很难实现.
罗宾的回答让我走上正轨,但我想详细说明完整的答案.
该教程是错误的.设置视图主图层的框架无效.主图层是"特殊的",并将始终填充视图的边界.你需要做的是创建主层的子层,如下所示:
- (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
}
Run Code Online (Sandbox Code Playgroud)
此外,在您的代码中,宽度为20pt,高度为20pt的图层太小,无论如何都不能有30pt的圆角.