tipo san para letra francisco font cursiva cambiar apple aplicacion ios autolayout font-size size-classes

ios - san - letra cursiva iphone instagram



Diferentes tamaños de fuente iOS en una clase de tamaño único para diferentes dispositivos (7)

Así es como lo hice. Está escrito en 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) } } }

USO: myawesomeLabel.adjustFontSizeForDevice()

En iOS 8, podemos diseñar un diseño de interfaz de usuario diferente para cada clase de tamaño. El problema al que me enfrento es que he diseñado un diseño para Ancho Compacto y Altura Regular (clase de tamaño para todos los iPhones en retrato) pero quiero mantener el tamaño de fuente de las etiquetas más pequeñas para dispositivos de 3.5 y 4 pulgadas (iPhone 4 y 5 ), luego relativamente más grande para dispositivos de 4.7 pulgadas (iPhone 6) y más grande para dispositivos de 5.5 pulgadas (iPhone 6 Plus). He buscado pero no puedo encontrar una solución para establecer diferentes tamaños de fuente para diferentes dispositivos dentro de la misma clase de tamaño.


Crea como esto,

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

después de eso, cuando desee cambiar la fuente de la etiqueta, podemos escribir un sencillo conmutador

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 }


Dos caminos:

1) Haga manualmente un método en el delegado de aplicaciones, comparta su objeto y llame al método.

p.ej :

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) En cada elemento de la IU, vaya al inspector de atributos, declare una fuente.

(Hay un signo + visible a la izquierda del campo Tamaño de fuente. Haga clic en él, seleccione la clase de tamaño coincidente y declare el tamaño de fuente).

La segunda opción es conveniente para mí. ¡Feliz codificación!


En lugar de escribir código para todas y cada una de las etiquetas, simplemente extienda su clase de etiqueta con Su clase de etiqueta personalizada como se muestra a continuación y se escalará automáticamente según el factor de escala de la resolución del dispositivo:

#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


Lo estoy manejando en un proyecto en Swift 3+ utilizando una clase UILabel Custom , una extensión UILabel y una extensión UIDevice como solución genérica.

Extensión de UIDevice para obtener 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 } } }

A continuación se encuentra la extensión UILabel que usa screenType para ajustar el tamaño de la fuente. adjustsFontSizeToFitDevice método adjustsFontSizeToFitDevice podría agregarse en la clase personalizada de UILabel , pero lo puse en la extensión de UILabel para hacerlo accesible desde todos los tipos de instancias de UILabel.

La constante "2" utilizada en el método de adjustsFontSizeToFitDevice se puede cambiar a cualquier número deseado. Mi lógica es considerar el iPhone 6/7/8 como resolución predeterminada y proporcionar el tamaño de fuente adecuado (en el Guión gráfico ) a cada etiqueta para esa resolución. Luego, estoy sumando 2 puntos para iPhone X y iPhone 6/7/8 Plus, mientras que resta 2 puntos para 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) } } }

Finalmente, una clase personalizada de UILabel para aplicar el ajuste de fuente a todas las etiquetas que están MyCustomLabel de MyCustomLabel .

class MyCustomLabel: UILabel { // MARK: - Life Cycle Methods override func awakeFromNib() { super.awakeFromNib() adjustsFontSizeToFitDevice() } }

Uso: En Storyboard , asigne una MyCustomLabel todas aquellas instancias de UILabel de MyCustomLabel cuyo tamaño de fuente debe ajustarse según el tamaño del dispositivo.


Edit : ya no recomiendo esto Este enfoque no se adapta bien cuando salen nuevos dispositivos. Utilice una combinación de tamaños de fuente dinámicos y fuentes de tamaño específicas para cada clase.

Supongamos que sale un nuevo modelo de iPhone, si está utilizando Auto Layout y Clases de tamaño, no tiene que corregir todas las restricciones manualmente para que su aplicación sea compatible con este nuevo dispositivo. Sin embargo, aún puede establecer el tamaño de fuente de la UILabel usando el siguiente código:

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


Puede lograr el efecto deseado de la siguiente manera.

Usage : lugar de usar 14 como tamaño de fuente , puede usar 14.fontSize , cambiará según el dispositivo, depende de su valor delta.

No es necesario agregar condiciones en ningún lugar del código. Sólo una vez como a continuación.

Uso: UIFont.font_medium(12.fontSize)

Extensión de UIFont:

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

Extensión de 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 } } }

Extensión de 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; } }