2015-01-21 14 views
15

W systemie iOS 8 możemy zaprojektować inny układ interfejsu użytkownika dla każdej klasy wielkości. Problem, przed którym stoję, to zaprojektowałem układ dla kompaktowej szerokości i regularnej wysokości (klasa rozmiaru dla wszystkich iPhone'ów w orientacji pionowej), ale chcę, aby rozmiar czcionki etykiet był mniejszy dla urządzeń 3,5 i 4-calowych (iPhone 4 i 5), a następnie względnie większy dla 4,7 cala (iPhone 6) i większy dla urządzeń 5,5 cala (iPhone 6 Plus). Szukałem, ale nie mogę znaleźć rozwiązania, by ustawić inny rozmiar czcionki dla różnych urządzeń w tej samej klasie wielkości.iOS Różne rozmiary czcionek w ramach klasy pojedynczego rozmiaru dla różnych urządzeń

+3

Masz całkowitą rację - nie ma prostego rozwiązania (prawdopodobnie dlatego, że Apple tak naprawdę nie chce, abyś to robił). Jeśli jest to naprawdę ważne, musisz użyć kodu do wykrycia rozmiaru ekranu i zmienić odpowiednio rozmiar czcionki na etykiecie. – matt

+0

Dzięki matowy, wystarczy, że sprawdzę moje zrozumienie. – Maverick

+3

To nie jest jednak nierozsądny pomysł. Powinieneś złożyć prośbę o ulepszenie w Apple. Klasy wielkości są zbyt gruboziarniste ... – matt

Odpowiedz

23

Klasy układu i rozmiaru nie są ukierunkowane na określone rozmiary ekranu, ponieważ nie są do tego przeznaczone. Apple nie chce, abyś kierował reklamy na urządzenia, które pomogą Ci lepiej zarządzać kodem.

Powiedz, że pojawi się nowy model telefonu iPhone, jeśli używasz Automatycznego układania i klasy rozmiarów, nie musisz ręcznie naprawiać wszystkich ograniczeń, aby aplikacja była kompatybilna z tym nowszym urządzeniem. Jednak nadal można ustawić rozmiar czcionki UILabel stosując następujący kod:

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

Nie "działa tak samo dla UILabel". Zmieniasz tylko rozmiar przycisku. Nie ma to wpływu na rozmiar czcionki tekstu. – matt

+0

Dobra, zabrałem moje głosowanie! :) – matt

+0

Jeśli będziesz chciał tego użyć, to ** nie używaj klas wielkości ** dla czcionek – WINSergey

3

dwa sposoby:

1) wprowadzić ręcznie metody w delegata aplikacji, dzielić jego przedmiotu i wywołać metodę.

np

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) Na każdym elemencie interfejsu użytkownika, przejdź do atrybutów inspektora zadeklarować czcionki.

(znajduje się znak + widoczny po lewej stronie pola rozmiaru czcionki. Kliknij na niego, wybierz klasę rozmiar pasujący i deklarować rozmiaru czcionki.)

Druga opcja to wygodne dla mnie. Happy Coding!

+0

Pytanie brzmiało: "Jak ustawić inny rozmiar czcionki dla różnych urządzeń w tej samej klasie wielkości". Twój komentarz nie odpowiada na to pytanie. – Maverick

+0

Jak to zrobić na iPhone6 ​​Plus? Czcionki iPhone6 ​​Plus wyglądają na małe w porównaniu do iPhone5 Telefon iPhone5 i iPhone6Plus mają te same klasy rozmiarów h- Companct v- Regular –

+0

@ Maverick: Ustawianie różnych rozmiarów czcionek dla elementów interfejsu użytkownika na podstawie rozmiaru ekranu urządzenia nie jest dobrą praktyką. Tekst powinien być czytelny i czysty. Proszę zapoznać się z Wytycznymi dotyczącymi interfejsu użytkownika dla Apple. Tak, możemy ustawić inny rozmiar czcionki dla różnych klas wielkości - zalecane. –

4

Możesz osiągnąć pożądany efekt jak poniżej.

Usage :zamiast stosowania 14 jako wielkość czcionkimożna wykorzystać 14.fontSize, to zmienił się na urządzenie, zależy od ciebie wartości delta.

Nie ma potrzeby dodawania warunków everyWhere w kodzie. Tylko jeden raz, jak poniżej.

Zastosowanie: UIFont.font_medium(12.fontSize)

UIFont rozszerzenie:

extension UIFont {  
    class func font_medium(_ size : CGFloat) -> UIFont { 
     return UIFont(name: "EncodeSans-Medium", size: size)!; 
    }  
} 

UIDevice Rozszerzenie:

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 Rozszerzenie:

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

Tworzenie tak,

#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] 

po tym, w którym chcesz zmienić czcionkę etykiety możemy napisać prosty przypadek Przełącznik

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

mam posługiwaniu się nim w projekcie w Swift 3 i powyżej użyciu klasy UILabel niestandardowy, UILabel rozszerzenie i Rozszerzenie UIDevice jako rozwiązanie ogólne.

UIDevice przedłużenie dostać 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 
     } 
    } 

} 

Poniżej rozszerzenie UILabel który wykorzystuje screenType aby dostosować rozmiar czcionki. Metoda adjustsFontSizeToFitDevice może zostać dodana w również w klasie niestandardowej UILabel, ale dodałem ją do rozszerzenia UILabel, aby była dostępna ze wszystkich typów instancji UILabel.

stałą „2” stosowane w adjustsFontSizeToFitDevice sposobu może być zmieniona do dowolnej liczby. Moją logiką jest rozważenie iPhone'a 6/7/8 jako domyślnej rozdzielczości i nadanie odpowiedniej wielkości czcionki (w Storyboard) każdej etykiecie dla tej rozdzielczości. Następnie dodaję 2 punkty dla iPhone X i iPhone 6/7/8 Plus, a odejmuję 2 punkty dla iPhone 4/5.

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

} 

Wreszcie UILabel zwyczaj klasa zastosować regulację czcionki wszystkich etykiet, które są sub-klasyfikowane z MyCustomLabel.

class MyCustomLabel: UILabel { 

    // MARK: - Life Cycle Methods 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     adjustsFontSizeToFitDevice() 
    } 

} 

Zastosowanie: W ujęć, podklasa wszystkie te przypadki UILabel z MyCustomLabel których rozmiar czcionki musi być regulowana w zależności od wielkości urządzenia.

1

Zamiast pisania kodu dla każdej etykiety, nie tylko rozszerzyć swoją klasę etykieta z niestandardowej klasy etykiet jak poniżej, a zostanie ona automatycznie skali na podstawie uchwały urządzenia współczynnik skalowania:

#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

ów sposób, w jaki to zrobiłem. Jest napisany w 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) 
     } 
    } 
} 

Użycie: „Szukałem, ale nie może znaleźć rozwiązanie, aby ustawić inny rozmiar czcionki dla różnych urządzeń w obrębie tej samej klasy wielkości” myawesomeLabel.adjustFontSizeForDevice()

Powiązane problemy