In iOS7 sizeWithFont
ist veraltet, also verwende ich boundingRectWithSize
(was einen CGRect-Wert zurückgibt). Mein Code:
UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
// you can use your font.
CGSize maximumLabelSize = CGSizeMake(310, 9999);
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:fontText}
context:nil];
expectedLabelSize = CGSizeMake(textRect.size.width, textRect.size.height);
In textRect
bekomme ich eine Größe größer als meine maximumLabelSize
, eine andere Größe als bei der Verwendung sizeWithFont
. Wie kann ich dieses Problem beheben?
objective-c
nsstring
ios7
uilabel
Nirav Jain
quelle
quelle
Antworten:
Wie wäre es mit einem neuen Label erstellen und verwenden
sizeThatFit:(CGSize)size
?Bearbeiten: Dieser obere Code ist nicht für iOS 7 und höher geeignet. Verwenden Sie ihn daher bitte unten:
quelle
Möglicherweise müssen Sie der in dieser Antwort vorgeschlagenen Methode eine zusätzliche Option hinzufügen:
quelle
boundingRectWithSize
kaputt. Ich habe unter iOS 7, 7.1.1 getestet und es werden nicht korrekte Ergebnisse zurückgegeben.Hier ist mein Arbeitscode-Snippet:
Ich habe der berechneten Höhe 4 Pixel hinzugefügt, da ohne diese 4 Pixel eine Zeile fehlt.
Ich verwende dieses Code-Snippet in einer Tabellenansicht und füge die "Höhe" einem Array von NSNumbers hinzu, und ich erhalte die richtige Zellenhöhe für das Standard-TextLabel.
Fügen Sie 4 weitere Pixel hinzu, wenn Sie mehr Platz unter dem Text im textLabel wünschen.
**** UPDATE ****
Ich bin mit dem "Breitenfehler von 40px" nicht einverstanden, ich rufe die 4px der fehlenden Höhe, weil 4px die Standardhöhe eines Leerzeichens zwischen einem Buchstaben und dem Rand einer einzelnen Zeile ist. Sie können dies mit einem UILabel überprüfen. Für eine Schriftgröße von 16 benötigen Sie eine UILabel-Höhe von 20.
Aber wenn Ihre letzte Zeile kein "g" oder was auch immer enthält, könnte die Messung die 4px Höhe verfehlen.
Ich habe es mit einer kleinen Methode erneut überprüft. Ich erhalte eine genaue Höhe von 20,40 oder 60 für mein Etikett und eine richtige Breite von weniger als 300 Pixel.
Um iOS6 und iOS7 zu unterstützen, können Sie meine Methode verwenden:
**** AKTUALISIERUNG ****
Dank Ihrer Kommentare habe ich meine Funktion wie folgt aktualisiert. Da sizeWithFont veraltet ist und Sie in XCode eine Warnung erhalten, habe ich den Diagnose-Pragma-Code hinzugefügt, um die Warnung für diesen bestimmten Funktionsaufruf / Codeblock zu entfernen.
Zusätzlich zum 4px-Thema: Je nachdem, welche Schriftart und Schriftgröße Sie verwenden, gibt die Berechnung unterschiedliche Höhenwerte zurück. In meinem Fall: HelveticaNeue-Medium mit einer Schriftgröße von 16,0 gibt eine Zeilenhöhe von 20,0 für eine einzelne Zeile, aber 39,0 für zwei Zeilen zurück, 78 Pixel für 4 Zeilen -> 1 Pixel fehlt für jede Zeile - beginnend mit Zeile 2 - aber Sie möchten Um Ihre Schriftgröße + 4px Zeilenabstand für jede Zeile zu haben, müssen Sie ein Höhenergebnis erhalten.
Bitte beachten Sie dies beim Codieren!
Ich habe noch keine Funktion für dieses "Problem", aber ich werde diesen Beitrag aktualisieren, wenn ich fertig bin.
quelle
Wenn ich das richtig verstehe, verwenden Sie boundingRectWithSize: Nur um die Größe zu erhalten, die Sie mit sizeWithFont erhalten würden (dh Sie möchten direkt die CGSize, nicht die CGRect)?
Das sieht so aus, wie Sie es suchen:
Ersatz für veraltete GrößeWithFont: in iOS 7?
Sie verwenden sizeWithAttributes:, um die Größe als Ersatz für sizeWithFont zu erhalten.
Erhalten Sie mit so etwas immer noch die falsche Größe:
quelle
Der Kommentar von @ SoftDesigner hat bei mir funktioniert
quelle
Um die Größe der Etikettenlaufzeit zu ermitteln, ist sizewithfont für iOS 7.0 veraltet. Stattdessen müssen Sie -boundingRectWithSize: options: attribute: context: method verwenden
Sie können es wie unten Code verwenden
Hier müssen Sie der maximalen Länge Breite geben, um Höhe oder Breite zu ermitteln.
versuchen Sie dies, es funktioniert für mich.
quelle