CALayers没有根据UIView的界限变化调整大小。为什么?

时间:2010-03-23 22:43:37

标签: iphone ios objective-c uiview calayer

我有一个UIView,其图层中添加了大约8个不同的CALayer子图层。 如果我修改了视图的边界(动画),那么视图本身会缩小(我使用backgroundColor进行了检查),但子图层的大小保持不变

如何解决这个问题?

8 个答案:

答案 0 :(得分:132)

我使用的是Solin使用的相同方法,但该代码中存在拼写错误。方法应该是:

- (void)layoutSubviews {
  [super layoutSubviews];
  // resize your layers based on the view's new bounds
  mylayer.frame = self.bounds;
}

出于我的目的,我一直希望子图层是父视图的完整大小。将该方法放在视图类中。

答案 1 :(得分:24)

由于iPhone上的CALayer不支持布局管理器,我认为您必须使视图的主图层成为自定义CALayer子类,您可以在其中覆盖layoutSublayers以设置所有子图层的帧。您还必须覆盖视图的+layerClass方法,以返回新CALayer子类的类。

答案 2 :(得分:11)

我在UIView中使用过它。

-(void)layoutSublayersOfLayer:(CALayer *)layer
{
    if (layer == self.layer)
    {
        _anySubLayer.frame = layer.bounds;
    }

super.layoutSublayersOfLayer(layer)
}

适合我。

答案 3 :(得分:9)

我遇到了同样的问题。在自定义视图的图层中,我添加了两个子图层。为了调整子图层的大小(每次自定义视图的边界发生变化),我都实现了自定义视图的方法layoutSubviews;在这个方法中,我只是更新每个子层的帧以匹配我的子视图层的当前边界。

这样的事情:

-(void)layoutSubviews{
   //keep the same origin, just update the width and height
   if(sublayer1!=nil){
      sublayer1.frame = self.layer.bounds;
   }
}

答案 4 :(得分:4)

Swift 3版本

在自定义单元格中,添加以下行

首先声明

let gradientLayer: CAGradientLayer = CAGradientLayer()

然后添加以下行

override func layoutSubviews() {
    gradientLayer.frame = self.YourCustomView.bounds
}

答案 5 :(得分:4)

2017

这个问题的字面答案:

" CALayers没有根据其UIView的界限变化调整大小。为什么"

是好的还是坏的

needsDisplayOnBoundsChange

CALayer中默认为false。

溶液,

class CircularGradientViewLayer: CALayer {

    override init() {

        super.init()
        needsDisplayOnBoundsChange = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override open func draw(in ctx: CGContext) {
        go crazy drawing in .bounds
    }
}

确实,我指导你参加这个QA

https://stackoverflow.com/a/47760444/294884

解释了,关键contentsScale设置到底是做什么的;当你设置needsDisplayOnBoundsChange时,你通常需要同样设置它。

答案 6 :(得分:0)

正如[Ole]所写,CALayer不支持在iOS上自动调整大小。所以你应该手动调整布局。我的选择是在(iOS 7及更早版本)中调整图层的框架

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

或(从iOS 8开始)

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinato

答案 7 :(得分:0)

在自定义视图中,您需要为自定义层声明变量,而不是在范围初始化中声明变量。并且只需将其初始化一次,就不要尝试设置null值并重新初始化


    class CustomView:UIView {
        var customLayer:CALayer = CALayer()

        override func  layoutSubviews() {
            super.layoutSubviews()
    //        guard let _fillColor = self._fillColor else {return}
            initializeLayout()
        }
        private func initializeLayout() { 
            customLayer.removeFromSuperView()
            customLayer.frame = layer.bounds
                   
            layer.insertSubview(at:0)
        }
    }