我有一个看起来像这样的视图层次结构:
* Root UIView
* UITableView
* UIView
UIView
位于“顶部”,因此会遮挡部分UITableView
。
UIView
上还有一个UITapGestureRecognizer
,可以点按它。
我想要的是UIView
处理单个点击,但将拖动事件传递给UITableView
(因此UITableView可以滚动)。点击工作正常,但UIView
吞下了拖动事件。
我已设置cancelsTouchesInView
,但没有帮助。
可以在https://github.com/SuperTango/TapGestureOnTopOfTableView
找到以下图片的回购这是一个显示我正在谈论的内容的gif。
答案 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
}
}
如果这可以解决您的问题,请告诉我