【问题标题】:CALayer mask does update on device rotationCALayer 掩码会更新设备旋转
【发布时间】:2015-08-10 10:04:12
【问题描述】:

我有一个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 方法,并且图像不再在视图中正确剪辑。

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

【问题讨论】:

    标签: ios objective-c core-graphics calayer


    【解决方案1】:

    我会实现这个方法:

    - (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation)  fromInterfaceOrientation {
     //relayout 
      }
    

    【讨论】:

    • 此方法在 iOS 8 中已弃用。此外,它对MVC 仍然无效。一开始处理这个问题似乎更容易,但以后会更难解决。
    • 您从哪里获得这些信息?两周前,我在一个 iOS 8 应用程序中使用了这种方法,该应用程序现在在苹果商店中。通常在不推荐使用方法时写在文档中,我在 swift 应用程序中使用了它,但是没有评论说该方法已被弃用:O
    • 除了文档之外,您还写道您已经提交了使用此已弃用方法的应用程序。使用不推荐使用的方法不会使您的应用被拒绝。它写在文档中,但您必须挖掘才能找到此信息。如果文档中已弃用标志,则该语言无关紧要。无论如何,我建议再次使用这种方法和继任者。 MVC 是 iOS 中最重要的模式,开发人员应该坚持使用它,因为它是代码质量衡量标准之一。布局是视图而不是控制器的任务。
    • 感谢您的解释 :) 我希望他们对 Ios 开发很陌生,我从 Java 开发中了解 mvc。您对 mvc 等 iOS 模式有什么好的建议吗?像一个教程网站?谢谢:)
    【解决方案2】:
    1. 您应该对视图进行子类化,因为在控制器中实现层不是MVC 方法。
    2. 你打电话给layoutSublayers,你也应该打电话给super
    3. 当您将视图子类化并在那里实现层时,请保留对它的引用,并在方法layoutSublayersOfLayer: 中调用setFrame:

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

    【讨论】:

    • 感谢您的回复。这些层位于视图控制器中用于测试目的。我想创建一个自定义图层,我想我的问题可以更简单地定义为当父图层的边界发生变化时如何更新图层的蒙版。
    • @MagicBulletDave 很高兴听到它 :) 在这种情况下,您可能需要在 layoutSublayersOfLayer 方法上强制重新计算掩码。你也可以设置[self setContentMode:UIViewContentModeRedraw];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多