Ajuster la taille de la police UIButton à la largeur

122

J'ai le code suivant:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 0.0, 25, 25);

[[button layer] setCornerRadius:5.0f];
[[button layer] setMasksToBounds:YES];
[[button layer] setBackgroundColor:[[UIColor redColor] CGColor]];
[button.titleLabel setFrame:CGRectMake(0,0, 25, 25)];

[button setTitle:[NSString stringWithFormat:@"%@", [[topics objectAtIndex:indexPath.row] unread]] forState:UIControlStateNormal];

Le problème est que lorsque la chaîne dans le texte n'est pas longue, elle s'affiche correctement (1-2 chiffres). Cependant, quand il est assez long (3 ++ chiffres), tout ce que je peux voir est un bouton rouge, sans texte à l'intérieur. Comment régler cela?

Je ne pense pas que:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

fait le travail, non?

adit
la source
Cela devrait fonctionner, ou theLabel.adjustsFontSizeToFitWidth = YES.
Luc
Cela fonctionne partitleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

Réponses:

291

Essaye ça:

button.titleLabel.numberOfLines = 1;
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINE

Je ne sais pas pourquoi cela fait l'affaire, mais c'est le cas :)

elibud
la source
1
merci, alors que button.titleLabel.lineBreakMode = UILineBreakModeClip; <- MAGIC LINE est déprécié maintenant
yunas
8
@yunas Remplacez UILineBreakModeClip par NSLineBreakByClipping
CodeReaper
1
Nvm, qui vient de le changer numberOfLinesà 0
Marty
34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

devrait faire le travail seul si vous utilisez la mise en page automatique et avez défini une contrainte sur la largeur du bouton.

Les autres options (facteur d'échelle minimum, nombre de lignes, etc.) peuvent toujours être utilisées pour personnaliser davantage en fonction de vos besoins, mais ne sont pas obligatoires.

Joakim
la source
15

La réponse d'EliBud ne fonctionne pas sur iOS 8. J'ai trouvé une solution qui fonctionne sur iOS 8. Voici un code swift:

let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)

Vous pouvez jouer avec le label? .LineBreakMode car j'ai constaté que les résultats varient selon les modes de pause.

Alexandre Belyavskiy
la source
.adjustsFontSizeToFitWidth = true - comment puis-je faire la même chose avec un NSTextField et une fenêtre redimensionnable?
Leo Dabus
Cela me semble identique à l'utilisation de Xcode IB en sélectionnant l'étiquette et en la définissant sur l'échelle de police minimale Autoshrink à 0,01
Leo Dabus
il n'y a pas d'option de réduction automatique lors de l'utilisation de NSTextField
Leo Dabus
UITextField a une option pour réduire automatiquement le texte, contrairement à NSTextField. Je pense donc que vous devez ajuster manuellement la police pour l'adapter à la largeur du champ de texte.
Alexander Belyavskiy
10

dans le dernier swift cela semble fonctionner pour moi

button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping
Tolbard
la source
10

Solution iOS 10.3 basée sur les autres réponses ici:

    button.titleLabel!.numberOfLines = 1
    button.titleLabel!.adjustsFontSizeToFitWidth = true
    button.titleLabel!.baselineAdjustment = .alignCenters

Personne n'a baselineAdjustmentencore mentionné ; J'en avais besoin parce que l'étiquette du bouton est désalignée verticalement après avoir adjustsFontSizeToFitWidthpris effet. Apple baselineAdjustmentdocumentation:

Si la adjustsFontSizeToFitWidthpropriété est définie sur true, cette propriété contrôle le comportement des lignes de base de texte dans les situations où l'ajustement de la taille de police est requis. La valeur par défaut de cette propriété est alignBaselines. Cette propriété est effective uniquement lorsque la numberOfLinespropriété est définie sur 1.


FWIW, je n'ai jamais pu obtenir l'étiquette parfaitement alignée.

Chiot
la source
8

adjustsFontSizeToFitWidth ne fonctionnait pas pour moi jusqu'à ce que je définisse une contrainte de largeur sur mon bouton dans Interface Builder.

La définition de la contrainte a empêché le bouton de grossir et donc de ne pas se rendre compte qu'il devait réduire le texte.

kraftydevil
la source
8

Extension Swift 4

extension UIButton {
    @IBInspectable var adjustFontSizeToWidth: Bool {
        get {
            return self.titleLabel?.adjustsFontSizeToFitWidth
        }
        set {
            self.titleLabel?.numberOfLines = 1
            self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
            self.titleLabel?.lineBreakMode = .byClipping;
            self.titleLabel?.baselineAdjustment = .alignCenters 
        }
    }
}

entrez la description de l'image ici

Nik Kov
la source
à quoi sert le tag?
Zaporozhchenko Oleksandr
Pour être disponible pour faire le getter
Nik Kov
Pouvez-vous décrire plus en détail ce que vous voulez dire, s'il vous plaît?
Zaporozhchenko Oleksandr
J'utilise une balise comme un drapeau pour définir si le réglage est activé.
Nik Kov
pourquoi n'utilisez-vous pas simplement self.titleLabel? .adjustsFontSizeToFitWidth? pourquoi avez-vous besoin de quelque chose de plus?
Zaporozhchenko Oleksandr
3

Solution Xamarin.iOS

var accountButton = new UIButton();
accountButton.SetTitle("Account", UIControlState.Normal);            
accountButton.TitleLabel.AdjustsFontSizeToFitWidth = true;
accountButton.TitleLabel.Lines = 1;
accountButton.TitleLabel.LineBreakMode = UILineBreakMode.Clip;
accountButton.TitleLabel.Font = accountButton.TitleLabel.Font.WithSize(35);

J'ai fini par définir la taille de la police pour m'assurer que la police était «grande» avant que le système ajuste la taille pour l'adapter.

ben
la source
3

basé sur la réponse de Nik Kov:

import UIKit


    extension UIButton {
        @IBInspectable var adjustFontSizeToWidth: Bool {
            get {
                return titleLabel!.adjustsFontSizeToFitWidth
            }
            set {
                titleLabel!.adjustsFontSizeToFitWidth = newValue
                titleLabel!.lineBreakMode             = .byClipping
            }
        }
    }
Zaporozhchenko Oleksandr
la source
Cela fonctionne, mais la taille de la police diminue beaucoup, comme de 17 à 12. Existe-t-il un moyen d'augmenter la largeur de l'étiquette de titre lorsque la chaîne est plus grande?
R. Mohan
@ R.Mohan bien sûr, mais tout cela sur une largeur fixe. Faites simplement des contraintes non fixées, et cela augmentera. Ne placez pas les deux en tête / en bas, ou ne faites pas l'un d'eux> =
Zaporozhchenko Oleksandr
0

La solution ci-dessous a fonctionné pour moi:

button.titleLabel?.adjustsFontForContentSizeCategory = true

La documentation du développeur explique cette propriété comme suit:

Valeur booléenne indiquant si l'objet met automatiquement à jour sa police lorsque la catégorie de taille de contenu du périphérique change.

Vinayak
la source
0

Dans iOS 13.1 avec Swift 5, je devais prévoir contentEdgeInsetségalement d'ajuster les rembourrages.

extension UIButton {
    @IBInspectable var adjustFontSizeToWidth: Bool {
        get {
            return self.titleLabel?.adjustsFontSizeToFitWidth ?? false
        }
        set {
            self.titleLabel?.numberOfLines = 1
            self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
            self.titleLabel?.lineBreakMode = .byClipping;
            self.titleLabel?.baselineAdjustment = .alignCenters
            self.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        }
    }
}
Bharat
la source