2015-01-21 3 views
15

В iOS 8 мы можем разработать различные макеты пользовательского интерфейса для каждого класса размеров. Проблема, с которой я столкнулся, я разработал макет для Compact Width и Regular Height (класс размера для всех iPhone в портрете), но я хочу, чтобы размер шрифтов меньшего размера для устройств размером 3,5 и 4 дюйма (iPhone 4 и 5), а затем относительно больше для 4,7 дюйма (iPhone 6) и более крупных для 5,5-дюймовых (iPhone 6 Plus) устройств. Я искал, но не смог найти решение для установки другого размера шрифта для разных устройств в пределах того же класса.iOS Различные размеры шрифта в одном классе размеров для разных устройств

+3

«Я искал, но не смог найти решение, чтобы установить другой размер шрифта для различных устройств в одном размерном классе.» Вы совершенно правы - нет простого решения (предположительно, потому что Apple действительно не хочет, чтобы вы это делали). Если это действительно важно для вас, вам придется использовать код для определения размера экрана и соответственно изменить размер шрифта на этикетке. – matt

+0

Спасибо, матовый, мне просто нужно было проверить мое понимание. – Maverick

+3

Это не необоснованная идея. Вы должны подать запрос об улучшении с помощью Apple. Размерные классы слишком грубые ... – matt

ответ

23

Автоматические макеты и классы размера не предназначены для конкретных размеров экрана, поскольку они не предназначены для этого. Apple не хочет, чтобы вы настраивали таргетинг на устройства, чтобы лучше поддерживать ваш код.

Скажите, что новая модель iPhone выходит, если вы используете автоматические макеты и классы размеров, вам не нужно исправлять все ограничения вручную, чтобы ваше приложение совместимо с этим более новым устройством. Тем не менее, вы можете установить размер шрифта UILabel, используя следующий код:

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

Это не работает так же для UILabel. Вы просто меняете размер кнопки. Это не влияет на размер шрифта текста. – matt

+0

Хорошо, я забрал свой нижний план! :) – matt

+0

Если вы захотите использовать это, то ** не используйте классы размера ** для шрифтов – WINSergey

3

два способов:

1) Вручную сделать метод в приложении делегата, разделяющий его объект и вызов метод.

например:

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) На каждый пункт пользовательского интерфейса, перейдите к атрибутам инспектору, объявить шрифт.

(Существует + знак виден слева от поля размера шрифта. Нажмите на него, выбрать класс соответствующий размер и объявить размер шрифта.)

Второй вариант удобен для меня. Счастливое кодирование!

+0

Вопрос был: «Как установить другой размер шрифта для разных устройств в пределах того же класса размера». Ваш комментарий не отвечает на это. – Maverick

+0

Как вы это делаете на iPhone6 ​​Plus? Шрифты iPhone6 ​​Plus выглядят небольшими по сравнению с iPhone5 Портфолио iPhone5 и iPhone6Plus имеют одинаковые классы размеров h- Companct v- Regular –

+0

@ Maverick: Установка разного размера шрифта для элементов пользовательского интерфейса на основе размера экрана устройства не является хорошей практикой. Текст должен быть на читаемом шрифте и очищаться. Пожалуйста, ознакомьтесь с Руководством пользователя по пользовательскому интерфейсу Apple. Да, мы можем установить другой размер шрифта для разных классов размеров - рекомендуется. –

4

Вы можете добиться желаемого эффекта, как показано ниже.

Usage :вместо 14, как размер шрифтавы можете использовать 14.fontSize, он будет изменен в соответствии с устройством, зависит от вас дельта значения.

Не нужно добавлять условия каждый в коде. Только один раз, как показано ниже.

Использование: UIFont.font_medium(12.fontSize)

UIFont расширение:

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

UIDevice Расширение:

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 Расширение:

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

Создать, как это,

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

после того, где вы хотите изменить метки шрифт можно написать простой переключатель случай

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

Я обработки его в проекте в Swift 3 и выше с использованием UILabel Пользовательский класс, Расширение UILabel и Расширение UIDevice в качестве общего решения.

расширение UIDevice получить 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 
     } 
    } 

} 

Ниже расширениеUILabel, который использует screenType для настройки размера шрифта. adjustsFontSizeToFitDevice метод может быть добавлен в UILabel пользовательский класс тоже, но я положил его в Расширение UILabel, чтобы сделать его доступным из всех типов экземпляров UILabel.

Константа «2», используемая в методе adjustsFontSizeToFitDevice, может быть изменена на любое желаемое число. Моя логика заключается в том, чтобы рассматривать iPhone 6/7/8 как разрешение по умолчанию и предоставлять подходящий размер шрифта (в Storyboard) на каждую метку для этого разрешения. Затем я добавляю 2 очка для iPhone X и iPhone 6/7/8 Plus, тогда как вычитание 2 очков для 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) 
     } 
    } 

} 

Наконец UILabel пользовательский класс применить настройку шрифта для всех меток, которые к югу от классифицируется MyCustomLabel.

class MyCustomLabel: UILabel { 

    // MARK: - Life Cycle Methods 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     adjustsFontSizeToFitDevice() 
    } 

} 

Использование: В раскадровке, суб-класс все эти экземпляры UILabel из MyCustomLabel чьих размера шрифта должны быть скорректированы в зависимости от размера устройства.

1

Вместо написания кода для каждой этикетки, не только расширить класс этикетки с вашего пользовательского класса этикетки, как показано ниже, и она будет автоматически масштабировать на основе разрешения устройства коэффициент масштабирования:

#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

То будет как я это сделал. Это написано в 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) 
     } 
    } 
} 

ПРИМЕНЕНИЕ: myawesomeLabel.adjustFontSizeForDevice()

Смежные вопросы