In iOS 7 sizeWithFont:
ist jetzt veraltet. Wie übergebe ich jetzt das UIFont-Objekt an die Ersetzungsmethode sizeWithAttributes:
?
objective-c
deprecated
ios7
James Kuang
quelle
quelle
NSString
und einUILabel
(nicht immer der Fall, aber oft so), duplizierten Code zu verhindern / etc, können Sie auch ersetzen[UIFont systemFontOfSize:17.0f]
mitlabel.font
- hilft Code Wartung durch Verweisen auf vorhandene Daten vs. Sie es mehrmals oder Referenzierung Konstanten alle über die Eingabe Ort, etcboundingRectWithSize:options:attributes:context:
stattdessen verwenden undCGSizeMake(250.0f, CGFLOAT_MAX)
in den meisten Fällen übergeben.Ich glaube, die Funktion war veraltet, weil diese Reihe von
NSString+UIKit
Funktionen (sizewithFont:...
usw.) auf derUIStringDrawing
Bibliothek basierte , die nicht threadsicher war. Wenn Sie versucht haben, sie nicht im Hauptthread auszuführen (wie bei allen anderenUIKit
Funktionen), treten unvorhersehbare Verhaltensweisen auf. Insbesondere wenn Sie die Funktion auf mehreren Threads gleichzeitig ausgeführt haben, wird Ihre App wahrscheinlich abstürzen. Aus diesem Grund haben sie in iOS 6 dieboundingRectWithSize:...
Methode für eingeführtNSAttributedString
. Dies wurde auf denNSStringDrawing
Bibliotheken aufgebaut und ist threadsicher.Wenn Sie sich die neue
NSString
boundingRectWithSize:...
Funktion ansehen , werden Sie auf die gleiche Weise wie bei a nach einem Attributarray gefragtNSAttributeString
. Wenn ich raten müsste, ist diese neueNSString
Funktion in iOS 7 lediglich ein Wrapper für dieNSAttributeString
Funktion von iOS 6.In diesem Sinne, wenn Sie nur iOS 6 und iOS 7 unterstützen würden, würde ich definitiv alle Ihre
NSString
sizeWithFont:...
auf ändernNSAttributeString
boundingRectWithSize
. Es erspart Ihnen viel Kopfschmerzen, wenn Sie einen seltsamen Multithreading-Eckfall haben! So habe ich konvertiertNSString
sizeWithFont:constrainedToSize:
:Was früher war:
Kann ersetzt werden durch:
Bitte beachten Sie die Dokumentation Erwähnungen:
Um die berechnete Höhe oder Breite herauszuziehen, die für die Größenanpassung von Ansichten verwendet werden soll, würde ich Folgendes verwenden:
quelle
Wie Sie
sizeWithFont
auf der Apple Developer-Website sehen können, ist es veraltet, daher müssen wir es verwendensizeWithAttributes
.quelle
[NSObject respondsToSelector:]
Methode wie hier zu verwenden: stackoverflow.com/a/3863039/1226304Ich habe eine Kategorie erstellt, um dieses Problem zu lösen. Hier ist sie:
Auf diese Weise können nur finden , haben / Ersetzen
sizeWithFont:
mitsizeWithMyFont:
und du bist gut zu gehen.quelle
In iOS7 brauchte ich die Logik, um die richtige Höhe für die Tabellenansicht zurückzugeben: heightForRowAtIndexPath-Methode, aber die sizeWithAttributes geben unabhängig von der Zeichenfolgenlänge immer dieselbe Höhe zurück, da sie nicht wissen, dass sie in eine Tabellenzelle mit fester Breite eingefügt werden . Ich fand das funktioniert gut für mich und berechnet die richtige Höhe unter Berücksichtigung der Breite für die Tabellenzelle! Dies basiert auf der obigen Antwort von Herrn T.
quelle
Für mehrzeilige Beschriftungen mit dynamischer Höhe sind möglicherweise zusätzliche Informationen erforderlich, um die Größe richtig einzustellen. Sie können sizeWithAttributes mit UIFont und NSParagraphStyle verwenden, um sowohl die Schriftart als auch den Zeilenumbruchmodus anzugeben.
Sie würden den Absatzstil definieren und ein NSDictionary wie folgt verwenden:
Sie können CGSize 'adjustedSize' oder CGRect als Eigenschaft rect.size.height verwenden, wenn Sie nach der Höhe suchen.
Weitere Informationen zu NSParagraphStyle finden Sie hier: https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSParagraphStyle_Class/Reference/Reference.html
quelle
quelle
Erstellen Sie eine Funktion, die eine UILabel-Instanz akzeptiert. und gibt CGSize zurück
quelle
tableView.estimatedRowHeight = 68.0 tableView.rowHeight = UITableViewAutomaticDimension
Alternative Lösung
quelle
Aufbauend auf @bitsand ist dies eine neue Methode, die ich gerade zu meiner Kategorie NSString + Extras hinzugefügt habe:
Ich benutze nur die Größe des resultierenden Rahmens.
quelle
Sie können immer noch verwenden
sizeWithFont
. In iOS> = 7.0 führt die Methode jedoch zum Absturz, wenn die Zeichenfolge führende und nachfolgende Leerzeichen oder Endzeilen enthält\n
.Beschneiden von Text vor der Verwendung
Das kann auch für
sizeWithAttributes
und gelten[label sizeToFit]
.Wenn Sie ein
nsstringdrawingtextstorage message sent to deallocated instance
iOS 7.0-Gerät verwenden, wird dies ebenfalls behandelt.quelle
Verwenden Sie besser automatische Abmessungen (Swift):
NB: 1. Der UITableViewCell-Prototyp sollte ordnungsgemäß entworfen sein (für die Instanz nicht vergessen, UILabel.numberOfLines = 0 usw. zu setzen). 2. Entfernen Sie die HeightForRowAtIndexPath-Methode
VIDEO: https://youtu.be/Sz3XfCsSb6k
quelle
quelle
Akzeptierte Antwort in Xamarin wäre (benutze sizeWithAttributes und UITextAttributeFont):
quelle
Als @ Ayush-Antwort:
Angenommen, Sie verwenden ab 2019 wahrscheinlich Swift und
String
anstelle von Objective-c und erhaltenNSString
auf die richtige Weise die Größe einerString
mit vordefinierter Schriftart:quelle
quelle
Hier ist das Monotouch-Äquivalent, wenn jemand es braucht:
welches so verwendet werden kann:
quelle
quelle
Versuchen Sie diese Syntax:
quelle
Nichts davon hat in iOS 7 für mich funktioniert. Hier ist, was ich letztendlich getan habe. Ich füge dies in meine benutzerdefinierte Zellenklasse ein und rufe die Methode in meiner heightForCellAtIndexPath-Methode auf.
Meine Zelle ähnelt der Beschreibungszelle beim Anzeigen einer App im App Store.
Setzen Sie zuerst im Storyboard Ihre Beschriftung auf "attributedText", setzen Sie die Anzahl der Zeilen auf 0 (wodurch die Größe der Beschriftung automatisch geändert wird (nur ios 6+)) und setzen Sie sie auf Zeilenumbruch.
Dann addiere ich einfach alle Höhen des Inhalts der Zelle in meiner benutzerdefinierten Zellenklasse. In meinem Fall habe ich oben eine Beschriftung mit der Aufschrift "Description" (_descriptionHeadingLabel), eine kleinere Beschriftung mit variabler Größe, die die tatsächliche Beschreibung (_descriptionLabel) enthält, eine Einschränkung vom oberen Rand der Zelle bis zur Überschrift (_descriptionHeadingLabelTopConstraint). . Ich habe auch 3 hinzugefügt, um den Boden ein wenig auszuräumen (ungefähr die gleiche Menge Apfel platziert auf der Zelle vom Untertiteltyp.)
Und in meinem Delegierten für Tabellenansicht:
Sie können die if-Anweisung so ändern, dass sie etwas intelligenter ist, und die Zellenkennung tatsächlich aus einer Datenquelle abrufen. In meinem Fall werden die Zellen hartcodiert, da es eine feste Menge von ihnen in einer bestimmten Reihenfolge gibt.
quelle
boundingRectWithSize
in ios 9.2 Probleme darstellen, gibt es andere Ergebnisse als in ios <9.2. Sie haben einen anderen besten Weg gefunden oder kennen ihn, um dies zu erreichen.