Swift:手势识别器未注册
Posted
技术标签:
【中文标题】Swift:手势识别器未注册【英文标题】:Swift: Gesture recogniser isn't registering 【发布时间】:2015-02-02 17:08:12 【问题描述】:我不知道为什么,但我的控制器的手势识别器似乎没有注册,我正在使用UITableViewController
并执行了以下步骤:
override func viewDidLoad()
super.viewDidLoad()
tableView.delegate = self // This should be done already as it is a subclass
// of UITableViewController, just put this to debug...
// Gesture Recognisers - never seems to register (action never called)
let swipeDown = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
swipeDown.direction = UISwipeGestureRecognizerDirection.Down
self.tableView.addGestureRecognizer(swipeDown)
在viewDidLoad()
中为手势注册回调操作后,我声明了以下方法:
func respondToSwipeGesture(gesture: UIGestureRecognizer)
// Can we unwrap safely?
if let swipeGesture = gesture as? UISwipeGestureRecognizer
switch swipeGesture.direction
case UISwipeGestureRecognizerDirection.Down:
break
case UISwipeGestureRecognizerDirection.Up:
break
case UISwipeGestureRecognizerDirection.Left:
break
case UISwipeGestureRecognizerDirection.Right:
break
default:
break
我在整个respondToSwipeGesture()
func 中设置了断点,但似乎从未调用过该方法——这可能是什么原因造成的?我在单独的线程上运行了一些数据模型填充方法,但我认为这不会与正在注册的手势识别器冲突。
【问题讨论】:
在我看来,tableView
在您的滑动手势之前拦截并消耗了触摸事件。可能您可能更喜欢将手势识别器添加到您的 tableViewCells。
完全有道理,我试试看
无论如何,从用户的角度考虑,在垂直滚动容器上向下滑动似乎是不切实际的。使用单元格内的手势,您可能应该无论如何都应该实现手势委托,以让正常的垂直滚动钢起作用。
我真正想要的是检测用户是否在向上滚动,以确定新卡片是否应该执行他们的动画(类似于 Google+ 应用的工作方式)
考虑你的控制器可以是你的tableView
的滚动视图代理。只需将 tableView 的委托设置为您的控制器。然后您将收到tableView
的滚动视图中发生的各种滚动视图事件。
【参考方案1】:
这里是一个简单的例子,如果你的 tableView 向上或向下滚动时打印:
var offsetY: CGFloat = 0
didSet
if oldValue > offsetY
println("Going down!")
else
println("Going up!")
//MARK: Scroll View Delegate
func scrollViewDidScroll(scrollView: UIScrollView)
// Verify that the sander is your tableView
// Not needed if the only scrollView is the tableView
if scrollView === self.tableView
offsetY = scrollView.contentOffset.y
//MARK: View Lifecycle
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// You can do it in your storyboard
tableView.delegate = self
一旦您的 ViewController 是 tableView 委托,它还将接收来自 tableView 的滚动视图的UIScrollViewDelegate
消息。
在UIScrollViewDelegate
协议中,您可能会找到您要查找的内容。上面的示例可用于将另一个视图 sticky 保持在 tableView 内的固定位置。
【讨论】:
以上是关于Swift:手势识别器未注册的主要内容,如果未能解决你的问题,请参考以下文章
将 initWithCoder: implementation 转换为 Swift 时未触发手势识别器选择器