你好,所有你真棒!我一直有一个奇怪的问题,如果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确实被调用,但很可能也在错误的按钮上。点内部只被调用几次,如果我能够按下正确的按钮,但又非常不准确。
答案 0 :(得分:0)
因为您正在为视图设置动画。您应该知道动画时有表示层和模型层。
在动画块中调用self.rotationView.transform = CGAffineTransformRotate(self.rotationView.transform, 3.1415926)
后,已经设置了rotationView的变换,你看到的动画只是表示层(它是一个id类型但它应该是CALayer)。