2017-02-01 6 views
0

У меня есть иерархия представления, выглядит следующим образом:UIView с UITapGestureRecognizer проходит через перетаскивание под UITableView под ним?

* Root UIView 
    * UITableView 
    * UIView 

UIView находится на «Top», так что загораживает часть UITableView.

UIView также имеет на нем UITapGestureRecognizer, что позволяет использовать его.

Что я хочу для UIView для обработки одиночных кранов, но передаем события перетаскивания вниз до UITableView (так что UITableView может прокручивать). Нарезание резьбы отлично работает, но UIView проглатывает события перетаскивания.

У меня есть cancelsTouchesInView, но это не поможет.

РЭПО для следующего изображения можно найти на https://github.com/SuperTango/TapGestureOnTopOfTableView

Вот это GIF, показывая, что я говорю.

enter image description here

ответ

0

вы можете сделать это, добавив UIPanGestureRecognizer к вашему TappableView. Вот как я это сделал:

в вашем ViewController я добавить IBOutlet из TappableView:

@IBOutlet weak var pinkView: TappableView! 

в TappableView я добавить слабую ссылку вашего Tableview:

weak var tableView:UITableView? 

в viewDidLoad из ваших ViewController мы устанавливаем ссылку на таблицу для 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) 

и, наконец, я осуществлять действия панорамирования жест, как это:

// 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 
} 
} 

Позвольте мне знать, если это решить вашу проблему