在 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JetBrains Rider 中允许不安全的代码?