Classe de taille pour identifier l'iPhone 6 et l'iPhone 6 plus le portrait

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

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.

entrez la description de l'image ici

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.

  1. Ajoutez cette méthode à votre class d'utilitaire.
  2. 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.
  3. 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.

  1. À l'heure actuelle, il n'y a aucun moyen d'identifier de manière unique les portraits du model iPhone 6 en utilisant des classs de taille. Cependant, vous pouvez utiliser une largeur compacte et une hauteur régulière pour concevoir tous les écrans de portraits iPhones
  2. Pour changer la taille de la police, vous devez identifier l'iPhone en cours d'exécution de l'application utilisant le code et définir la taille de la police en fonction de la même
  3. Pour mon exigence – même disposition pour toutes les tailles d'écran – utiliser un multiplicateur dans les largeurs et les hauteurs contraintes. Vérifiez les réponses de Jignesh à cette question pour en savoir plus.

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/

  • iPad et Up
  • iPhone Plus et Down
  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.