[ios] Autolayout - la dimensione intrinseca di UIButton non include i margini del titolo



4 Answers

Puoi farlo funzionare in Interface Builder (senza scrivere alcun codice), utilizzando una combinazione di insiemi di titoli e contenuti positivi e negativi.

Aggiornamento : Xcode 7 ha un bug in cui non è possibile immettere valori negativi nel campo Inserto Right , ma è possibile utilizzare il controllo stepper accanto ad esso per ridurre il valore. (Grazie Stuart)

In questo modo si aggiungeranno 8 punti di spaziatura tra l'immagine e il titolo e aumenterà la larghezza intrinseca del pulsante della stessa quantità. Come questo:

Question

Se ho un UIButton organizzato usando l'autolayout, le sue dimensioni si adattano bene per adattarsi al suo contenuto.

Se imposto un'immagine come button.image , la dimensione instrinsic sembra di nuovo tenere conto di ciò.

Tuttavia, se titleEdgeInsets il titleEdgeInsets del pulsante, il layout non tiene conto di ciò e invece tronca il titolo del pulsante.

Come posso garantire che la larghezza intrinseca dei conti del pulsante per l'inserto?

Modificare:

Sto usando il seguente:

[self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];

L'obiettivo è aggiungere una certa separazione tra l'immagine e il testo.




Volevo aggiungere uno spazio di 5pt tra l'icona di UIButton e l'etichetta. Ecco come l'ho raggiunto:

UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeCustom];
// more button config etc
infoButton.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 5);
infoButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, -5);

Il modo in cui contentEdgeInsets, titleEdgeInsets e imageEdgeInsets si correlano tra loro richiede un po 'di dare e prendere da ciascun riquadro. Quindi, se aggiungi alcuni inserti alla sinistra del titolo, devi aggiungere un inserto negativo a destra e fornire più spazio (tramite un inserto positivo) nel diritto ai contenuti.

Aggiungendo un inserto contenuto giusto per far corrispondere lo spostamento del riquadro del titolo, il mio testo non va oltre i limiti del pulsante.




Non hai specificato come stai impostando gli inset, quindi suppongo che tu stia usando titleEdgeInsets perché vedo lo stesso effetto che stai ottenendo. Se utilizzo contentEdgeInsets, invece, funziona correttamente.

- (IBAction)ChangeTitle:(UIButton *)sender {
    self.button.contentEdgeInsets = UIEdgeInsetsMake(0,20,0,20);
    [self.button setTitle:@"Long Long Title" forState:UIControlStateNormal];
}



E per Swift ha funzionato questo:

extension UIButton {
    override open var intrinsicContentSize: CGSize {
        let intrinsicContentSize = super.intrinsicContentSize

        let adjustedWidth = intrinsicContentSize.width + titleEdgeInsets.left + titleEdgeInsets.right
        let adjustedHeight = intrinsicContentSize.height + titleEdgeInsets.top + titleEdgeInsets.bottom

        return CGSize(width: adjustedWidth, height: adjustedHeight)
    }
}

Love U Swift




Per Swift 3 basato sulla risposta di :

extension UIButton {

    override open var intrinsicContentSize: CGSize {

        let intrinsicContentSize = super.intrinsicContentSize

        let adjustedWidth = intrinsicContentSize.width + titleEdgeInsets.left + titleEdgeInsets.right
        let adjustedHeight = intrinsicContentSize.height + titleEdgeInsets.top + titleEdgeInsets.bottom

        return CGSize(width: adjustedWidth, height: adjustedHeight)

    }

}



Related