2017-08-02 5 views
0

Problem: Die viewWithGesture enthält die ViewUserSees und kann im blauen containerView gezogen werden. Die viewWithGesture ist jedoch eine Unteransicht der containerView. Wenn sich die viewWithGesture also in einem extremen Bereich befindet (hier halb und halb aus der containerView), reagiert nur die Hälfte der viewWithGesture auf Berührungen, was das Ziehen sehr erschwert.UIView Partial Outside superView Keine empfangenen Touches

Hinweis: Mir ist klar, dass ich die ganze Mathematik wiederholen sollte, die es im Container hält und es außerhalb des containerView verschiebt, aber ich bin sehr neugierig zu lernen, wie man das "schlechter" macht.

Ich habe dies eine Reihe erforscht und versucht, Hittest() und PointInside() zu implementieren, aber bisher habe ich es geschafft, die App spektakulär zum Absturz zu bringen.

Gibt es eine gute, relativ saubere Möglichkeit, den Benutzer von außerhalb des ContainerView greifen zu lassen? (swift3 wenn möglich)

EDIT: Die grüne Box ist transparent und die Hälfte davon ist in der Containeransicht und die Hälfte ist nicht.

stupid problem

+0

Was ist das grüne Rechteck auf der linken Seite? –

+0

Das ist die Hälfte der viewWithGesture, die sich außerhalb des containerView befindet. Ich schätze, dass die Verwendung von Transparenz dort nicht so heiß war, um das jetzt zu illustrieren, wenn ich es ansehe. – solenoid

Antwort

2

für eine Ansicht Um muß eine Note, die Aussicht und alle seine Vorfahren zurückkehren von pointInside:withEvent: wahr zu empfangen.

Normalerweise gibt pointInside:withEvent: false zurück, wenn der Punkt außerhalb der Grenzen der Ansicht liegt. Da eine Berührung im grünen Bereich außerhalb der Grenzen der Containeransicht liegt, gibt die Containeransicht false zurück, sodass die Berührung nicht die Gestenansicht trifft.

Um dies zu beheben, müssen Sie eine Unterklasse für die Containeransicht erstellen und deren pointInside:withEvent: überschreiben. Geben Sie in Ihrer Überschreibung true zurück, wenn sich der Punkt in den Grenzen der Containeransicht oder in den Grenzen der Gestenansicht befindet. Vielleicht können Sie faul sein (besonders, wenn Ihre Containeransicht nicht viele Unteransichten hat) und nur true zurückgeben, wenn der Punkt in den Grenzen einer Unteransicht liegt.

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

Das ist es genau, hittest() war anscheinend eine Falle und das ist überraschend sauber. Danke auch für die gute Erklärung, andere vorherige Antworten schienen darüber strittig zu sein, was funktionierte. – solenoid

Verwandte Themen