在 UIAnimations 中允许 UITapGestureRecognizer

Posted

技术标签:

【中文标题】在 UIAnimations 中允许 UITapGestureRecognizer【英文标题】:Allow UITapGestureRecognizer inside UIAnimations 【发布时间】:2016-05-19 07:45:45 【问题描述】:

当我收到来自 parse 的通知时,我正在尝试显示自定义视图。 这个视图用一个动画显示,它用另一个动画隐藏。这个视图还有一个 uitapgesturerecognizer,当用户点击视图时需要触发它。 我的问题是,当第二个动画被触发时,自定义视图的 uitapgesture 不起作用:\

有什么想法吗?我粘贴代码。 谢谢!

func doManageObjectNotification(notification: COPushNotification)
    mainView = UIApplication.sharedApplication().keyWindow!
    customView = CustomNotificationView()
    let height = customView.calculateViewHeight()

    customView.frame = CGRectMake(0, -height, mainView.frame.width, height)
    customView.targetMethod = notificationWasTapped
    customView.setContent(notification)
    customView.alpha = 0
    mainView.addSubview(customView)

    UIView.animateWithDuration(0.75, delay: 0, options: [UIViewAnimationOptions.CurveEaseInOut, UIViewAnimationOptions.AllowUserInteraction], animations:  () -> Void in
       // Show the view
        self.customView.frame.origin.y = 0
        self.customView.alpha = 1
    )  (Bool) -> Void in
        UIView.animateWithDuration(0.75, delay: 5, options: [UIViewAnimationOptions.CurveEaseInOut, UIViewAnimationOptions.AllowUserInteraction], animations: 
            // Hide the view
            self.customView.alpha = 0
            , completion:  finished in
                self.customView.removeFromSuperview()
                self.customView = nil
        )
    


【问题讨论】:

【参考方案1】:

我同意 Lion 的回答,但我也想在动画期间将您的注意力集中在 customView.frame.origin.y = 0 上:如果您使用 autolayout 并且您尝试更改框架尺寸或位置而不是涉及的正确约束,您可以禁用导致警告和意外视图尺寸和移动的约束效果。当您多次遇到此问题时,UITapGestureRecognizer 会停止响应。

最好的方法是创建 IBOutlets 约束并使用它(例如):

@IBOutlet weak var customViewTopConstraint: NSLayoutConstraint

...
UIView.animateWithDuration(0.75, delay: 0, options: [UIViewAnimationOptions.CurveEaseInOut, UIViewAnimationOptions.AllowUserInteraction], animations:  () -> Void in
       // Show the view
        self.customViewTopConstraint.constant = 0

【讨论】:

谢谢你的小费亚历山德罗,我会看看这个;)【参考方案2】:

要在动画期间处理点击,您应该实现touchesBegan 方法。通过这种方式,您可以检测到触摸,然后检查触摸是否来自您的视图,如果是,那么您可以执行您想要的任务。

希望这会有所帮助:)

【讨论】:

非常感谢狮子的回答。我意识到问题在于指令 customView.alpha = 0,它告诉 ui 该视图是不可见的,因此所有触摸事件都会自动取消。我的解决方案是放置 customView.alpha = 0.1 ,当动画完成时,然后从超级视图中删除视图。在此之后,手势和触摸开始(如你所说)都有效;)

以上是关于在 UIAnimations 中允许 UITapGestureRecognizer的主要内容,如果未能解决你的问题,请参考以下文章

在 symfony 访问控制中允许控制器操作

如何在 JetBrains Rider 中允许不安全的代码?

C# - 如何在 OpenFileDialog 中允许多种文件类型?

为啥列表中允许使用尾随逗号?

为啥在 python 切片中允许非整数内置类型?

在 html 编辑器中允许锚标记是不是安全?