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.