繁体   English   中英

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

[英]Changing frame of UIView's CALayer (self.view.layer.frame = …) appears to have no effect

我确定我在这里缺少一些基本的东西。 我正在尝试以下的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框架?

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

谢谢!

保罗

实际上,之前的答案(你不能设置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的圆角。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM