Czy można dopasować pozycję x, y dla titleLabel w UIButton?

121

Czy można dostosować pozycję x, y dla titleLabela UIButton?

Oto mój kod:

    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 = ???
RAGOpoR
źródło
1
Wybierz inną odpowiedź, abyśmy mogli usunąć bardzo negatywną odpowiedź. Albo wyjaśnij, dlaczego to zrobiłeś.
tchrist
1
Dlaczego ta odpowiedź nie jest akceptowana?
Antonio MG

Odpowiedzi:

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

I w 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)

Szybki 5

button.contentHorizontalAlignment = .left
button.contentVerticalAlignment = .top
button.titleEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 0.0, right: 0.0)
kannyboy
źródło
3
to zdecydowanie najlepsza odpowiedź
greenisus
3
Zastanawiam się, dlaczego pytający wybrał inną odpowiedź. Ten jest o wiele lepszy.
Joshua
4
Nie potrzebowałem nawet pierwszych dwóch wierszy ... setTitleEdgeInsets:to wszystko, co uznałem za potrzebne do przesunięcia tekstu.
ArtOfWarfare
Jest to zdecydowanie poprawne, ale prawdopodobnie łatwiejsze do osiągnięcia za pomocą konstruktora interfejsu (jak opisano w mojej odpowiedzi).
eladleb
Pierwsze dwa wiersze ustawiają tekst na 0,0 (x, y). Może to uniemożliwić pozycjonowanie względne; zwłaszcza jeśli ustawisz domyślne wyrównanie w xib.
Jarrett Barnett
40

Najłatwiej zrobić to wizualnie, używając inspektora atrybutów ** (pojawia się podczas edycji xib / storyboardu), ustawiając właściwość „ edge ” na tytuł, dostosowując jej wstawki, a następnie ustawiając właściwość „edge” na obraz i odpowiednio dostosowując . Zwykle jest to lepsze niż kodowanie, ponieważ jest łatwiejsze w utrzymaniu i wysoce wizualne.

Ustawienie inspektora atrybutów

eladleb
źródło
1
Dobra wskazówka do zmian Edgedo Title, a następnie dostosować wstawka!
Dziekan
Na przyszłość, od Xcode 8, zamiast ustawiania edgewłaściwości, możesz dostosować wstawki tytułu w Inspektorze rozmiaru.
dbmrq
14

Wyprowadź z UIButton i zaimplementuj następującą metodę:

- (CGRect)titleRectForContentRect:(CGRect)contentRect;

Edytować:

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

@implementation PositionTextButton
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
  contentRect.origin = titleOrigin;
  return contentRect;
}
@end
ciągnięty do przodu
źródło
Dzięki, właśnie tego potrzebowałem. Automatyczne centrowanie nie wystarczyło.
dmzza
4

Dla moich projektów mam to narzędzie rozszerzające:

extension UIButton {

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

}
Luca Davanzo
źródło