当UIView动画/旋转时,UIButton触摸位置不准确

时间:2015-11-11 06:11:20

标签: ios swift uibutton rotation uiviewanimation

enter image description here

你好,所有你真棒!我一直有一个奇怪的问题,如果UIView是动画的,在我的情况下旋转,在动画期间子视图触摸位置是不准确的。

例如,如果我一直点击button1,有时会按下button2或者没有任何按下按钮。我搜索过STO和其他博客,尝试了他们的方法,但似乎没有任何效果。我的目标是在视图旋转时按下按钮。

我认为这是一个UIButton错误或问题,但即使使用imageViews,触摸代表或添加手势,我也会得到同样的东西。我觉得它很简单,比如presentation.layer或者需要添加到UIView动画函数中的东西,但我有点不知所措。希望你能有所见解!谢谢大家。

func updateRotateView () 
{
    UIView.animateWithDuration(2,
        delay: 0.0,
        options: [UIViewAnimationOptions.CurveLinear, UIViewAnimationOptions.AllowUserInteraction],
        animations: {
            self.rotationView.transform = CGAffineTransformRotate(self.rotationView.transform, 3.1415926)

             //Test A
             //self.button1.frame = self.rotationView.convertRect(self.button1.frame, fromView:self.rotationView)
             //self.button1.layer.frame = self.rotationView.layer.convertRect(self.button1.layer.frame, fromLayer: self.rotationView.layer)
        }
     completion: {finished in })
 }


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
{
    //Test B
    let firstTouch = touches.first
    let firstHitPoint = firstTouch.locationInView(self.rotationView)

    if (self.button1.frame.contains(firstHitPoint)) {
        print("Detected firstHit on Button1")
    }

    if (self.button1.layer.frame.contains(firstHitPoint)) {
        print("Detected firstHit on Button1.layer")
    }

    if ((self.button1.layer.presentationLayer()?.hitTest(firstHitPoint!)) != nil) {
        print("Detected button1.layer hit test")
    }
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    //Test C
    let lastTouch = touches.first!
    let lastHitPoint = lastTouch.locationInView(self.rotationView)

    if (self.button1.frame.contains(lastHitPoint)) {
        print("Detected lastHit on Button1")
    }

    if (self.button1.layer.frame.contains(lastHitPoint)) {
        print("Detected lastHit on Button1.layer")
    }

    if ((self.button1.layer.presentationLayer()?.hitTest(lastHitPoint!)) != nil) {
        print("Detected button1.layer hit test")
    }
}

extension UIButton {
    //Test D
    public override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? 
     {
        print("hitTest called")
     }

    public override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool 
     {
        print("pointInside called")
     }
}

测试A - &gt; rotationView.presentationLayer值更改,但按钮没有,并将其设置为更新的帧,因为button1帧或layer.frame大小值不会更改,因此无效。

测试B / C - &gt; UIButton不响应触摸代表,但即使使用imageViews也无法准确命中。也尝试了同样结果的手势。

测试D - &gt; Hitpoint确实被调用,但很可能也在错误的按钮上。点内部只被调用几次,如果我能够按下正确的按钮,但又非常不准确。

1 个答案:

答案 0 :(得分:0)

因为您正在为视图设置动画。您应该知道动画时有表示层和模型层。

在动画块中调用self.rotationView.transform = CGAffineTransformRotate(self.rotationView.transform, 3.1415926) 后,已经设置了rotationView的变换,你看到的动画只是表示层(它是一个id类型但它应该是CALayer)。