2015-01-21 12 views
15

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

+3

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

+0

Danke matt, ich musste nur mein Verständnis überprüfen. – Maverick

+3

Es ist jedoch keine unvernünftige Idee. Sie sollten eine Verbesserungsanfrage bei Apple einreichen. Größenklassen sind zu grobkörnig ... – matt

Antwort

23

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) 
} 
+0

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

+0

Okay, ich habe meinen Downvote weggenommen! :) – matt

+0

Wenn Sie dies verwenden möchten ** dann verwenden Sie keine Größenklassen ** für Schriftarten – WINSergey

3

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!

+0

Die Frage war: "Wie Sie unterschiedliche Schriftgröße für verschiedene Geräte innerhalb derselben Größenklasse festlegen". Dein Kommentar beantwortet das nicht. – Maverick

+0

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 –

+0

@ 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. –

4

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; 
    } 
} 
0

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; 
} 
10

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.

1

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 
0

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()

Verwandte Themen