2010-10-25 2 views
28

Die Signatur dieser Methode ist:iPhone - der Eingangsparameter auf UIView der sizeThatFits Methode

- (CGSize)sizeThatFits:(CGSize)size 

Ich verstehe nicht, was die Größenparameter für verwendet wird. Apples documentation besagt, dass es "die aktuelle Größe des Empfängers" ist.

Aber der Empfänger weiß vermutlich seine aktuelle Größe. Also warum muss es weitergegeben werden?

Wenn ich experimentell andere Werte übergebe, scheint die Methode trotzdem die aktuelle Größe des Empfängers zu verwenden.

Kann mir jemand erklären? Und gibt es Fälle, in denen dieser Parameter eine Rolle spielt?

Antwort

26

Zunächst ist diese Methode AppKit Legacy (nicht im negativen Sinne des Wortes).

Ja, jede Ansicht hat zu einem bestimmten Zeitpunkt eine aktuelle Größe und kann sie aus der Eigenschaft bounds abrufen. Aber es gibt knifflige Situationen während des Layouts, wenn die beste Größe von nicht ganz statischen Faktoren abhängt. Nehmen Sie zum Beispiel ein Textlabel. Es kann in einer oder mehreren Zeilen fließen und die Anzahl der Zeilen kann von der maximal zulässigen Breite abhängen. So könnte eine mögliche UILabel-Implementierung ihre Begrenzungsgröße von der Breite der CGSize ableiten, die an sizeThatFits übergeben wurde: In diesem Fall ist diese Größe nicht wörtlich die aktuelle Größe des Empfängers, sondern eine gewünschte/Begrenzungsgröße.

So kann jede UIView-Unterklasse -sizeThatFits: nach eigenem Ermessen (Wortspiel beabsichtigt) implementieren, und es ist sogar möglich, den Size-Parameter zu ignorieren. Meistens, wenn ich diese Methode implementieren muss, ignoriere ich sie, weil ich sie aus dem internen Zustand der Ansicht berechnen kann, aber in einem komplexeren Szenario müssen Sie möglicherweise den Parameter size verwenden, um sich selbst auf bestimmte Einschränkungen im Layout hinzuweisen.

+1

Mit anderen Worten, die Dokumentation ist falsch, wenn es besagt, dass das Argument die Größe des Empfängers ist und es in der Tat die Größe ist, die das Elternteil das Kind bevorzugen würde? Ich habe sicherlich Code auf diese Weise geschrieben, aber ich möchte bestätigen, wenn Sie das meinen. –

+2

Eines ist sicher, die Standardimplementierung von 'sizeToFit' ruft' sizeThatFits: 'auf und übergibt' self.bounds.size'. – Costique

+0

Oh, das wusste ich nicht. Da es undokumentiert ist, habe ich saneSizeToFit in UIView über eine Kategorie definiert, die sizeThatFits mit einer genau definierten Größe aufruft :) –

0

Es ist nicht nur die Größe des Empfängers ist die mögliche Größe Größe, die Sie füllen möchten. Das Ergebnis ist die Größe, von der die Ansicht glaubt, dass sie ihren Inhalt am besten für die gegebene Eingabe size anzeigt.

Das Standardverhalten besteht darin, einfach den Parameter size zurückzugeben (d. H. Die Größe, die der Standardansicht entspricht, entspricht der Größe, die Sie angeben) - also ist dieser Parameter standardmäßig relevant.

Unterklassen können Constraints wie width==height oder andere Dinge wie diese mit dieser Methode erzwingen.

Verwandte Themen