Ist es möglich, die x, y-Position für titleLabel von UIButton anzupassen?


121

Ist es möglich, die x, y-Position für die einzustellen titleLabel von aUIButton ?

Hier ist mein Code:

    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
Bitte wählen Sie die andere Antwort, damit wir die sehr negative löschen können. Oder erklären Sie, warum Sie dies getan haben.
Tchrist

1
Warum wird diese Antwort nicht akzeptiert?
Antonio MG

Antworten:


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

Und 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
Dies ist definitiv die beste Antwort
Greenisus

3
Ich frage mich, warum der Fragesteller die andere Antwort gewählt hat. Dieser ist viel besser.
Joshua

4
Ich brauchte nicht einmal die ersten beiden Zeilen ... setTitleEdgeInsets:war alles, was ich für notwendig hielt, um den Text zu verschieben.
ArtOfWarfare

Dies ist definitiv richtig, aber wahrscheinlich einfacher mit dem Interface Builder (wie in meiner Antwort beschrieben) zu erreichen.
Eladleb

Die ersten beiden Zeilen positionieren Ihren Text auf 0,0 (x, y). Dies kann eine relative Positionierung verhindern. vor allem, wenn Sie die Standardausrichtung in der xib festlegen.
Jarrett Barnett

40

Der einfachste Weg, dies visuell zu tun, besteht darin, den Attributinspektor ** zu verwenden (wird beim Bearbeiten eines xib / Storyboards angezeigt), die Eigenschaft " edge " auf title zu setzen, die Einfügungen anzupassen, dann die Eigenschaft "edge" auf image zu setzen und entsprechend anzupassen . Es ist normalerweise besser als das Codieren, da es einfacher zu warten und sehr visuell ist.

Attributinspektoreinstellung


1
Guter Tipp Änderungen Edgean Titleund stellen Sie dann Einsatz!
Dean

Zum späteren Nachschlagen können Sie seit Xcode 8 anstelle der Einstellung der edgeEigenschaft die Titeleinfügungen im Größeninspektor anpassen.
dbmrq

14

Leiten Sie von UIButton ab und implementieren Sie die folgende Methode:

- (CGRect)titleRectForContentRect:(CGRect)contentRect;

Bearbeiten:

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

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

Danke, das habe ich eigentlich gebraucht. Automatische Zentrierung war nicht genug.
dmzza

4

Für meine Projekte habe ich dieses Erweiterungsdienstprogramm:

extension UIButton {

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

}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.