CALayers没有调整其UIView的边界改变。 为什么?

我有一个UIView约有8个不同的CALayer子层添加到其图层。 如果我修改视图的边界 (animation),然后视图本身缩小(我用backgroundColor检查它),但子图层的大小保持不变

如何解决这个问题?

6 Solutions collect form web for “CALayers没有调整其UIView的边界改变。 为什么?”

我使用了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 
  • 获取对iOS应用程序中最顶层视图/窗口的引用
  • 在Swift中从nib加载一个UIView
  • 如何判断UIViewController的视图是否可见
  • UIView底部边界?
  • 在Swift中将xib分配给UIView
  • 如何在更改uiview隐藏模式的同时添加animation?
  • 什么是强制UIView重绘最强大的方法?
  • 让UIView通过触摸事件?