In iOS 8 können wir für jede Größenklasse ein anderes UI-Layout entwerfen. Das Problem, mit dem ich konfrontiert bin, ist, ich habe ein Layout für kompakte Breite und normale Höhe entworfen (Größenklasse für alle iPhones im Hochformat), aber ich möchte die Schriftgröße von Etiketten für 3,5 und 4 Zoll Geräte (iPhone 4 und 5) kleiner halten), dann relativ größer für 4,7 Zoll (iPhone 6) und größer für 5,5 Zoll (iPhone 6 Plus) Geräte. Ich habe gesucht, aber keine Lösung gefunden, um unterschiedliche Schriftgrößen für verschiedene Geräte innerhalb derselben Größenklasse festzulegen.iOS Verschiedene Schriftgrößen innerhalb einer einzelnen Größenklasse für verschiedene Geräte
Antwort
Auto-Layout- und Größenklassen zielen nicht auf bestimmte Bildschirmgrößen ab, da sie nicht dafür gedacht sind. Apple möchte nicht, dass Sie auf Geräte ausrichten, damit Sie Ihren Code besser pflegen können.
Sagen Sie, ein neues iPhone-Modell kommt heraus, wenn Sie Auto-Layout und Größenklassen verwenden, müssen Sie nicht alle Einschränkungen manuell korrigieren, um Ihre App mit diesem neueren Gerät kompatibel zu machen. Sie können jedoch nach wie vor die Schriftgröße der UILabel
mit dem folgenden Code ein:
if UIScreen.mainScreen().bounds.size.height == 480 {
// iPhone 4
label.font = label.font.fontWithSize(20)
} else if UIScreen.mainScreen().bounds.size.height == 568 {
// IPhone 5
label.font = label.font.fontWithSize(20)
} else if UIScreen.mainScreen().bounds.size.width == 375 {
// iPhone 6
label.font = label.font.fontWithSize(20)
} else if UIScreen.mainScreen().bounds.size.width == 414 {
// iPhone 6+
label.font = label.font.fontWithSize(20)
} else if UIScreen.mainScreen().bounds.size.width == 768 {
// iPad
label.font = label.font.fontWithSize(20)
}
Es funktioniert nicht "gleich für ein UILabel". Sie ändern lediglich die Größe einer Schaltfläche. Das hat keinen Einfluss auf die Schriftgröße von Text. – matt
Okay, ich habe meinen Downvote weggenommen! :) – matt
Wenn Sie dies verwenden möchten ** dann verwenden Sie keine Größenklassen ** für Schriftarten – WINSergey
Zwei Möglichkeiten:
1) manuell ein Verfahren in AppDelegate machen, ihr Ziel und Call-Methode teilen.
zB:
var device = UIDevice.currentDevice().model
if (device == "iPhone" || device == "iPhone Simulator" || device == "iPod touch")
{
labelboarder.frame = CGRectMake(0,self.usernameTF.frame.height-10, self.usernameTF.frame.width, 1)
labelboarder1.frame = CGRectMake(0,self.usernameTF.frame.height-10, self.usernameTF.frame.width,1)
}
else
{
labelboarder.frame = CGRectMake(0,self.usernameTF.frame.height, 500, 1)
labelboarder1.frame = CGRectMake(0,self.usernameTF.frame.height, 500,1)
}
2) Auf jedem UI Element gehen, um Attribut Inspektoren, eine Schrift erklären.
(Es gibt einen + links von Schriftgröße Feld sichtbar unterzeichnen. Darauf klicken, wählen Sie die Größenklasse Anpassung und erklären Schriftgröße.)
Die zweite Option ist für mich bequem. Glückliche Kodierung!
Die Frage war: "Wie Sie unterschiedliche Schriftgröße für verschiedene Geräte innerhalb derselben Größenklasse festlegen". Dein Kommentar beantwortet das nicht. – Maverick
Wie machst du es auf iPhone6 Plus? iPhone6 Plus Schriftarten sieht klein aus im Vergleich zu iPhone5 iPhone5 und iPhone6Plus Portrain haben die gleichen Größenklassen h- Companct v- Regular –
@ Maverick: Einstellung unterschiedlicher Schriftgröße für UI-Elemente auf der Grundlage der Bildschirmgröße des Geräts ist keine gute Praxis. Der Text sollte in lesbarer Schriftgröße und klar sein. Bitte beziehen Sie sich auf die Human-UI-Richtlinien von Apple. Ja, wir können verschiedene Schriftgrößen für verschiedene Größenklassen festlegen - das ist empfehlenswert. –
Sie können gewünschten Effekt wie folgt erreichen.
Usage :
statt 14 als Schriftgröße mitSie 14.fontSize
verwenden kann, wird es geändert, wie pro Gerät, hängt von Ihnen Delta-Wert.
Keine Notwendigkeit, Bedingungen zu addieren woWhere in Code. Nur einmal wie unten.
Usage: UIFont.font_medium(12.fontSize)
UIFont extension:
extension UIFont {
class func font_medium(_ size : CGFloat) -> UIFont {
return UIFont(name: "EncodeSans-Medium", size: size)!;
}
}
UIDevice extension:
extension UIDevice {
enum DeviceTypes {
case iPhone4_4s
case iPhone5_5s
case iPhone6_6s
case iPhone6p_6ps
case after_iPhone6p_6ps
}
static var deviceType : DeviceTypes {
switch UIScreen.main.height {
case 480.0:
return .iPhone4_4s
case 568.0:
return .iPhone5_5s
case 667.0:
return .iPhone6_6s
case 736.0:
return .iPhone6p_6ps
default:
return .after_iPhone6p_6ps
}
}
}
Int Erweiterung:
extension Int{
var fontSize : CGFloat {
var deltaSize : CGFloat = 0;
switch (UIDevice.deviceType) {
case .iPhone4_4s,
.iPhone5_5s :
deltaSize = -1;
case .iPhone6_6s :
deltaSize = 2;
case .iPhone6p_6ps :
deltaSize = 2;
default:
deltaSize = 0;
}
let selfValue = self;
return CGFloat(selfValue) + deltaSize;
}
}
wie folgt erstellen,
#define VIEWHEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define VIEWWIDTH ([[UIScreen mainScreen] bounds].size.width)
#define FONTNAME_LIGHT @"AppleSDGothicNeo-Regular"
#define FONTNAME_BOLD @"AppleSDGothicNeo-Bold"
#define LFONT_16 [UIFont fontWithName:FONTNAME_LIGHT size:16]
danach, wo Sie wollen Label Schriftart ändern wir einfach wechseln Fall
switch ((VIEWHEIGHT == 568)?1:((VIEWHEIGHT == 667)?2:3)) {
case 1:{
boldFont = BFONT_16;
}
break;
case 2:{
privacyFont = LFONT_18;
boldFont = BFONT_18;
}
break;
default:{
privacyFont = LFONT_20;
boldFont = BFONT_20;
}
break;
}
es in einem Projektabwicklung in schreiben kann ich Swift 3 und höher mit einem UILabel Benutzerdefinierte Klasse, UILabel Erweiterung und UIDevice Erweiterung als generische Lösung.
UIDevice Erweiterung bekommen screenType
:
public extension UIDevice {
var iPhone: Bool {
return UIDevice().userInterfaceIdiom == .phone
}
enum ScreenType: String {
case iPhone4
case iPhone5
case iPhone6
case iPhone6Plus
case iPhoneX
case Unknown
}
var screenType: ScreenType {
guard iPhone else { return .Unknown}
switch UIScreen.main.nativeBounds.height {
case 960:
return .iPhone4
case 1136:
return .iPhone5
case 1334:
return .iPhone6
case 2208:
return .iPhone6Plus
case 2436:
return .iPhoneX
default:
return .Unknown
}
}
}
Im Anschluss an die UILabel Erweiterung die screenType
verwendet Schriftgröße einzustellen. adjustsFontSizeToFitDevice
Methode könnte hinzugefügt werden in UILabel benutzerdefinierte Klasse auch, aber ich habe es in UILelextension, um es von allen Arten von UILabel-Instanzen zugänglich machen.
Die Konstante "2", die in adjustsFontSizeToFitDevice
Methode verwendet wird, kann auf jede gewünschte Anzahl geändert werden. Meine Logik ist, iPhone 6/7/8 als Standardauflösung zu betrachten, und geben Sie jedem Etikett für diese Auflösung passende Schriftgröße (in Storyboard). Dann füge ich 2 Punkte für iPhone X und iPhone 6/7/8 Plus hinzu, während ich 2 Punkte für iPhone 4/5 subtrahiere.
extension UILabel {
func adjustsFontSizeToFitDevice() {
switch UIDevice().screenType {
case .iPhone4, .iPhone5:
font = font.withSize(font.pointSize - 2)
break
case .iPhone6Plus, .iPhoneX:
font = font.withSize(font.pointSize + 2)
break
default:
font = font.withSize(font.pointSize)
}
}
}
Endlich eine UILabel benutzerdefinierte Klasse Schriftart Anpassung an alle Etiketten anzuwenden, die von MyCustomLabel
Unter eingestuft sind.
class MyCustomLabel: UILabel {
// MARK: - Life Cycle Methods
override func awakeFromNib() {
super.awakeFromNib()
adjustsFontSizeToFitDevice()
}
}
Verbrauch: In Storyboard, Unterklasse alle jene Fälle von UILabel aus MyCustomLabel
deren Schriftgröße eingestellt werden muss je nach Gerätegröße.
Anstatt das Schreiben von Code für jedes Etikett, nicht nur Ihr Label Klasse mit Ihrer eigenen Label-Klasse erweitern wie unten und es wird automatisch auf dem Gerät Auflösung basierend skala Skalierungsfaktor:
#define SCALE_FACTOR_H ([UIScreen mainScreen].bounds.size.height/568)
CustomLabel.h
#import <UIKit/UIKit.h>
@interface CustomLabel : UILabel
@end
CustomLabel.m
#import "CustomLabel.h"
@implementation CustomLabel
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
- (id)initWithCoder:(NSCoder *)aDecoder {
if((self = [super initWithCoder:aDecoder])){
[self layoutIfNeeded];
[self configurefont];
}
return self;
}
- (void) configurefont {
CGFloat newFontSize = (self.font.pointSize * SCALE_FACTOR_H);
self.font = [UIFont fontWithName:self.font.fontName size:newFontSize];
}
@end
Das ist die wie ich es gemacht habe. Es ist in Swift 4 :)
enum DeviceSize {
case big, medium, small
}
protocol Fontadjustable {
var devicetype: DeviceSize { get }
func adjustFontSizeForDevice()
}
extension UILabel: Fontadjustable {
var devicetype: DeviceSize {
switch UIScreen.main.nativeBounds.height {
case 1136:
return .small
case 1334:
return .medium
case 2208:
return .big
case 2436:
return .big
default:
return .big
}
}
func adjustFontSizeForDevice() {
switch self.devicetype {
case .small:
self.font = font.withSize(font.pointSize)
case .medium:
self.font = font.withSize(font.pointSize + 5)
case .big:
self.font = font.withSize(font.pointSize + 10)
}
}
}
USAGE geschrieben: „Ich habe gesucht, aber nicht in der Lage, eine Lösung zu finden, andere Schriftgröße für verschiedene Geräte innerhalb derselben Größenklasse zu setzen“ myawesomeLabel.adjustFontSizeForDevice()
- 1. Verschiedene Schriftgrößen auf verschiedenen Geräten in der gleichen Größenklasse
- 2. Verschiedene Schriftgrößen für UILabel mit adaptivem Layout
- 3. Storyboards: Auto-Layout für verschiedene Geräte Bildschirme
- 4. So stellen Sie verschiedene Startdatei (xib, nicht Bild starten) für verschiedene Geräte für iOS-Anwendung
- 5. Wie verschiedene Schriftgrößen in Android verwenden?
- 6. css verschiedene Schriftgrößen auf verschiedenen Familien
- 7. r ggplot2: verschiedene Schriftgrößen in der Legende
- 8. Graphviz (DOT), verschiedene Schriftgrößen auf demselben Etikett
- 9. Wie verschiedene UI-Elemente für iPhone und iPad mit Größenklasse
- 10. Android doppelte Registrierungs-ID für verschiedene Geräte
- 11. Adressen variieren für verschiedene Android-Geräte?
- 12. Wie die Bildgröße für verschiedene Geräte dpi
- 13. Verschiedene hitArea basierend auf Geräte
- 14. Javascript: Ist es möglich, verschiedene Schriftgrößen für verschiedene Texte in einem 2D-Canvas festzulegen?
- 15. Gibt es eine Möglichkeit, unterschiedliche Anzeigenamen für verschiedene iOS-Geräte in einer universellen App anzugeben?
- 16. Andere Einschränkungen für verschiedene Größenklassen
- 17. Autolayout vs. verschiedene XIB für verschiedene Formfaktoren?
- 18. verschiedene Kernel für verschiedene Architekturen
- 19. Verschiedene Daten für verschiedene Benutzer
- 20. Verschiedene Bilder für verschiedene Dimensionen
- 21. Verschiedene Menü für verschiedene Fragmente
- 22. verschiedene Konfigurationsdateien für verschiedene Server
- 23. Responsive Design: verschiedene Bilder für verschiedene Bildschirmgrößen
- 24. Skalieren von Bildschirmgrößen von Webanwendungen für verschiedene Geräte
- 25. Namenskonvention für neue iOS-Geräte
- 26. Verschiedene Slicer für verschiedene Visualisierungen in PowerBI
- 27. Flex Mobile: Verschiedene Dateinamen für Android/iOS
- 28. Verschiedene CollectionViewFlowLayout für andere Abschnitt IOS
- 29. iOS UI Automation für verschiedene Sprachen
- 30. Wie verwendet man verschiedene Schriftgrößen in ggplot facet wrap Etiketten?
Sie haben recht - es gibt keine einfache Lösung (vermutlich, weil Apple das nicht wirklich will). Wenn es wirklich wichtig für Sie ist, müssen Sie Code verwenden, um die Bildschirmgröße zu erkennen und die Schriftgröße des Etiketts entsprechend zu ändern. – matt
Danke matt, ich musste nur mein Verständnis überprüfen. – Maverick
Es ist jedoch keine unvernünftige Idee. Sie sollten eine Verbesserungsanfrage bei Apple einreichen. Größenklassen sind zu grobkörnig ... – matt