CALayer在设备方向更改时在iOS中自动调整大小

时间:2014-03-10 05:23:02

标签: ios objective-c calayer

我为自定义视图添加了一个CALayer,代码是

hostedGraphLayer.frame = self.layer.bounds;
[self.layer addSublayer:hostedGraphLayer];

当设备方向改变时,视图的图层的子图层也会旋转,但它不会相对于视图自动调整大小。 Layer不具有iOS的自动调整属性。

stackOverFlow中已有的答案之一是CALayers didn't get resized on its UIView's bounds change. Why?在这种情况下设置图层的设备方向改变,图层不会相对于其在旋转开始和结束之间的视图自动调整,这可以在模拟器中清楚地看到切换慢动画。

是否有任何修复“当视图旋转时,它的图层也会旋转,它应该调整其视图的大小。”

2 个答案:

答案 0 :(得分:1)

没有没有内置修复,

你必须改变它的框架。

如果我错了,请纠正我。

答案 1 :(得分:0)

在视图属性检查器中,将视图模式设置为重绘 View attributes inspector
内容将不再适应或对齐甚至拉伸,而是沿着动画呈现。

真正发生的是它渲染到最终位置,并且渲染在动画期间被拉伸,但这对于用户来说几乎是不可见的:)

上面的技巧会在视图的帧更改上调用背景图层上的setNeedsDisplay view.layer,但是由您来更新其子项setNeedsDisplay图层不会传播到子图层 这些子图层也不会像视图一样自动调整 如果您确实需要这种行为,请改用视图,或者通过覆盖父图层的setNeedsDisplay方法强制重绘自己。

-(void)setNeedsDisplay
{
    [super setNeedsDisplay];
    for (CALayer *sublayer in self.sublayers) {
        [sublayer setNeedsDisplay];
    }
}

这完全取决于您需要重绘的内容/方式。

如果您确实想要将图层用作与视图框架匹配的背景图层,请将UIView子类化并覆盖其类方法+(Class)layerClass以返回图层类。

+(Class)layerClass
{
    return [MyCustomLayer class];
}

它会将您的自定义图层用作默认背景图层 它非常强大;)我到处使用它 不要忘记Redraw属性!