ios - 在动画中点击 UIImage

标签 ios swift uiviewanimation uitapgesturerecognizer

我一直在尝试在 UIImage 动画到我的屏幕顶部时点击它并 print("Image Tapped"),但没有成功。

override func viewDidLoad() {
    super.viewDidLoad()

    redBalloon.image = UIImage(named: "redBalloon")
    redBalloon.contentMode = .scaleAspectFit
    redBalloon.frame = CGRect(x: Int(xOrigin), y: 667, width: Int(redBalloon.frame.size.width), height: Int(redBalloon.frame.size.height))

    UIView.animate(withDuration: 5, delay: 0, options: UIImageView.AnimationOptions.allowUserInteraction, animations: {
        self.redBalloon.frame = CGRect(x: Int(self.xEnding), y: -192, width: 166, height: 192)
    }, completion: {(finished:Bool) in
        self.endGame()
    })

    let imageTap = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
    redBalloon.isUserInteractionEnabled = true
    redBalloon.addGestureRecognizer(imageTap)
}

@objc func imageTapped(_ sender: UITapGestureRecognizer) {
    // do something when image tapped
    print("image tapped")
}

最佳答案

问题是 ImageView 不在您在动画期间看到它的位置(它在动画的终点)。因此,您没有在 ImageView 所在的位置点击 ImageView ,因此不会检测到点击。

因此,要么您必须对表示层进行 HitTest ,要么如果您不想这样做,则必须使用 UIViewPropertyAnimator 而不是调用 UIView.animate

作为第一种方法的示例,我将子类化 UIImageView。让你的 UIImageView 成为这个子类的一个实例:

class TouchableImageView : UIImageView {
    override func hitTest(_ point: CGPoint, with e: UIEvent?) -> UIView? {
        let pres = self.layer.presentation()!
        let suppt = self.convert(point, to: self.superview!)
        let prespt = self.superview!.layer.convert(suppt, to: pres)
        return super.hitTest(prespt, with: e)
    }
}

不过,我个人认为使用UIViewPropertyAnimator要简单很多。在那种情况下,不要让您的 UIImageView 成为 TouchableImageView!你不想做额外的 HitTest 修改。让属性动画师完成所有工作:

    redBalloon.image = UIImage(named: "redBalloon")
    redBalloon.contentMode = .scaleAspectFit
    redBalloon.frame = CGRect(x: Int(xOrigin), y: 667, width: Int(redBalloon.frame.size.width), height: Int(redBalloon.frame.size.height))

    let anim = UIViewPropertyAnimator(duration: 5, timingParameters: UICubicTimingParameters(animationCurve: .easeInOut))
    anim.addAnimations {
        self.redBalloon.frame = CGRect(x: Int(xEnding), y: -192, width: 166, height: 192)
    }
    anim.addCompletion { _ in
        self.endGame()
    }

    let imageTap = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
    redBalloon.isUserInteractionEnabled = true
    redBalloon.addGestureRecognizer(imageTap)
    anim.startAnimation()

关于ios - 在动画中点击 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57032194/

相关文章:

ios - 动画代码错误: Type of expression is ambiguous without more context

iphone - 为什么要将 entitlements.plist 添加到我的项目中?

iphone - 确定一个对象是否被多个线程访问?

swift - 如何使用枚举(在结构内部定义)作为字典的键?

swift - 谷歌地图 GMSCameraUpdate 缩放最小化 swift 5

ios - 如何使用自定义初始化创建自定义 UINavigationController 类?

ios - 使用 React Native 在 IOS 运行时出现 "Unhandled JS Exception: Native module cannot be null"错误

ios - 在 Realm 中复制对象时的奇怪行为

iphone - 用于对象运动的简单 UIView 动画

ios - 在动画 block 中调用时,UIView 动画无法无限重复