2016-11-16 2 views
2

J'ai un scrollView avec une sous-vue à l'intérieur de celui-ci. Je veux n'importe quel contact en dehors de la sous-vue pour faire défiler la scrollview comme dans n'importe quelle autre circonstance. Mais quand le contact est à l'intérieur de la sous-vue, je ne voudrais pas enregistrer de parchemin (donc je peux utiliser cette touche pour faire glisser).IOS: Comment faire défiler une scrollview uniquement lorsqu'on la touche en dehors d'une sous-vue?

class ViewController: UIViewController { 
    @IBOutlet weak var scrollView: UIScrollView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     scrollView.backgroundColor = UIColor.red 
     scrollView.contentSize = CGSize(width: 1000, height: 1000) 
     let view = UIView(frame: CGRect(x: 600, y: 600, width: 200, height: 200)) 
     view.backgroundColor = UIColor.blue 
     scrollView.addSubview(view) 
    } 
} 

Jusqu'à présent, j'ai essayé beaucoup de choses à faire ce travail. J'ai réussi à faire des cours de douane pour la sous-vue et la scrollview. Dans ces classes I remplacent les méthodes tactiles comme ceci:

class MyScrollView: UIScrollView { 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.isScrollEnabled = true 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.isScrollEnabled = true 
    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.isScrollEnabled = true 
    } 
} 

Pour la scrollview CustomClass je me suis tourné le défilement et la classe personnalisée sous-vue, je l'ai éteint. Cela fonctionne mais il y a un problème majeur que la première touche continue avant les changements isScrollEnabled. Cela signifie que lorsque le défilement est désactivé et que vous voulez faire défiler, vous devez toucher à l'extérieur de la boîte et rien ne se passe, puis faites le même contact et le toucher commence. Ce que je cherche est un moyen de réaliser où un toucher est, changer les paramètres de défilement et puis sur cette même touche encore défiler ou ne pas défiler en fonction de ce que le réglage est.

A votre santé, toute aide est appréciée.

Répondre

0

Probablement la meilleure façon de le faire est d'ajouter une UIPanGestureRecognizer factice à la vue bleu comme ceci:

blueView.addGestureRecognizer(UIPanGestureRecognizer()) 

Même si il n'y a pas d'action, cela va faire le travail parce qu'un contact sera assurée par la sous-vue d'abord et seulement ensuite traitées par UIScrollViewUIPagGestureRecognizer.

+0

Cela répond à la question que j'ai posée mais ne résout pas réellement mon problème. Ce que je cherchais (et je n'ai pas mentionné dans la question), c'est que le blueView réponde alors à mon contact pour que je puisse y glisser. Quand j'ajoute le panGesture, il arrête le scrollView mais il ne me laisse pas faire glisser et sélectionner des choses dans la vue bleue. Comment ferais-je cela? –

+0

@LewisBlack Ok, donc vous avez des sous-vues à l'intérieur de blueView, non? Vous pouvez ajouter des reconnaisseurs de panoramique à ces sous-vues à la place. Ils auront une priorité plus élevée que le geste de panoramique de blueView. – alexburtnik