CALayers没有调整其UIView的边界改变。 为什么?
我有一个UIView
约有8个不同的CALayer
子层添加到其图层。 如果我修改视图的边界 (animation),然后视图本身缩小(我用backgroundColor
检查它),但子图层的大小保持不变 。
如何解决这个问题?
我使用了Solin使用的相同方法,但在代码中存在拼写错误。 该方法应该是:
- (void)layoutSubviews { // resize your layers based on the view's new bounds mylayer.frame = self.bounds; }
为了我的目的,我一直希望子图层是父视图的完整大小。 把这个方法放在你的视图类中。
由于iPhone上的CALayer不支持布局pipe理器,我认为你必须让你的视图的主层是一个自定义的CALayer子类,在这个子类中你可以重写layoutSublayers
来设置所有子层的帧。 你还必须覆盖你的视图的+layerClass
方法来返回你新的CALayer子类的类。
我有同样的问题。 在自定义视图的图层中,我添加了两个子图层。 为了调整子图层的大小(每当自定义视图的边界发生变化时),我实现了自定义视图的layoutSubviews
方法; 在这个方法中,我只是更新每个子图层的框架,以匹配我的子视图图层的当前边界。
像这样的东西:
-(void)layoutSubviews{ //keep the same origin, just update the width and height if(sublayer1!=nil){ sublayer1.frame = self.layer.bounds; } }
我在UIView中使用了这个。
-(void)layoutSublayersOfLayer:(CALayer *)layer { if (layer == self.layer) { _anySubLayer.frame = layer.bounds; } }
为我工作。
Swift 3版本
在自定义单元格中,添加以下行
首先申报
let gradientLayer: CAGradientLayer = CAGradientLayer()
然后添加以下行
override func layoutSubviews() { gradientLayer.frame = self.YourCustomView.bounds }
正如[Ole]写的,CALayer不支持在iOS上进行自动调整。 所以你应该手动调整布局。 我的select是调整(iOS 7及更早版本)中的图层框架,
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
或(从iOS 8开始)
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinato