2017-07-07 15 views
0

私は垂直スクロールビューを設定する以下のコードを持っています。私の質問は、ビューコントローラー内のビューがスワイプジェスチャーに正確に反応しないということです。たとえば、このスクロールビューでは、bottomVcに左右スワイプのスワイプジェスチャーが含まれています。このビューコントローラが別のプロジェクトで分離されている場合、完全に動作しますが、スクロールジェスチャは下のスクロールビュー内にあるときは機能しません。私はviewconttollersがスクロールビュー中にスワイプジェスチャーを処理できるように、この問題をどのように修正できるか疑問に思っていました。またFYIでは、他のView Controllerを制御するコードは、スワイプジェスチャーとともに別々のファイルにあります。 trueを戻すには、このメソッドを追加し、その後、あなたのクラスにUIGestureRecognizerDelegateプロトコルを追加
輸入のUIKitUIScrollViewがスワイプジェスチャーを食べているSwift

class VerticalScrollViewController: UIViewController, SnapContainerViewControllerDelegate { 

var topVc: UIViewController! 
var middleVc: UIViewController! 
var bottomVc: UIViewController! 
var scrollView: UIScrollView! 

class func verticalScrollVcWith(middleVc: UIViewController, 
           topVc: UIViewController?=nil, 
           bottomVc: UIViewController?=nil) -> VerticalScrollViewController { 
    let middleScrollVc = VerticalScrollViewController() 

    middleScrollVc.topVc = topVc 
    middleScrollVc.middleVc = middleVc 
    middleScrollVc.bottomVc = bottomVc 

    return middleScrollVc 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view: 
    setupScrollView() 
} 

func setupScrollView() { 
    scrollView = UIScrollView() 
    scrollView.isPagingEnabled = true 
    scrollView.showsVerticalScrollIndicator = false 
    scrollView.bounces = false 



    let view = (
     x: self.view.bounds.origin.x, 
     y: self.view.bounds.origin.y, 
     width: self.view.bounds.width, 
     height: self.view.bounds.height 
    ) 

    scrollView.frame = CGRect(x: view.x, y: view.y, width: view.width, height: view.height) 
    self.view.addSubview(scrollView) 

    let scrollWidth: CGFloat = view.width 
    var scrollHeight: CGFloat 

    if topVc != nil && bottomVc != nil { 
     scrollHeight = 3 * view.height 
     middleVc.view.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height) 
     topVc.view.frame = CGRect(x: 0, y: view.height, width: view.width, height: view.height) 
     bottomVc.view.frame = CGRect(x: 0, y: 2 * view.height, width: view.width, height: view.height) 

     addChildViewController(topVc) 
     addChildViewController(middleVc) 
     addChildViewController(bottomVc) 

     scrollView.addSubview(topVc.view) 
     scrollView.addSubview(middleVc.view) 
     scrollView.addSubview(bottomVc.view) 

     topVc.didMove(toParentViewController: self) 
     middleVc.didMove(toParentViewController: self) 
     bottomVc.didMove(toParentViewController: self) 

     //scrollView.contentOffset.y = middleVc.view.frame.origin.y 
     scrollView.contentOffset.y = topVc.view.frame.origin.y 

    } else if topVc == nil { 
     scrollHeight = 2 * view.height 
     middleVc.view.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height) 
     bottomVc.view.frame = CGRect(x: 0, y: view.height, width: view.width, height: view.height) 

     addChildViewController(middleVc) 
     addChildViewController(bottomVc) 

     scrollView.addSubview(middleVc.view) 
     scrollView.addSubview(bottomVc.view) 

     middleVc.didMove(toParentViewController: self) 
     bottomVc.didMove(toParentViewController: self) 

     scrollView.contentOffset.y = 0 

    } else if bottomVc == nil { 
     scrollHeight = 2 * view.height 
     topVc.view.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height) 
     middleVc.view.frame = CGRect(x: 0, y: view.height, width: view.width, height: view.height) 

     addChildViewController(topVc) 
     addChildViewController(middleVc) 

     scrollView.addSubview(topVc.view) 
     scrollView.addSubview(middleVc.view) 

     topVc.didMove(toParentViewController: self) 
     middleVc.didMove(toParentViewController: self) 

     scrollView.contentOffset.y = middleVc.view.frame.origin.y 

    } else { 
     scrollHeight = view.height 
     middleVc.view.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height) 

     addChildViewController(middleVc) 
     scrollView.addSubview(middleVc.view) 
     middleVc.didMove(toParentViewController: self) 
    } 

    scrollView.contentSize = CGSize(width: scrollWidth, height: scrollHeight) 
    scrollView.delaysContentTouches = false 

} 


func outerScrollViewShouldScroll() -> Bool { 
    if scrollView.contentOffset.y < middleVc.view.frame.origin.y || scrollView.contentOffset.y > middleVc.view.frame.origin.y { 

     return false 

    } else { 

     return true 
    } 

} 

} 
+0

'UIGestureRecognizerDelegate'には、必要なメソッドがあります。具体的には:https://developer.apple.com/documentation/uikit/uigesturerecognizerdelegate/1624208-gesturerecognizer – PeejWeej

答えて

1

試してみてください:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     return true 
    } 

動作するはずです、あなたのコントローラの設定が何らかの形で適切に防止されない限り、コードが

+0

あなたは私にそれを打つ! – Mozahler

+0

scrollviewクラスまたは個々のView Controllerクラスでは? – JustANoob

+0

スクロールビューを含むクラスで、タッチ集中型(ドラッグまたは長押し)またはスクロール可能な要素自体(コレクション、テーブルなど)を含むサブビューで理想的です。 – murphguy

関連する問題