J'ai vu plusieurs exemples pour changer la taille d'un UILabel.
Voici ce que j'aimerais faire : Modifier la taille de la police pour que le texte soit aussi grand que possible dans la nouvelle hauteur.
Des indications ?
J'ai vu plusieurs exemples pour changer la taille d'un UILabel.
Voici ce que j'aimerais faire : Modifier la taille de la police pour que le texte soit aussi grand que possible dans la nouvelle hauteur.
Des indications ?
Désolé, si j'ai manqué quelque chose ici dans tout le texte.
J'ai suivi les suggestions de @Crazyrems pour réduire automatiquement la police de l'étiquette. Cela ajuste effectivement la police en fonction de la largeur comme l'ont remarqué d'autres.
Ensuite, j'ai simplement défini 'Lines' sur 0 dans la section police de l'UILabel dans Xcode. En code, cela devrait être numberOfLines
. C'est tout.
Crédit à @Mikrasya, qui a suggéré cette solution dans l'un des commentaires ci-dessus.
Testé sur Xcode 7.3 et iOS 9.3.2.
Pardonnez-moi si je me trompe mais tout ce qui est mentionné ici est inutile. Redéfinissez votre police juste après le changement avec une nouvelle taille de police de yourLabel.height
Vous pouvez également vérifier une comparaison conditionnelle entre ces valeurs (yourLabel.height et fontSize) pour éviter des mises à jour inutiles.
Tout ce que vous avez à faire est :
[yourLabel setFont:[UIFont fontWithName="*votre nom de police*" size:yourLabel.frame.size.height]];
J'ai créé une macro pour le faire pour vous
///Met à l'échelle la taille de la police vers le haut (ou vers le bas) jusqu'à ce que le texte s'adapte à la hauteur de l'étiquette, ne se mettra pas à jour automatiquement, doit être appelé chaque fois que le texte est mis à jour. Le cadre de l'étiquette doit être défini avant l'appel
#define scaleFontSizeToFillHeight(__label) {\
__label.font = [UIFont fontWithName:__label.font.fontName size:__label.frame.size.height*2.0f];\
UIFont *__currentFont = __label.font;\
CGFloat __originalFontSize = __currentFont.pointSize;\
CGSize __currentSize = [__label.text sizeWithAttributes:@{NSFontAttributeName : __currentFont}];\
while (__currentSize.height > __label.frame.size.height && __currentFont.pointSize > (__originalFontSize * __label.minimumScaleFactor)) {\
__currentFont = [__currentFont fontWithSize:__currentFont.pointSize - 1];\
__currentSize = [__label.text sizeWithAttributes:@{NSFontAttributeName : __currentFont}];\
}\
__label.font = __currentFont;\
}
La réponse acceptée contient un bug. La variable distance doit être un flottant, sinon elle peut renvoyer une taille de police trop grande. De plus, l'utilisation de "- (CGSize)sizeWithFont:(UIFont *)font;" est obsolète. Voici le code avec ces 2 problèmes corrigés.
+ (UIFont *)findAdaptiveFontWithName:(NSString *)fontName forUILabelSize:(float)maxHeight withMaxFontSize:(int)maxFontSize
{
UIFont *tempFont = nil;
NSString *testString = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
NSInteger tempMin = 0;
NSInteger tempMax = maxFontSize;
NSInteger mid = 0;
float difference = 0;
while (tempMin <= tempMax) {
mid = tempMin + (tempMax - tempMin) / 2;
tempFont = [UIFont fontWithName:fontName size:mid];
UILabel* dummyLabel = [[UILabel alloc] initWithFrame:CGRectZero];
dummyLabel.text = testString;
dummyLabel.font = tempFont;
[dummyLabel sizeToFit];
difference = maxHeight - dummyLabel.bounds.size.height;
if (mid == tempMin || mid == tempMax) {
if (difference < 0) {
return [UIFont fontWithName:fontName size:(mid - 1)];
}
return [UIFont fontWithName:fontName size:mid];
}
if (difference < 0) {
tempMax = mid - 1;
} else if (difference > 0) {
tempMin = mid + 1;
} else {
return [UIFont fontWithName:fontName size:mid];
}
}
return [UIFont fontWithName:fontName size:mid];
}
Cela semblait fonctionner pour moi, j'ai sous-classé UILabel et dans le layoutSubviews j'ai vérifié la hauteur actuelle et ajusté la taille de la police en conséquence.
import UIKit
class HeightAdjustableLabel: UILabel {
override func layoutSubviews() {
super.layoutSubviews()
if frame.height < font.pointSize + 2 {
font = font.withSize(frame.height - 2)
}
}
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Je viens de réaliser que réaliser une recherche binaire ou autre est totalement inutile. Vous n'avez qu'à itérer (quelques fois) en utilisant une recherche de ratio. C'est tout simple. Je vais coller le code complet dans ma réponse.
1 votes
.. solution complète pour 2016 stackoverflow.com/a/37277874/294884 Code très simple.