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 :
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 ):
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:
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 ):
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:
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.
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,
Cela entraînera la police augmentée automatiquement à la hauteur actuelle.
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.
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.
La police ne s'agrandira pas automatiquement.
Vous devez l'augmenter/le diminuer vous-même, en IB ou par programme.