Wie kann ich Kraft Neuzeichnen (drawRect) einen SubView Wenn es Änderungen Abmessungen?
-
10-07-2019 - |
Frage
Ich habe eine UIView, die eine Reihe von Unterklassen von UIView
enthält. Die Unterklasse hat drawRect
außer Kraft gesetzt. Und hat es contentMode = UIViewContentModeRedraw
Da die Benutzer Kürbissen und den Behälter Eltern erstreckt sich die child views
Squash und strecken. Da die Formänderung auftritt, würde Ich mag drawRect
wiederholt den Inhalt der child views
zu ändern genannt haben. Bisher habe ich nicht erfolgreich gewesen. Was ist der richtige Weg, dies zu tun?
Cheers,
Doug
Lösung
In Cocoa, Sie selten (wenn überhaupt) drawRect nennen - Sie markieren gerade die Region oder Ansicht als Update benötigt, und es wird für die Wiederherstellung geplant werden. Dies ermöglicht redraws für mehrere Ungültigkeits zusammen kollabiert werden.
Für Cocoa Touch, Sie wollen entweder [Ansicht setNeedsDisplay] oder setNeedsDisplayinRect: (CGRect)
Andere Tipps
Sie müssen [Ansicht setNeedsLayout] nennen, sollte dies die Subviews verursachen eine drawRect erhalten: aufrufen, wenn die Änderungen am Layout. Ich habe nicht getestet, aber.
Diese Lösung ist ein wenig verrückt, aber es macht logischen Sinn, und hat ein großes visuelles Ergebnis. Ich arbeite mit einem NSLayoutManager
und ein paar NSTextContainer
s, Text in zwei Spalten Auslegen. Da ich mehrere Textcontainer bin mit (und ich bin nicht sicher, ob ich mehrere UITextView
wollen), ich bin das Überschreiben der draw(rect: CGRect)
Methode von MyDrawingView: UIView
.
Das Problem ist, dass die Verwendung von self.contentMode = .redraw
führt immer noch in einigen kleineren Strecken auf Rotation -. Signifikant genug, um ein Deal-Breaker sein
Ich habe bemerkt, dass contentMode = .left
Einstellung oder sogar contentMode = .scaleAspectFit
der Nähe war, was ich wollte, in Bezug auf die pixelgenaue Rotation. Aber offensichtlich war ich nicht die Auslosung Anruf bekomme ich brauchte.
So - ich overrode layoutSubviews()
, schaltete das contentMode
.scaleAspectFit
, genannt super.layoutSubviews()
und schaltete ihn dann zurück. : P
override func layoutSubviews() {
self.contentMode = .scaleAspectFit
super.layoutSubviews()
self.contentMode = .redraw
}
Es ist ... perfekt.