繁体   English   中英

CALayer掩码在设备旋转时不会更新

[英]CALayer mask does update on device rotation

我有一个CAShapeLayer子类,该子类创建一个六边形作为从其边界的路径。 我有另一个CALayer ,并将图像添加为CALayer的content ,然后将CALayer的mask属性设置为六边形层。 当我将其添加为viewController视图的子层时,图像会正确显示(剪切为六边形)。

-(void)viewDidLoad {

    [super viewDidLoad]; 
    MBFHexLayer *hex = [MBFHexLayer hexLayer]; 
    hex.orientation = MBFHexOrientationPointyTopped; 
    hex.frame = self.view.bounds;

    _hexTile = [CALayer layer];
    _hexTile.frame = self.view.bounds;
    _hexTile.mask = hex;
    _hexTile.contents = (id)[UIImage imageNamed:@"grass.jpg"].CGImage;

    [self.view.layer addSublayer:_hexTile]; 
}

viewDidLayoutSubviews ,将图像层的边界设置为视图的边界,并且在六边形蒙版层中重写了layoutSublayers以重新计算路径。

- (void)viewDidLayoutSubviews {

    [super viewDidLayoutSubviews];

    NSLog(@"View Bounds:%@", NSStringFromCGRect(self.view.bounds));
    _hexTile.frame = self.view.bounds;
    [_hexTile setNeedsLayout];
    [_hexTile layoutSublayers];
}

CAShapeLayer:

-(void)layoutSublayers {

    [self recalcGeometry];
    self.path = [self layerPath].CGPath;
}

旋转显示器时,六边形蒙版层上未调用layoutSublayers方法,并且视图中的图像不再正确剪切。

我对正确的更新链是什么感到困惑,任何指针将不胜感激。

我将实现此方法:

- (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation)  fromInterfaceOrientation {
 //relayout 
  }
  1. 您应该继承视图的子类,因为它不是在控制器中实现层的MVC方法。
  2. 您调用layoutSublayers也应该调用super
  3. 当子类化视图并在其中实现该层时,请对其进行引用,并在layoutSublayersOfLayer:方法中layoutSublayersOfLayer:您应调用setFrame:

您可以在此处检查类似的方法: https : //github.com/natalia-osa/NORosettaView/blob/master/NORosettaView/Classes/Example2View.m

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM