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

War es hilfreich?

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 NSTextContainers, 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top