2017-04-22 1 views
0

J'ai une question concernant la manipulation tactile dans iOS/Swift:événements tactiles Forward de superposition UIView à UIScrollView ci-dessous après leur utilisation

Mon projet ressemble à ce

UIViewController 
    → UIView 
      → OverlayView (UIView) 
      → ScrollView (UIScrollView) 

Le OverlayView met au-dessus de l'UIScrollView. Les deux sont des sous-vues de la vue UIViewControllers.

La raison pour laquelle je fais ceci est, que je veux que la vue de défilement se comporte normalement (panoramique, zoom) tandis que la vue de dessus n'est pas affectée par les changements dans le contenu visible de la vue de défilement. De plus, la vue de superposition doit gérer les événements tactiles pour afficher des lignes directrices pour le contenu dans la vue déroulante ci-dessous.

Le problème que je suis face à ce moment est que les événements tactiles (touchesBegan, touchesMoved, touchesEnded, touchesCancelled) sur la vue de recouvrement ne sont pas procédé à la vue de défilement (vue de défilement ne pan/Zoom).

J'ai trouvé une solution pour transférer les événements tactiles à la vue suivante en remplaçant le point(inside point: CGPoint, with event: UIEvent?) -> Bool et en renvoyant false. Mais alors les événements tactiles sur la vue de superposition ne seront pas appelés.

Quelqu'un at-il une idée de la façon de mettre en œuvre ce comportement? J'ai essayé d'appeler tous les événements tactiles sur le répondeur suivant dans la vue de superposition, mais cela n'a pas fonctionné non plus.

Merci pour le conseil de votre aide!

+0

Intstead d'utiliser aperçu scrollview, créer sous-classe de UIScrollView et la poignée touche il – Darshana

+0

. Avez-vous trouvé une solution? –

Répondre

0

Votre meilleur pari serait de rechercher hitTest (docs) - créer une logique dans votre sous-classe (overlay) qui décide quand vous voulez passer les événements tactiles jusqu'à la vue ci-dessous

0

Je pense que vous étiez à droite suivre avec point(inside point: CGPoint, with event: UIEvent?) -> Bool.

Dans votre vue "Superposition", vérifiez si le point se trouve dans une sous-vue. Si c'est le cas, renvoyez true pour autoriser l'interaction avec la sous-vue. Si ce n'est pas le cas, renvoyez false pour passer le contact à la vue de défilement sous-jacente.

class PassThruOverlayView: UIView { 

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 

     for v in subviews { 

      let ptInSub = v.convert(point, from: v.superview) 
      if v.bounds.contains(ptInSub) { 
       return true 
      } 

     } 

     return false 

    } 

} 

Vous pouvez voir un exemple de travail ici (montrant à la fois "Chevauchement ScrollViews" et « UIView Overlay sur ScrollView): https://github.com/DonMag/ScrollViewPassThru

+0

Merci pour votre réponse! Le problème est, que j'ai besoin de l'événement tactile à la fois dans la vue de superposition et la vue de défilement: -/ –

+0

hmmm ... donc, vous voulez - par exemple - appuyez sur bouton dans la vue de superposition et avoir ce déclencheur une action *** et *** ont ce même robinet déclencher quelque chose dans le scrollview sous-jacent? – DonMag

+0

Exactement! De ce fait, j'ai une sorte de toile de dessin dans la vue de défilement et je veux insérer des directives pour le dessin précis à la vue de superposition. La raison pour laquelle je fais cela de cette façon est que je veux que les directives ne soient pas en zoom avec le contenu de la vue déroulante. –