2017-08-02 2 views
0

Problème: viewWithGesture contient viewUserSees et peut être déplacé dans le containerView bleu. Cependant, viewWithGesture est une sous-vue de containerView, donc lorsque viewWithGesture est à l'extrême (illustré ici - moitié dedans et moitié hors de containerView), seulement la moitié de viewWithGesture répond aux touches, ce qui rend très difficile le déplacement. Note: Je me rends compte que je devrais refaire toutes les maths qui le gardent dans le conteneur et le déplacer en dehors du containerView, mais je suis très curieux d'apprendre comment le faire de la "pire" manière. J'ai fait des recherches sur ce tas et j'ai essayé d'implémenter hittest() et pointInside(), mais jusqu'ici j'ai réussi à faire planter l'application de façon spectaculaire.UIView Touches SuperView ne recevant pas de partie externe

Y a-t-il une bonne façon relativement propre de permettre à l'utilisateur de saisir à l'extérieur du containerView? (swift3 si possible)

EDIT: La boîte verte est transparente et la moitié est dans le containerView et la moitié ne l'est pas.

stupid problem

+0

Quel est le rectangle vert sur la gauche? –

+0

C'est la moitié de viewWithGesture qui est en dehors de containerView. Je suppose que l'utilisation de la transparence n'a pas fonctionné si chaud en illustrant cela maintenant que je le regarde. – solenoid

Répondre

2

Pour une vue de recevoir une touche, la vue et tous ses ancêtres doivent retourner vrai de pointInside:withEvent:.

Normalement, pointInside:withEvent: renvoie la valeur false si le point est en dehors des limites de la vue. Comme une touche dans la zone verte est en dehors des limites de la vue Conteneur, la vue Conteneur renvoie Faux, de sorte que le contact ne touche pas la vue Gestes. Pour résoudre ce problème, vous devez créer une sous-classe pour la vue du conteneur et redéfinir . Dans votre override, renvoyez true si le point est dans les limites de la vue conteneur ou dans les limites de la vue gestuelle. Peut-être que vous pouvez être paresseux (surtout si votre vue de conteneur n'a pas beaucoup de sous-vues) et retourner juste vrai si le point est dans les limites de n'importe quelle sous-vue.

class ContainerView: UIView { 

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 
     if super.point(inside: point, with: event) { return true } 
     for subview in subviews { 
      let subviewPoint = subview.convert(point, from: self) 
      if subview.point(inside: subviewPoint, with: event) { return true } 
     } 
     return false 
    } 

} 
+0

C'est exactement ça, hittest() était un piège, apparemment, et c'est étonnamment propre. Merci pour la bonne explication aussi, d'autres réponses précédentes semblaient être en conflit avec ce qui fonctionnait. – solenoid