È possibile regolare la posizione x, y per titleLabel di UIButton?


121

È possibile regolare la posizione x, y per la titleLabeldi a UIButton?

Ecco il mio codice:

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    [btn setFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
    [btn setTitle:[NSString stringWithFormat:@"Button %d", i+1] forState:UIControlStateNormal];     
    [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    btn.titleLabel.frame = ???

1
Scegli l'altra risposta in modo da poter eliminare quella molto negativa. Oppure spiega perché l'hai fatto.
tchrist

1
Perché questa risposta non è stata accettata?
Antonio MG

Risposte:


445
//make the buttons content appear in the top-left
[button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[button setContentVerticalAlignment:UIControlContentVerticalAlignmentTop];

//move text 10 pixels down and right
[button setTitleEdgeInsets:UIEdgeInsetsMake(10.0f, 10.0f, 0.0f, 0.0f)];

E in Swift

//make the buttons content appear in the top-left
button.contentHorizontalAlignment = .Left
button.contentVerticalAlignment = .Top

//move text 10 pixels down and right
button.titleEdgeInsets = UIEdgeInsetsMake(10.0, 10.0, 0.0, 0.0)

Swift 5

button.contentHorizontalAlignment = .left
button.contentVerticalAlignment = .top
button.titleEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 0.0, right: 0.0)

3
questa è sicuramente la risposta migliore
greenisus

3
Mi chiedo perché il richiedente abbia scelto l'altra risposta. Questo è molto meglio.
Joshua

4
Non avevo nemmeno bisogno delle prime due righe ... setTitleEdgeInsets:era tutto ciò che trovavo necessario per spostare il testo.
ArtOfWarfare

Questo è decisamente corretto, ma probabilmente più facile da realizzare utilizzando il generatore di interfacce (come descritto nella mia risposta).
eladleb

Le prime due righe posizionano il testo su 0,0 (x, y). Ciò può impedire il posizionamento relativo; soprattutto se imposti l'allineamento predefinito in xib.
Jarrett Barnett

40

Il modo più semplice per farlo visivamente è usare l'ispettore attributi ** (appare quando si modifica un xib / storyboard), impostando la proprietà " edge " sul titolo, regolandone gli inserti, quindi impostando la proprietà "edge" sull'immagine e regolando di conseguenza . Di solito è meglio che codificarlo, poiché è più facile da mantenere e altamente visivo.

Impostazione dell'ispettore degli attributi


1
Buona punta al cambiamento Edgedi Titlee quindi regolare inserto!
Dean

Per riferimento futuro, a partire da Xcode 8, invece di impostare la edgeproprietà puoi regolare i riquadri del titolo in Impostazioni dimensioni.
dbmrq

14

Deriva da UIButton e implementa il seguente metodo:

- (CGRect)titleRectForContentRect:(CGRect)contentRect;

Modificare:

@interface PositionTitleButton : UIButton
@property (nonatomic) CGPoint titleOrigin;
@end

@implementation PositionTextButton
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
  contentRect.origin = titleOrigin;
  return contentRect;
}
@end

Grazie, questo è ciò di cui avevo davvero bisogno. Il centraggio automatico non era sufficiente.
dmzza

4

Per i miei progetti ho questa utility di estensione:

extension UIButton {

    func moveTitle(horizontal hOffset: CGFloat, vertical vOffset: CGFloat) {
        self.titleEdgeInsets.left += hOffset
        self.titleEdgeInsets.top += vOffset
    }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.