Comment identifier de façon unique les écrans de portraits iPhone 6 et iPhone 6 plus en utilisant des classs de taille?
Mon application semble bien dans iPhone 4 et iPhone 5 mais la même apparence avec beaucoup d'espaces vides dans l'iPhone 6 et 6 plus en raison de la taille des écrans. Bien que j'utilise la layout automatique je ne peux pas augmenter la taille de la police ou la taille de la vue uniquement pour iPhone 6 et 6 plus seul. Je savais que nous pouvions changer la taille de la police et la taille de la vue en utilisant des classs de taille. mais dans mon cas, je ne sais pas quoi faire.
J'utilise xCode 6.1 et mon application prend en charge iOS 7 à iOS 8.1. Je ne m'attends à une solution que dans les storyboards, car je fais entièrement mes plans d'interface user en storyboard. Si le story-board a une fonctionnalité limitée pour répondre à mes besoins, veuillez me dire comment réaliser la même chose avec le code à travers l'application?
Une autre option pour ajuster la taille de la police en fonction du type d'iPhone consiste à utiliser les 'Atsortingbuts d'exécution définis par l'user'.
Définir une extension à 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 } } }
Afin de déterminer le nom du model actuel, s'il vous plaît se référer à la réponse suivante: https://stackoverflow.com/a/26962452/4165128
Sur le storyboard, select l'label que vous souhaitez ajuster, ouvrez le volet droit, select l'inspecteur d'identité et ajoutez la propriété 'adjustFontToRealIPhoneSize' à la list des attributes d'exécution définis par l'user (avec le type 'Boolean' et la case cochée).
Faites de même pour chaque label que vous souhaitez ajuster (copyr et coller fonctionne étonnamment ici).
Utiliser la largeur compacte et la hauteur régulière dans le storyboard
Ajouter une contrainte de layout de hauteur et de largeur relative avec super vue en ajoutant un multiplicateur. Disons que vous avez une vue d'image qui a la taille de la moitié de la super vue puis ajoutez le multiplicateur 0.5.
Découvrez la reference de class ajustementsFontSizeToFitWidth @ UILabel . Cela vous permettra de faire de bons ajustements en fonction des différents appareils.
label.adjustsFontSizeToFitWidth = YES;
Je n'ai pas trop idée de sizeClass pour une taille de police différente sur différents appareils iPhone mais j'ai trouvé cette solution.
- Ajoutez cette méthode à votre class d'utilitaire.
- Il suffit de passer votre super vue à cette méthode, cette méthode est récursive donc si vous passez self.view que toutes les sous-vues sont définies.
- Changez la taille de votre police selon vos besoins.
-(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]; } } }
La version rapide de @iBhaviks répond:
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() }
Peut-être que vous pourriez définir la taille de police parfaite pour les grands écrans, puis réglez Autoshrink
à minimum font size
avec la taille parfaite pour les petits écrans, de cette façon vous pouvez avoir une taille de police dynamic sans encoding.
Vous devrez définir les contraintes de l'label pour ajuster sa taille avec la taille de l'écran de toute façon.
J'espère que cette aide
Après beaucoup de difficultés, je trouve juste quelque chose pour mon besoin, et j'envoie la même chose pour les futurs lecteurs.
EDIT 24-SEP-2015 J'ai récemment trouvé un moyen de personnaliser votre class de taille en utilisant UITraitColleection
uniquement pour l'iPhone 6 plus, donc vous n'avez pas besoin d'écrire beaucoup de code. J'espère que ce lien aidera quelqu'un à l'avenir.
J'ai tardé à cela, mais j'avais besoin d'une label qui s'adapte à n'importe quel appareil et qui utilise cette méthode.
Créer une nouvelle sous-class de UILabel et dans le file .h mettre ceci …
#import <UIKit/UIKit.h> IB_DESIGNABLE @interface OTHD_ScalableLabel : UILabel @property (nonatomic, assign) IBInspectable CGFloat fontScale; @end
et dans le file .m mettre cela …
#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
Vous pouvez alors simplement changer votre class dans IB et en utilisant IBInspectable, vous serez en mesure de faire évoluer l'label vers le haut ou vers le bas. Évidemment, pour les pédantistes, ce n'est pas une bonne idée pour un usage général, mais il y a des cas où vous pourriez avoir besoin, par exemple, d'une grande label qui s'affiche en plein écran sur un iPhone ou en plein écran sur un iPad.
Voici un exemple de fonction que j'utilise pour basculer entre deux tailles de police différentes à l'exécution. Il décide quelle police utiliser en fonction de la class de taille horizontale – qui divise essentiellement les périphériques en deux groupes "iPad" et "iPhone". Voici une bonne reference sur laquelle les appareils appartiennent à quelles classs de taille: http://useyourloaf.com/blog/size-classs/
func chooseFont(compactFont: UIFont, regularFont: UIFont) -> UIFont { let appDelegate = UIApplication.shared.delegate as! AppDelegate return appDelegate.window!.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.compact ? compactFont : regularFont }
Basé sur votre capture d'écran, je suggère d'utiliser le type dynamic. De cette façon, l'user est en charge de la taille du text.