2017-07-07 2 views
0

J'ai le code ci-dessous qui établit un scrollview vertical Ma question est que les vues dans les contrôleurs de vue ne répondent pas exactement aux gestes de balayage. Par exemple, dans ce scrollview, bottomVc contient des gestes de balayage pour les balayages gauche et droit. Lorsque ce contrôleur de vue est isolé dans un autre projet, il fonctionne parfaitement, mais les gestes de balayage ne fonctionnent pas lorsqu'il se trouve dans la vue de défilement ci-dessous. Je me demandais comment je pouvais résoudre ce problème afin que mes viewconttollers puissent gérer les gestes de balayage tout en étant dans le scrollview. En outre, le code qui contrôle les autres contrôleurs de vue se trouve dans des fichiers séparés avec les mouvements de balayage. Le code:
importation UIKitUIScrollView est en train de gruger mes gestes de balayage 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

Le 'UIGestureRecognizerDelegate' devrait avoir les méthodes dont vous avez besoin. plus précisément: https://developer.apple.com/documentation/uikit/uigesturerecognizerdelegate/1624208-gesturerecognizer – PeejWeej

Répondre

1

Essayez d'ajouter le protocole UIGestureRecognizerDelegate à votre classe, puis en ajoutant cette méthode pour retourner true:

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

devrait fonctionner, à moins que la configuration de votre contrôleur empêche en quelque sorte approprié Reconnaissance tactile.

+0

Vous me battez à elle! – Mozahler

+0

Dans la classe scrollview ou les classes de contrôleur de vue individuelles? – JustANoob

+0

Dans la classe qui contient les scrollviews, et idéalement dans toutes les sous-vues qui contiennent des éléments tactiles (glisser ou appuyer longuement) ou défilables eux-mêmes (collections, tableaux, etc.) – murphguy