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