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?


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 :)


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.


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.


.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

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.


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.


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


à 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.


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
            }
        }
    }

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.


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)
        }
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.