Pregunta Ajustar el tamaño de la fuente UIButton al ancho


Tengo el siguiente código:

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];

El problema es que cuando la cadena en el texto no es larga, muestra bien (1-2 dígitos). Sin embargo, cuando es bastante largo (3 ++ dígitos), todo lo que puedo ver es un botón rojo, sin texto dentro. ¿Cómo ajusto esto?

No creo eso:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

hace el trabajo, ¿verdad?


90
2018-05-30 16:16


origen


Respuestas:


Prueba esto:

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

No estoy seguro de por qué esto hace el truco, pero lo hace :)


236
2018-05-30 17:07



button.titleLabel.adjustsFontSizeToFitWidth = YES;

debería hacer el trabajo por sí mismo si está utilizando diseño automático y han establecido una restricción en el ancho del botón.

Las otras opciones (factor de escala mínimo, número de líneas, etc.) aún se pueden usar para personalizar aún más según sus necesidades, pero no son necesarias.


24
2017-12-30 15:11



La respuesta de EliBud no funciona en iOS 8. Encontré una solución que funciona en iOS 8. A continuación se muestra un código rápido:

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

Puedes jugar con la etiqueta? .LineBreakMode porque descubrí que los resultados varían según los diferentes modos de pausa.


12
2017-12-03 22:57



adjustsFontSizeToFitWidth no funcionaba para mí hasta que establecí una restricción de ancho en mi botón en Interface Builder.

Al establecer la restricción, el botón no aumentó de tamaño y, por lo tanto, no se dio cuenta de que tenía que reducir el tamaño del texto.


7
2017-08-14 18:58



en el último swift esto parece funcionar para mí

button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping

6
2017-08-15 12:27



Solución iOS 10.3 basada en las otras respuestas aquí:

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

Nadie mencionó baselineAdjustment todavía; Lo necesitaba porque la etiqueta del botón se desalinea verticalmente después adjustsFontSizeToFitWidth Toma efecto. Apple baselineAdjustment documentación:

Si el adjustsFontSizeToFitWidth la propiedad está configurada para true, esta   la propiedad controla el comportamiento de las líneas de base de texto en situaciones   donde se requiere el ajuste del tamaño de la fuente. El valor predeterminado de   esta propiedad es alignBaselines. Esta propiedad es efectiva solo cuando   el numberOfLines la propiedad está configurada para 1.


FWIW, nunca podría alinear la etiqueta perfectamente.


5
2018-05-23 23:35



Solución 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);

Terminé configurando el tamaño de fuente para asegurar que la fuente era "grande" antes de que el sistema ajuste el tamaño para que quepa.


3
2018-06-19 19:14



Swift 4 extensión

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

enter image description here


2
2018-06-06 19:52



basado en la respuesta de Nik Kov:

import UIKit


    extension UIButton {
        @IBInspectable var adjustFontSizeToWidth: Bool {
            get {
                return titleLabel!.adjustsFontSizeToFitWidth
            }
            set {
                titleLabel!.adjustsFontSizeToFitWidth = newValue
                titleLabel!.lineBreakMode             = .byClipping
            }
        }
    }

1
2017-07-03 12:58