iOS设备方向变化时CALayer自动调整大小

7

我已经为自定义视图添加了一个CALayer,代码如下:

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

设备方向改变时,视图层的子层也会旋转,但它不会根据视图自动调整大小。对于iOS,图层将没有自动调整大小的属性。
在StackOverflow上已经有一个答案:CALayers didn't get resized on its UIView's bounds change. Why? 在这种情况下,在设备方向改变时设置图层的框架,从旋转开始到结束之间,图层不会根据其视图自动调整大小。可以通过在模拟器中切换慢动画来清楚地看到这一点。
是否有任何解决方法“当视图旋转时,它的图层也会旋转,并且应该根据其视图调整大小”。
2个回答

2

目前还没有内置的解决方法,

您需要更改其框架。

如果我说错了,请纠正我。


0
在视图属性检查器中,将视图模式设置为重绘。
View attributes inspector
内容将不再适应、对齐或拉伸,而是沿着动画渲染。
实际发生的是它渲染到最终位置,这个渲染在动画期间被拉伸,但对用户来说几乎看不出来 :)
上述技巧将在视图框架更改时调用背景层(view.layer)上的setNeedsDisplay,但更新其子级取决于您。setNeedsDisplay一个图层不会传播到子图层。此外,这些子层不会像视图一样自动调整大小。如果您真的想要这种行为,请改用视图,或通过覆盖父图层的setNeedsDisplay方法强制重新绘制。
-(void)setNeedsDisplay
{
    [super setNeedsDisplay];
    for (CALayer *sublayer in self.sublayers) {
        [sublayer setNeedsDisplay];
    }
}

这完全取决于你需要重绘什么或如何重绘。

如果你真的想使用一个图层作为与视图框架匹配的背景层,那么可以子类化UIView并覆盖其类方法+(Class)layerClass以返回你的图层类。

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

它将使用您的自定义层作为默认背景层
非常强大 ;) 我在任何地方都使用它
不要忘记Redraw属性!


这更多地取决于在分配视图时给定的自动调整掩码(autoresizeMask)。在子视图类中实现-(void)layoutSubview:可以通过强制布局来完成。 - Ol Sen
1
我先学了复杂的方法... layoutSubview 很好用。 - Crazyrems

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接