Apakah mungkin untuk menyesuaikan posisi x, y untuk titleLabel dari UIButton?

121

Apakah mungkin untuk menyesuaikan posisi x, y untuk titleLabeldari a UIButton?

Ini kode saya:

    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
sumber
1
Pilih jawaban lain agar kami dapat menghapus jawaban yang sangat negatif. Atau jelaskan mengapa Anda melakukan ini.
tchrist
1
Mengapa jawaban itu tidak diterima?
Antonio MG

Jawaban:

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

Dan di 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)

Cepat 5

button.contentHorizontalAlignment = .left
button.contentVerticalAlignment = .top
button.titleEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 0.0, right: 0.0)
anak nakal
sumber
3
ini jelas merupakan jawaban terbaik
greenisus
3
Saya bertanya-tanya mengapa penanya memilih jawaban lain. Yang ini jauh lebih baik.
Joshua
4
Saya bahkan tidak membutuhkan dua baris pertama ... hanya setTitleEdgeInsets:itu yang saya rasa perlu untuk menggeser teks.
ArtOfWarfare
Ini pasti benar, tetapi mungkin lebih mudah dilakukan dengan menggunakan pembuat antarmuka (seperti yang dijelaskan dalam jawaban saya).
eladleb
Dua baris pertama memposisikan teks Anda ke 0,0 (x, y). Ini dapat mencegah pemosisian relatif; terutama jika Anda menyetel perataan default di xib.
Jarrett Barnett
40

Cara termudah untuk melakukannya secara visual adalah dengan menggunakan pemeriksa atribut ** (muncul saat mengedit xib / storyboard), menyetel properti " edge " ke judul, menyesuaikan sisipannya, lalu menyetel properti "edge" ke gambar, dan menyesuaikannya . Biasanya lebih baik daripada mengkodekannya, karena lebih mudah dipelihara dan sangat visual.

Atribut inspektur pengaturan

eladleb
sumber
1
Baik tip untuk perubahan Edgeuntuk Titlekemudian menyesuaikan inset!
Dean
Untuk referensi di masa mendatang, sejak Xcode 8, alih-alih mengatur edgeproperti, Anda dapat menyesuaikan insets judul di Size Inspector.
dbmrq
14

Berasal dari UIButton dan terapkan metode berikut:

- (CGRect)titleRectForContentRect:(CGRect)contentRect;

Edit:

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

@implementation PositionTextButton
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
  contentRect.origin = titleOrigin;
  return contentRect;
}
@end
ditarik ke depan
sumber
Terima kasih, inilah yang sebenarnya saya butuhkan. Pemusatan otomatis tidak cukup.
dmzza
4

Untuk proyek saya, saya memiliki utilitas ekstensi ini:

extension UIButton {

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

}
Luca Davanzo
sumber