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 = ???

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)

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


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

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
    }

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.