Xcode 6 hat eine neue Funktion in den Schriftart und Schriftgrößen in UILabel
, UITextField
und UIButton
automatisch auf der Grundlage der Größenklasse der aktuellen Gerätekonfiguration direkt im Storyboard festgelegt werden können. Sie können beispielsweise festlegen UILabel
, dass die Schriftgröße 12 für Konfigurationen mit "beliebiger Breite und kompakter Höhe" (z. B. bei iPhones im Querformat) und die Größe 18 für Konfigurationen mit "normaler Breite und normaler Höhe" (z. B. auf iPads ) verwendet wird. Weitere Informationen finden Sie hier:
developer.apple.com/size_class
Dies ist theoretisch eine großartige Funktion, da es möglicherweise unnötig wird, programmgesteuert unterschiedliche Schriftarten für UI-Funktionen basierend auf der Gerätekonfiguration festzulegen. Im Moment habe ich einen bedingten Code, der die Schriftarten basierend auf dem Gerätetyp festlegt, aber das bedeutet natürlich, dass ich die Schriftarten überall in der App programmgesteuert festlegen muss. Ich war anfangs sehr aufgeregt über diese Funktion, aber ich stellte fest, dass es ein ernstes Problem der tatsächlichen Nutzung für mich gibt (möglicherweise ein Fehler). Beachten Sie, dass ich gegen SDK 8 baue und ein Mindestbereitstellungsziel für iOS 8 festlege. Dies hat also nichts mit der Kompatibilität mit alten Versionen von iOS zu tun.
Das Problem ist folgendes: Wenn ich unterschiedliche Schriftgrößen für unterschiedliche Größenklassen einstelle und die von iOS bereitgestellte Schriftart "System" verwende , funktioniert alles wie erwartet, und die Schriftgrößen ändern sich je nach Größenklasse. Wenn ich eine von meiner Anwendung bereitgestellte benutzerdefinierte Schriftart verwende (ja, ich habe sie in meinem Anwendungspaket korrekt eingerichtet, da sie programmgesteuert funktioniert) und die benutzerdefinierte Schriftart auf eine Beschriftung in einem XCode 6-Storyboard setze , funktioniert dies ebenfalls wie erwartet. Wenn ich jedoch versuche, verschiedene Größen der benutzerdefinierten Schriftart für verschiedene Größenklassen im Storyboard zu verwenden, funktioniert dies plötzlich nicht mehr. Der einzige Unterschied in der Konfiguration ist die von mir gewählte Schriftart (eine benutzerdefinierte im Vergleich zur Systemschriftart). Stattdessen werden alle Schriftarten auf dem angezeigtGerät und Simulator als Standardsystemschriftart in der Standardgröße , unabhängig von der Größenklasse (und ich habe über den Debugger überprüft, dass die Systemschriftart die im Storyboard angegebene ersetzt). Grundsätzlich scheint die Größenklassenfunktion für benutzerdefinierte Schriftarten nicht zu funktionieren. Interessanterweise werden die benutzerdefinierten Schriftarten im XCode 6-Bereich "Vorschau" für den Ansichts-Controller tatsächlich angezeigt und passen die Größe richtig an: Sie funktionieren nur dann nicht mehr, wenn sie auf dem tatsächlichen iOS-System ausgeführt werden (was mich glauben lässt, dass ich sie richtig konfiguriere). .
Ich habe mehrere verschiedene benutzerdefinierte Schriftarten ausprobiert und es scheint für keine von ihnen zu funktionieren, aber es funktioniert immer, wenn ich stattdessen "System" verwende.
Wie auch immer, hat jemand anderes dieses Problem in Xcode 6 gesehen ?
Irgendwelche Ideen, ob dies ein Fehler in iOS 8, Xcode oder so ist
Mache ich falsch
Die einzige Problemumgehung, die ich gefunden habe, besteht darin, die Schriftarten weiterhin programmgesteuert festzulegen, wie ich es für etwa drei Versionen von iOS getan habe, da dies funktioniert.
Aber ich würde gerne in der Lage sein, diese Funktion zu verwenden, wenn ich sie mit benutzerdefinierten Schriftarten zum Laufen bringen könnte. Die Verwendung der Systemschriftart ist für unser Design nicht akzeptabel.
ZUSÄTZLICHE INFORMATIONEN: Ab Xcode 8.0 ist der Fehler behoben.
quelle
Antworten:
Schnelle Lösung:
1) Legen Sie Schriftarten als System für Größenklassen fest
2) Unterklasse UILabel und überschreibe die Methode "layoutSubviews" wie folgt:
Übrigens ist es eine sehr praktische Technik für ikonische Schriftarten
quelle
self.label.font = ...
diese Weise können Sie verschiedene Schriftarten an verschiedenen Stellen verwenden.Nachdem ich alles ausprobiert hatte, entschied ich mich schließlich für eine Kombination der oben genannten Lösungen. Verwenden von Xcode 7.2, Swift 2.
@IBInspectable
Mit dieser Option können Sie die Schriftgröße im Storyboard festlegendidSet
Beobachter verwendet, um die Fallstricke vonlayoutSubviews()
(Endlosschleife fürawakeFromNib()
Zeilenhöhen in der dynamischen Tabellenansicht) und (siehe Kommentar von @ cocoaNoob) zu vermeiden.@IBDesignable
@IBDesignable
nicht mittraitCollection
diesem anderen StapelartikelUIScreen.mainScreen()
nichtself
gemäß diesem Stapelartikel ausgeführtquelle
Problemumgehung für
UILabel
: Behalten Sie für alle Größenklassen die gleiche Schriftgröße bei, ändern Sie jedoch stattdessen die Beschriftungshöhe in jeder Größenklasse entsprechend. Auf Ihrem Etikett muss Autoshrink aktiviert sein. In meinem Fall hat es gut funktioniert.quelle
adjustsFontSizeToFitWidth
scheint nur für die Breite zu funktionieren (was ich nicht verwenden kann, da der Text der Beschriftungen dynamisch ist).Dieser (und andere mit Xcode - Größenklassen zusammenhängende) Fehler verursachte mir in letzter Zeit ernsthaften Kummer, als ich eine riesige Storyboard-Datei durchgehen musste, um Dinge wegzuhacken.
Für alle anderen in dieser Position möchte ich zusätzlich zu @ razor28s Antwort etwas hinzufügen, um die Schmerzen zu lindern.
Verwenden
IBInspectable
Sie in der Header-Datei Ihrer benutzerdefinierten Unterklasse für Ihre Laufzeitattribute. Dadurch werden diese Attribute über den "Attributes Inspector" visuell direkt über der Standardposition für die Schriftarteinstellungen zugänglich.Anwendungsbeispiel:
Dies wird diese Ausgabe sehr hilfreich erzeugen:
Ein zusätzlicher Vorteil ist, dass wir jetzt die Laufzeitattribute nicht mehr manuell für jedes Etikett hinzufügen müssen. Dies ist das, was ich dem beabsichtigten Verhalten von XCode am nächsten kommen kann. Hoffentlich ist mit iOS 9 in diesem Sommer eine richtige Lösung auf dem Weg.
quelle
Ähnliche Lösung wie bei @ razor28, aber ich denke etwas universeller. Funktioniert auch gut mit älteren iOS-Versionen
https://gist.github.com/softmaxsg/8a3ce30331f9f07f023e
quelle
Der Fehler ist in XCode 7.0 GM weiterhin gültig.
Die Lösung von Razor28 verursacht in einigen Fällen Endlosschleifen. Meine Erfahrung war mit der Verwendung in Verbindung mit SwipeView .
Stattdessen schlage ich vor, dass Sie:
1) Unterklasse UILabel und überschreiben setFont:
2) Legen Sie die benutzerdefinierte Klasse Ihrer UILabels fest und legen Sie dann die Schriftgrößenklassen mithilfe der Systemschrift fest
quelle
Das Problem besteht weiterhin darin, dass Sie die Funktion nicht zum Festlegen von Schriftarten für verschiedene Größenklassen im Interface Builder verwenden können.
Stellen Sie einfach die Schriftart basierend auf dem gewünschten Gerät wie folgt ein:
Dies funktioniert perfekt auf allen Geräten.
quelle
Nichts davon hat bei mir funktioniert, aber das hat funktioniert. Sie müssen auch die Systemschriftart in IB verwenden
quelle
Immer noch keine unterschriebene richtige Antwort. Dieser Code funktioniert gut für mich. Sie müssen zuerst die Schriftgröße für Größenklassen im Interface Builder deaktivieren. In IB können Sie eine benutzerdefinierte Schriftart verwenden.
quelle
Eine Kombination einiger der oben genannten späteren Antworten war hilfreich. So habe ich den IB-Fehler über eine Swift UILabel-Erweiterung behoben:
quelle
Ich benutze Swift, XCode 6.4. Das habe ich also getan
Gehe zu Designer -> Identitätsinspektor -> Setze die Klasse auf ExUILabel
Gehen Sie dann im Designer zum Attributinspektor und legen Sie den Schriftartnamen fest.
quelle
Ich habe mir eine noch schnellere Lösung ausgedacht (ich gehe davon aus, dass Sie immer Ihre einzige benutzerdefinierte Schriftart verwenden).
Erstellen Sie eine Kategorie für UILabel und fügen Sie sie mithilfe eines fehlerhaften Storyboards mit Größenklassen und dedizierten Schriftarteneinstellungen für verschiedene Klassen in Dateien ein:
Verwenden Sie einfach Ihre benutzerdefinierten Schriftarten im Storyboard. Wenn ein fehlerhafter Interpreter stattdessen eine Systemschrift verwendet, wird diese Kategorie in Ihre benutzerdefinierte Schriftart umgeschaltet.
quelle
Ich hatte das gleiche Problem und fand eine nicht wirklich klare, aber gute Lösung!
quelle
quelle