Ajuste el tamaño de fuente UIButton al ancho

122

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, se 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 que

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

hace el trabajo, ¿verdad?

adit
fuente
Debería funcionar, o theLabel.adjustsFontSizeToFitWidth = YES.
Lucas
Funciona portitleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

Respuestas:

291

Prueba esto:

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

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

elibud
fuente
1
gracias, mientras que button.titleLabel.lineBreakMode = UILineBreakModeClip; <- MAGIC LINE se deprecia ahora
yunas
8
@yunas Reemplazar UILineBreakModeClip con NSLineBreakByClipping
CodeReaper
1
Nvm, eso solo lo hizo cambiar numberOfLinesa 0
Marty
34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

debe hacer el trabajo por sí solo si está utilizando Auto-Layout y ha 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 utilizar para personalizar aún más según sus necesidades, pero no son necesarias.

joakim
fuente
15

La respuesta de EliBud no funciona en iOS 8. Encontré una solución que funciona en iOS 8. A continuación hay 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 label? .LineBreakMode ya que descubrí que los resultados varían para los diferentes modos de pausa.

Alexander Belyavskiy
fuente
.adjustsFontSizeToFitWidth = true: ¿cómo puedo hacer lo mismo con un NSTextField y una ventana de tamaño variable?
Leo Dabus
Eso me parece lo mismo que usar la etiqueta de selección Xcode IB y configurarla en la escala de fuente mínima de Autoshrink a 0.01
Leo Dabus el
no hay opción de AutoShrink cuando se usa NSTextField
Leo Dabus el
UITextField tiene una opción para reducir automáticamente el texto, mientras que NSTextField no. Entonces, creo que necesita ajustar manualmente la fuente para que se ajuste al ancho del campo de texto.
Alexander Belyavskiy
10

en última hora esto parece funcionar para mí

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

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ó baselineAdjustmenttodavía; Lo necesitaba porque la etiqueta del botón se desalinea verticalmente después de que adjustsFontSizeToFitWidthsurta efecto. baselineAdjustmentDocumentación de Apple :

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


FWIW, nunca pude alinear la etiqueta perfectamente.

Cachorro
fuente
8

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

Establecer la restricción evitó que el botón creciera de tamaño y, por lo tanto, no darse cuenta de que tenía que reducir el texto.

kraftydevil
fuente
8

Extensión 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 
        }
    }
}

ingrese la descripción de la imagen aquí

Nik Kov
fuente
¿para qué usas la etiqueta?
Zaporozhchenko Oleksandr
Para estar disponible para hacer el captador
Nik Kov
¿Puedes describir más profundamente a qué te refieres, por favor?
Zaporozhchenko Oleksandr
Yo uso la etiqueta como una bandera para definir si el ajuste habilitado.
Nik Kov
¿Por qué no usas self.titleLabel? .adjustsFontSizeToFitWidth? ¿para qué necesitas algo extra?
Zaporozhchenko Oleksandr
3

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 asegurarme de que la fuente era "grande" antes de que el sistema ajustara el tamaño para que se ajustara.

ben
fuente
3

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
            }
        }
    }
Zaporozhchenko Oleksandr
fuente
Esto funciona, pero el tamaño de la fuente está disminuyendo mucho, como de 17 a 12. ¿Hay alguna forma de aumentar el ancho de la etiqueta del título cuando la cadena es más grande?
R. Mohan
@ R. Mohan seguro, pero todo esto se trata de ancho fijo. Simplemente haga que las restricciones no sean fijas y crecerá. No establezca los dos primeros / últimos, ni haga uno de ellos> =
Zaporozhchenko Oleksandr
0

La siguiente solución funcionó para mí:

button.titleLabel?.adjustsFontForContentSizeCategory = true

La documentación del desarrollador explica esta propiedad como:

Un valor booleano que indica si el objeto actualiza automáticamente su fuente cuando cambia la categoría de tamaño de contenido del dispositivo.

Vinayak
fuente
0

En iOS 13.1 con Swift 5, tuve que proporcionar contentEdgeInsetstambién para ajustar los rellenos.

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
fuente