web-dev-qa-db-fra.com

Faire grandir la police avec UILabel (redimensionnée par la mise en page automatique) - comment le faire dans Interface Builder?

Dans ne simple application iPhone j'affiche une vignette de lettre (UIView personnalisée avec une image et 2 étiquettes) par le code suivant dans viewDidLoad :

app screenshot

DraggedTile *tile = [[[NSBundle mainBundle] loadNibNamed:@"DraggedTile"
                                                   owner:self
                                                 options:nil] firstObject];
tile.frame = CGRectMake(10 + arc4random_uniform(100),
                        10 + arc4random_uniform(100),
                        kWidth,
                        kHeight);
[self.view addSubview:tile];

Cela fonctionne bien, mais je voudrais faire grandir la tuile de lettre - lorsque je fournis des paramètres de largeur et de hauteur plus grands au CGRectMake.

Donc, dans Xcode 5.1 Interface Builder, j'ouvre le DraggedTile.xib et activez "Disposition automatique".

Ensuite, pour image et letter, j'ajoute des contraintes aux bords gauche, supérieur, droit et inférieur du parent.

Pour l'étiquette letter, j'ai également défini "Lignes" sur 0 et "Priorité de résistance à la compression de contenu" sur 1000 (ici plein écran 1 et plein écran 2 ):

Xcode screenshot

Xcode screenshot

Ensuite, je modifie le code pour utiliser une largeur et une hauteur plus grandes:

tile.frame = CGRectMake(10 + arc4random_uniform(100),
                        10 + arc4random_uniform(100),
                        2 * kWidth,
                        2 * kHeight);

Voici le résultat:

app screenshot

Le fond image et le libellé letter semblent avoir grandi comme prévu.

Cependant, la taille de police de l'étiquette n'a pas augmenté.

J'ai cherché et je pense que j'ai besoin de quelque chose comme tile.letter.adjustsFontSizeToFitWidth = YES. Mais en même temps, je ne peux pas l'utiliser avec "Mise en page automatique" activée ...

Donc ma question est s'il y a une option dans le "Interface Builder" disponible pour augmenter la taille de la police?

MISE À JOUR:

J'ai essayé la suggestion d'ismailgulek pour définir la taille de la police à 200 dans Interface Builder et dans le codetile.letter.adjustsFontSizeToFitWidth = YES et cela semble prometteur (ici plein écran ):

Xcode screenshot

mais j'ai maintenant le problème que j'ai défini 40px comme letter.bottom contrainte dans Interface Builder. Mais que faire si j'ai besoin d'un cadre de carreaux plus grand? Existe-t-il un moyen d'utiliser un pourcentage au lieu d'une valeur absolue en pixels dans cette contrainte?

Et une autre question est de savoir s'il est possible de définir le adjustsFontSizeToFitWidth quelque part dans le générateur d'interface ou dois-je utiliser le code source pour cela? J'ai essayé d'ajouter une clé aux "Attributs d'exécution définis par l'utilisateur" - mais ensuite l'application se bloque au moment de l'exécution:

Xcode screenshot

24
Alexander Farber

adjustsFontSizeToFitWidth la propriété de UILabel n'augmentera pas la taille de la police, c'est uniquement pour réduire selon la documentation: Normalement, le texte de l'étiquette est dessiné avec le font que vous spécifiez dans la propriété de police. Toutefois, si cette propriété est définie sur YES et que le texte dans la propriété text dépasse le rectangle de délimitation de l'étiquette, le récepteur commence à réduire la taille de police jusqu'à ce que la chaîne soit ajustée ou que la taille de police minimale soit atteinte.

Mais si vous définissez une taille de police suffisamment grande (disons 200) et définissez adjustsFontSizeToFitWidth sur YES, je pense que vous obtiendriez des résultats intéressants.

Et n'oubliez pas de définir Baseline comme Align Centers, sinon votre texte pourrait ne pas s'afficher correctement.

Veuillez nous informer de vos résultats.

27
ismailgulek

Pour ceux qui viennent ici par le titre et ont besoin d'une solution simple (après heures d'enquêtes):

Exemple de problème: Si vous utilisez la mise en page automatique et définissez la hauteur UILabel pour qu'elle soit proportionnelle à la hauteur de l'écran, vous obtiendrez un cadre bas pour iPhone (paysage) et élevé pour iPad. Comment ajuster automatiquement la hauteur de police?

Solution: dans Interface Builder,

  1. Définissez "Autoshrink" sur "Minimum font size" et définissez quelque chose pour la taille (cela affecte les textes trop larges, mais requis pour notre solution).
  2. Réglez "Lignes" à, et définissez une taille de police supérieure à l'image que vous obtiendrez sur l'iPad.

Cela entraînera la police augmentée automatiquement à la hauteur actuelle.

14
ishahak

Vous pouvez accomplir ce que vous voulez en définissant le rétrécissement automatique dans votre storyboard. Cela réduira l'étiquette à une échelle minimale/taille explicite lorsque la taille de l'écran devient plus petite. Faites-le fonctionner sur la plus grande taille d'écran, puis assurez-vous qu'il se réduit à la taille souhaitée dans l'aperçu du storyboard.

2
crow

Vous pouvez remplacer la classe dans Interface Builder par votre propre classe dérivée et y redimensionner.

Exemple:

/**
MYLabel does exactly the same like UILabel, except that the font size will automatically shrink 
if the code is executed on an iPhone.
*/

class MYLabel: UILabel {

    var onlyOnceToken: dispatch_once_t = 0

    override func drawRect(rect: CGRect) {

        dispatch_once(&onlyOnceToken) {

            if let usedFont:UIFont = self.font {

                // define your reference size here
                let iPadHeight:CGFloat = 768
                let screenBounds = UIScreen.mainScreen().bounds
                let scale:CGFloat =  screenBounds.height / iPadHeight
                self.font = UIFont(name: usedFont.fontName, size: CGFloat(usedFont.pointSize) * scale)
            }
        }

        super.drawRect(rect)
    }
}

À partir de maintenant, il vous suffit de remplacer la classe ILabel par MYLabel dans inspecteur d'identité de IB et toutes vos polices se redimensionnent automatiquement proportionnellement à vos appareils la taille.

Si vous voulez simplement l'agrandir avec la taille de l'étiquette, remplacez

let screenBounds = UIScreen.mainScreen().bounds

avec

let screenBounds = self.bounds.height

ou toute autre formule d'échelle personnalisée. IFont vous offre des propriétés de mesure supplémentaires que vous pouvez faire beaucoup avec cette approche.

1
JackPearse

La police ne s'agrandira pas automatiquement.
Vous devez l'augmenter/le diminuer vous-même, en IB ou par programme.

0
Lior Pollak