2017-02-01 1 views
0

J'ai une hiérarchie de vue qui ressemble à ceci:UIView avec UITapGestureRecognizer passe-t-il par glisser vers un UITableView en dessous?

* Root UIView 
    * UITableView 
    * UIView 

Le UIView est sur « Top », donc il occlut partie du UITableView.

Le UIView dispose également d'un UITapGestureRecognizer qui lui permet d'être exploité.

Ce que je veux, c'est que le UIView gère des taps uniques, mais transmette les événements de traînage au UITableView (pour que l'UITableView puisse défiler). Le tapotement fonctionne correctement, mais le UIView avale les événements de traînée. J'ai défini cancelsTouchesInView mais cela n'aide pas.

Le repo pour l'image suivante peut être trouvé à https://github.com/SuperTango/TapGestureOnTopOfTableView

Voici un gif montrant ce dont je parle. vous pouvez le faire en

enter image description here

Répondre

0

ajouter à votre UIPanGestureRecognizer TappableView. Voici comment je l'ai fait:

dans votre ViewController i ajouter un IBOutlet de TappableView:

@IBOutlet weak var pinkView: TappableView! 

dans TappableView ajouter une référence faible de votre tableView:

weak var tableView:UITableView? 

dans viewDidLoad de votre ViewController nous définissons la référence de table de TappableView:

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

    pinkView.tableView = self.tableView 
} 

En TappableView j'ajouter un UIPanGestureRecognizer comme ceci:

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

et enfin je mets en œuvre l'action du geste pan comme ceci:

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

} 

code complet de 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) 
    } 

} 


} 

Code complet de 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 
} 
} 

Permettez-moi savoir si cela résout votre problème