2017-02-01 3 views
0

私はこのようになりますビュー階層を持っている:UITapGestureRecognizerを使用したUIViewは、その下のUITableViewにドラッグスルーしますか?

* Root UIView 
    * UITableView 
    * UIView 

UIViewは「トップ」であるので、UITableViewの一部を塞ぎます。

UIViewには、タップすることができるUITapGestureRecognizerもあります。

私が欲しいのは、UIViewがシングルタップを扱い、ドラッグイベントをUITableViewに渡すことです(UITableViewがスクロールできるように)。タップはうまくいきますが、UIViewはドラッグイベントを呑み込んでいます。

私はcancelsTouchesInViewを設定しましたが、それは役に立ちません。

次の画像のためのレポはこちらhttps://github.com/SuperTango/TapGestureOnTopOfTableView

で発見することができます私が話している何を示すのgifです。

enter image description here

答えて

0

あなたTappableViewにUIPanGestureRecognizerを追加することによってこれを行うことができます。あなたののviewDidLoadで

weak var tableView:UITableView? 

:私はあなたのtableViewの弱い参照を追加TappableViewで

@IBOutlet weak var pinkView: TappableView! 

:私はTappableViewのIBoutletを追加するのViewControllerで

:どのように私はそれをやった。ここ ViewController TappableViewのテーブル参照を設定します。

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

    pinkView.tableView = self.tableView 
} 
TappableViewで10

私はこのような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 
} 
} 

これで問題が解決するかどうか教えてください。

関連する問題