【问题标题】:Can I access a CAShapeLayer's path property in the presentation layer?我可以在表示层中访问 CAShapeLayer 的路径属性吗?
【发布时间】:2015-11-20 13:54:40
【问题描述】:

我有一个名为“starfish”的 UIView 子视图。它的背衬层是一个 CAShapeLayer,它的路径描边为海星形状。我想在封闭路径内的视图控制器中对这个形状进行命中测试,而不是视图的矩形。这没问题,我只需在视图控制器的 touchesBegan 中的 CAShapeLayer 路径属性上调用 CGPathContainsPoint() 并点击测试即可。

CGPoint p = [[touches anyObject] locationInView:self.view];
CGPoint q = [self.view convertPoint:p toView:self.starfish];

if (CGPathContainsPoint([(CAShapeLayer*)self.starfish.layer path], NULL, q, true))
    NSLog(@"Success");
else
    NSLog(@"Fail");

如果视图是动画的,从 A 移动到 B,同样的命中测试需要访问表示层中 CAShapeLayer 的路径,但我似乎无法访问它。

// Not working during animation
if (CGPathContainsPoint([(CAShapeLayer*)self.starfish.layer.presentationLayer path], NULL, q, true))
    NSLog(@"Success");
else
    NSLog(@"Fail");

【问题讨论】:

    标签: ios cashapelayer


    【解决方案1】:

    我找到了一个可行的解决方案。我创建了一个新的 CAShapeLayer,它与我在 touchesBegan 中测试的 CAShapelayer 具有相同的路径和框架(基于表示层)。

    CGPoint p = [[touches anyObject] locationInView:self.view];
    
    CGRect rect = [(CAShapeLayer*)self.starfish.layer.presentationLayer frame];
    
    CAShapeLayer *shape = [CAShapeLayer layer];
    shape.path = [(CAShapeLayer*)self.starfish.layer path];
    shape.frame = rect;
    
    CGPoint q = [self.view.layer convertPoint:p toLayer:shape];
    
    if (CGPathContainsPoint(shape.path, NULL, q, true))
        NSLog(@"Success");
    else
        NSLog(@"Fail");
    

    【讨论】:

      【解决方案2】:

      您无法访问路径属性的原因是因为layer.presentationLayerCALayer 的属性,并且它本身的类型是CALayer,而不是CAShapeLayer。但是,如果层的类型为CAShapeLayer,根据我的经验,layer.presentationLayerCAShapeLayer 是安全的,之后您可以访问路径属性。

      【讨论】:

        猜你喜欢
        • 2010-11-26
        • 2020-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-08
        • 2013-06-22
        相关资源
        最近更新 更多