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 = ???
RAGOpoR
quelle
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)
Cannyboy
quelle
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

eladleb
quelle
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
nach vorne gezogen
quelle
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
    }

}
Luca Davanzo
quelle