ios - Clase de tamaño para identificar iPhone 6 y iPhone 6 más retrato
ios8 xcode6 (10)
¿Cómo identificar de forma única las pantallas de retrato de iPhone 6 y iPhone 6 más usando clases de tamaño?
Mi aplicación se ve bien en iPhone 4 y iPhone 5, pero se ve igual con muchos espacios vacíos en iPhone 6 y 6 más debido a los tamaños de pantalla. Aunque estoy usando el diseño automático, no puedo aumentar el tamaño de la fuente o el tamaño de la vista solo para iPhone 6 y 6 plus solo. Sabía que podemos cambiar el tamaño de fuente y el tamaño de la vista usando clases de tamaño. Pero en mi caso no sé qué hacer.
Estoy usando xCode 6.1 y mi aplicación es compatible con iOS 7 hasta la última versión de iOS 8.1. Estoy esperando una solución solo en los guiones gráficos al igual que estoy haciendo mis diseños de UI completamente en el guión gráfico. Si el guión gráfico tiene una funcionalidad limitada para satisfacer mis necesidades, ¿me permite saber cómo lograr lo mismo con el código a través de la aplicación?
No tengo demasiada idea de sizeClass para diferentes tamaños de fuente en diferentes dispositivos iPhone, pero me di cuenta con esta solución.
- Agregue este método a su clase de utilidad.
- Simplemente pase su súper vista a este método, este método es recursivo, por lo tanto, si pasa su propia vista, se establecerán todas las subvistas.
- Cambia el tamaño de letra que necesites.
-(void)setAllFonts:(UIView *)view
{
CGFloat fontSizeDiff = 0.0;
if (IS_IPHONE_6)
{
fontSizeDiff = 1;
}
else if (IS_IPHONE_6PLUS)
{
fontSizeDiff = 2;
}
for (UIView *vw in [view subviews])
{
if ([vw isKindOfClass:[UILabel class]] || [vw isKindOfClass:[UIButton class]])
{
if ([vw isKindOfClass:[UILabel class]])
{
UIFont *font = [(UILabel *)vw font];
[(UILabel *)vw setFont:[UIFont fontWithName:font.fontName size:font.pointSize+fontSizeDiff]];
}
else
{
UIFont *font = [(UIButton *)vw titleLabel].font;
[(UIButton *)vw titleLabel].font = [UIFont fontWithName:font.fontName size:font.pointSize+fontSizeDiff];
}
}
else if ([vw isKindOfClass:[UIView class]] || [vw isKindOfClass:[UIScrollView class]])
{
[self setAllFonts:vw];
}
}
}
Basado en su captura de pantalla, sugeriría usar Dynamic Type. De esa manera el usuario se encarga del tamaño del texto.
Después de un montón de problemas, encontré algo para mi necesidad, así que publico lo mismo para los futuros lectores.
- A partir de ahora no hay manera de identificar de manera única los retratos del modelo de iPhone 6 utilizando clases de Tamaño. Sin embargo, puede usar el ancho compacto y la altura regular para diseñar para todas las pantallas verticales de iPhones
- Para cambiar el tamaño de la fuente, debe identificar en qué iPhone se está ejecutando la aplicación actualmente utilizando el código y establecer el tamaño de la fuente en función del mismo
- Para mi requerimiento - el mismo diseño para todos los tamaños de pantalla - use multiplicador en anchos y alturas con restricciones. Verifique las respuestas de Jignesh para esta pregunta para saber más sobre esto.
EDITAR 24-SEP-2015 Recientemente encontré una forma de personalizar su clase de tamaño usando UITraitColleection
solo para iPhone 6 plus, por lo que no necesita escribir mucho código. Espero que este link ayude a alguien en el futuro.
Echa un vistazo a ajustaFontSizeToFitWidth @ UILabel Class Reference . Esto le permitirá hacer algunos ajustes agradables basados en los diferentes dispositivos.
label.adjustsFontSizeToFitWidth = YES;
Este es un ejemplo de una función que utilizo para alternar entre dos tamaños de fuente diferentes en tiempo de ejecución. Decide qué fuente usar según la clase de tamaño horizontal, que básicamente divide los dispositivos en dos grupos, "iPad" y "iPhone". Aquí hay una buena referencia sobre qué dispositivos pertenecen a qué clases de tamaño: http://useyourloaf.com/blog/size-classes/
- iPad y arriba
- iPhone Plus y Down
func chooseFont(compactFont: UIFont, regularFont: UIFont) -> UIFont { let appDelegate = UIApplication.shared.delegate as! AppDelegate return appDelegate.window!.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.compact ? compactFont : regularFont }
La versión Swift de @iBhaviks responde:
func getFontScaleForDevice() -> CGFloat {
var sizeScale = CGFloat(1.0)
if DeviceType.IS_IPHONE_6 {
sizeScale = 1.2
} else if DeviceType.IS_IPHONE_6P {
sizeScale = 1.4
} else if DeviceType.IS_IPAD {
sizeScale = 1.4
}
return sizeScale
}
func setAllFonts(targetView:UIView, scale:CGFloat) {
for vw in targetView.subviews {
if let vl = vw as? UILabel {
vl.font = vl.font.fontWithSize(round(vl.font.pointSize * scale))
} else if let vb = vw as? UIButton, vbl = vb.titleLabel {
vbl.font = vbl.font.fontWithSize(vbl.font.pointSize * scale)
} else if vw.subviews.count > 0 {
setAllFonts(vw, scale: scale)
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
let sizeScale = getFontScaleForDevice()
if sizeScale > CGFloat(1.0) {
setAllFonts(view, scale: sizeScale)
}
view.layoutIfNeeded()
}
Otra opción para ajustar el tamaño de fuente según el tipo de iPhone, es usar ''Atributos de tiempo de ejecución definidos por el usuario''.
Definir una extensión para UILabel:
extension UILabel {
var adjustFontToRealIPhoneSize: Bool {
set {
if newValue {
var currentFont = self.font
var sizeScale: CGFloat = 1
let model = UIDevice.CurrentDevice().modelName()
if model == "iPhone 6" {
sizeScale = 1.3
}
else if model == "iPhone 6 Plus" {
sizeScale = 1.5
}
self.font = currentFont.fontWithSize(currentFont.pointSize * sizeScale)
}
}
get {
return false
}
}
}
Para determinar el nombre del modelo actual, consulte la siguiente respuesta: https://.com/a/26962452/4165128
En el guión gráfico, seleccione la etiqueta que desea ajustar, abra el panel derecho, seleccione el inspector de identidad y agregue la propiedad ''adjustFontToRealIPhoneSize'' a la lista de atributos de tiempo de ejecución definidos por el usuario (con el tipo ''Booleano'' y casilla de verificación marcada).
Haga lo mismo con cada etiqueta que desee ajustar (copiar y pegar funciona sorprendentemente aquí).
Poco tarde para esto, pero necesitaba una etiqueta que se escalaría a cualquier dispositivo y usé este método.
Cree una nueva subclase de UILabel y en el archivo .h ponga esto ...
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface OTHD_ScalableLabel : UILabel
@property (nonatomic, assign) IBInspectable CGFloat fontScale;
@end
y en el archivo .m pon esto ...
#import "OTHD_ScalableLabel.h"
@implementation OTHD_ScalableLabel
- (void) layoutSubviews
{
[super layoutSubviews];
if( self.fontScale < 0.1 || self.fontScale > 1.0 ) self.fontScale = 1.0;
CGFloat height = CGRectGetHeight(self.bounds) * self.fontScale;
if( height ) self.font = [UIFont fontWithName:self.font.fontName size:height];
}
@end
Luego puede simplemente cambiar su clase en IB y al usar IBInspectable podrá escalar la etiqueta hacia arriba o hacia abajo. Obviamente, para la pedantía que hay por ahí, esto no es una buena idea para uso general, pero hay algunos casos en los que podría necesitar, por ejemplo, una etiqueta grande que se muestre a pantalla completa en un iPhone, así como a pantalla completa en un iPad.
Tal vez podría establecer el tamaño de fuente perfecto para las pantallas grandes, y luego configurar Autoshrink
al minimum font size
con el tamaño perfecto para las pantallas pequeñas, de esa manera puede tener un tamaño de fuente dinámico sin codificación.
Tendrá que establecer las restricciones para que la etiqueta ajuste su tamaño con el tamaño de la pantalla de todos modos.
Espero que esto ayude
Usa el ancho compacto y la altura regular en el guión gráfico.
Agregue la restricción de diseño de la altura y el ancho en relación con la vista superior agregando el multiplicador. Digamos que tiene una vista de imagen que tiene el tamaño de la mitad de la vista superior, luego agregue el multiplicador 0.5