【问题标题】:CAShapeLayer detect touch during animation SwiftCAShapeLayer 在动画 Swift 期间检测触摸
【发布时间】:2016-05-08 17:14:28
【问题描述】:

我可以像这样检测到 CAShapeLayer 的触摸 (touchesEnded):

let touchLocation : CGPoint = (touch as! UITouch).locationInView(self.view)

for shape in shapes{
    if CGPathContainsPoint(shape.path, nil, touchLocation, false){
        print("Layer touch")
    }
}

我可以像这样为 CAShapeLayer 的路径设置动画:

let newShapePath = UIBezierPath(arcCenter: toPoint, radius: 20, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2), clockwise: true).CGPath

// animate the `path`
let animation = CABasicAnimation(keyPath: "path")
animation.toValue = newShapePath
animation.duration = CFTimeInterval(duration)

animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
animation.fillMode = kCAFillModeBoth
animation.removedOnCompletion = false

shape.addAnimation(animation, forKey: animation.keyPath)

但是当动画发生时,在 CAShapeLayer 上没有检测到触摸。是否可以在为路径设置动画时检测到 CAShapeLayer 上的触摸?

【问题讨论】:

    标签: ios swift core-animation cashapelayer cabasicanimation


    【解决方案1】:

    您可以访问图层的presentationLayer 以执行此操作。这将为您提供动画时给定图层的“飞行中”值的粗略近似值。例如:

    for shape in shapes {
    
        // gets the layer's presentation layer if it exists – else fallback on the model layer
        let presentationLayer = shape.presentationLayer() as? CAShapeLayer ?? shape
    
        if CGPathContainsPoint(presentationLayer.path, nil, touchLocation, false){
            print("Layer touch")
        }
    }
    

    另外,作为旁注,如果您不使用动画委托,通常认为使用removedOnCompletion = false 是不好的做法。您应该只更新图层的模型值以表示其新状态,而不是让动画逗留。您可以通过CATransaction 执行此操作,以确保不会生成隐式动画。例如:

    let animation = CABasicAnimation(keyPath: "path")
    animation.fromValue = shape.path
    animation.toValue = newShapePath
    animation.duration = CFTimeInterval(duration)
    
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
    
    shape.addAnimation(animation, forKey: animation.keyPath)
    
    // update the layer's model values
    CATransaction.begin()
    CATransaction.setDisableActions(true)
    shape.path = newShapePath
    CATransaction.commit()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2012-07-26
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多