IOS Различные размеры шрифта в одном классе для разных устройств
В iOS 8 мы можем разработать другой макет интерфейса для каждого класса размеров. Проблема, с которой я столкнулся, я разработал макет для Compact Width и Regular Height (класс размера для всех iPhone в портрете), но я хочу, чтобы размер шрифтов меньшего размера для устройств размером 3,5 и 4 дюйма (iPhone 4 и 5), а затем относительно больше для 4,7 дюйма (iPhone 6) и более крупных для 5,5-дюймовых (iPhone 6 Plus) устройств. Я искал, но не смог найти решение для установки другого размера шрифта для разных устройств в пределах того же класса.
Ответы
Ответ 1
Изменить: я не рекомендую это больше. Этот подход плохо масштабируется, когда появляются новые устройства. Используйте комбинацию динамических размеров шрифта и шрифтов, специфичных для классов размеров.
Скажем, выходит новая модель iPhone, если вы используете Auto Layout и Size Classes, вам не нужно исправлять все ограничения вручную, чтобы ваше приложение было совместимо с этим новым устройством. Однако вы все равно можете установить размер шрифта 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)
}
Ответ 2
Я работаю с ним в проекте на 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 в качестве разрешения по умолчанию и назначать подходящий размер шрифта (в раскадровке) для каждой метки для этого разрешения. Затем я добавляю 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
, размер шрифта которых необходимо настроить в соответствии с размером устройства.
Ответ 3
Вы можете добиться желаемого эффекта, как показано ниже.
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;
}
}
Ответ 4
Два способа:
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) В каждом элементе пользовательского интерфейса перейдите к инспектору атрибутов, объявите шрифт.
(Знак + отображается слева от поля Размер шрифта. Нажмите на него, выберите подходящий класс размера и объявите размер шрифта.)
Второй вариант мне удобен. Счастливое кодирование!
Ответ 5
Вместо того, чтобы писать код для каждой метки, просто расширьте класс лейблов с помощью своего класса ярлыков, как показано ниже, и он будет автоматически масштабироваться на основе масштабного коэффициента разрешения устройства:
#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
Ответ 6
Создавай так,
#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;
}
Swift Version
func isPhoneDevice() -> Bool {
return UIDevice.current.userInterfaceIdiom == .phone
}
func isDeviceiPad() -> Bool {
return UIDevice.current.userInterfaceIdiom == .pad
}
func isPadProDevice() -> Bool {
let SCREEN_WIDTH = Float(UIScreen.main.bounds.size.width)
let SCREEN_HEIGHT = Float(UIScreen.main.bounds.size.height)
let SCREEN_MAX_LENGTH: Float = fmax(SCREEN_WIDTH, SCREEN_HEIGHT)
return UIDevice.current.userInterfaceIdiom == .pad && SCREEN_MAX_LENGTH == 1366.0
}
func isPhoneXandXSDevice() -> Bool {
let SCREEN_WIDTH = CGFloat(UIScreen.main.bounds.size.width)
let SCREEN_HEIGHT = CGFloat(UIScreen.main.bounds.size.height)
let SCREEN_MAX_LENGTH: CGFloat = fmax(SCREEN_WIDTH, SCREEN_HEIGHT)
return UIDevice.current.userInterfaceIdiom == .phone && SCREEN_MAX_LENGTH == 812.0
}
func isPhoneXSMaxandXRDevice() -> Bool {
let SCREEN_WIDTH = CGFloat(UIScreen.main.bounds.size.width)
let SCREEN_HEIGHT = CGFloat(UIScreen.main.bounds.size.height)
let SCREEN_MAX_LENGTH: CGFloat = fmax(SCREEN_WIDTH, SCREEN_HEIGHT)
return UIDevice.current.userInterfaceIdiom == .phone && SCREEN_MAX_LENGTH == 896.0
}
Ответ 7
Вот как я это сделал. Это написано в 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()