[英]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
}
MVC
方法。 layoutSublayers
也应该调用super
。 layoutSublayersOfLayer:
方法中layoutSublayersOfLayer:
您应调用setFrame:
您可以在此处检查类似的方法: https : //github.com/natalia-osa/NORosettaView/blob/master/NORosettaView/Classes/Example2View.m
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.