UIView与UITapGestureRecognizer一起通过拖动到它下面的UITableView?

时间:2017-02-01 08:45:43

标签: swift uitableview uitapgesturerecognizer

我有一个看起来像这样的视图层次结构:

* Root UIView
  * UITableView
  * UIView

UIView位于“顶部”,因此会遮挡部分UITableView

UIView上还有一个UITapGestureRecognizer,可以点按它。

我想要的是UIView处理单个点击,但将拖动事件传递给UITableView(因此UITableView可以滚动)。点击工作正常,但UIView吞下了拖动事件。

我已设置cancelsTouchesInView,但没有帮助。

可以在https://github.com/SuperTango/TapGestureOnTopOfTableView

找到以下图片的回购

这是一个显示我正在谈论的内容的gif。

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以通过将UIPanGestureRecognizer添加到TappableView来完成此操作。 我是怎么做到的:

在你的ViewController中我添加一个TaoutableView的IBoutlet:

@IBOutlet weak var pinkView: TappableView!

在TappableView中我添加了tableView的弱引用:

 weak var tableView:UITableView?

在ViewController的viewDidLoad中我们设置了TappableView的表引用:

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.dataSource = self

    pinkView.tableView = self.tableView
}

在TappableView中,我添加了一个UIPanGestureRecognizer,如下所示:

 // Here we add the PanGesture
    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePanGesture(_:)))
    self.addGestureRecognizer(panGestureRecognizer)

最后我实现了pan手势的动作:

// Handle Pan gesture action
func handlePanGesture(_ panGesture: UIPanGestureRecognizer) {
    let translation = panGesture.translation(in: self)
    panGesture.setTranslation(CGPoint.zero, in: self)

    if let tableView = self.tableView{
        tableView.contentOffset = CGPoint(x: tableView.contentOffset.x, y: tableView.contentOffset.y + translation.y)
    }

}

完整的TappableView代码

import UIKit

class TappableView: UIView {

weak var tableView:UITableView?
override init(frame: CGRect) {
    super.init(frame: frame)
    self.setup()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.setup()
}

func setup() {
    let singleTapRecognizer = UITapGestureRecognizer()
    singleTapRecognizer.addTarget(self, action: #selector(self.tappedHandler(_:)))
    singleTapRecognizer.numberOfTapsRequired = 1
    singleTapRecognizer.cancelsTouchesInView = false
    self.addGestureRecognizer(singleTapRecognizer)

    // Here we add the PanGesture
    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePanGesture(_:)))
    self.addGestureRecognizer(panGestureRecognizer)
}

func tappedHandler(_ sender: UITapGestureRecognizer) {
    NSLog("Got a tap")
}


// Handle Pan gesture action
func handlePanGesture(_ panGesture: UIPanGestureRecognizer) {
    let translation = panGesture.translation(in: self)
    panGesture.setTranslation(CGPoint.zero, in: self)

    if let tableView = self.tableView{
        tableView.contentOffset = CGPoint(x: tableView.contentOffset.x, y: tableView.contentOffset.y + translation.y)
    }

}


}

完整的ViewController代码

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var pinkView: TappableView!
@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.dataSource = self
    pinkView.tableView = self.tableView
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 50
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel!.text = String(indexPath.row)
    return cell
}
}

如果这可以解决您的问题,请告诉我