firstButton adalah UIButton bertipe Custom. Saya secara terprogram menempatkan tiga di antaranya di setiap sel tabel, dengan demikian:
[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];
Di tempat lain, saya mengatakannya ke clipToBounds. Apa yang saya dapatkan adalah potongan dari kotak tengah gambar, bukan rendering berskala aspek. Saya telah mencoba banyak cara ini, termasuk mengatur properti mode di firstButton.imageView, yang juga sepertinya tidak berfungsi.
ios
uibutton
contentmode
Dan Ray
sumber
sumber
Jawaban:
Saya memiliki masalah yang sama. Saya melihat pertanyaan ini agak kuno, tetapi saya ingin memberikan jawaban yang jelas dan benar untuk menyelamatkan orang lain (seperti saya) beberapa saat ketika muncul di hasil pencarian mereka.
Saya butuh sedikit mencari dan bereksperimen, tetapi saya menemukan solusinya. Cukup setel ContentMode dari ImageView "tersembunyi" yang ada di dalam UIButton.
[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit]; [firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
Mungkin itulah yang disinggung Dan Ray dalam jawaban yang diterima, tapi saya kira tidak.
sumber
Jika Anda berurusan dengan gambar UIButton (bukan backgroundImage), menyetel contentMode pada UIButton itu sendiri atau pada imageView-nya tidak berpengaruh (terlepas dari jawaban lain yang mengatakan).
Atau lakukan ini sebagai gantinya:
self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
Atau ukuran gambar Anda sesuai.
ATAU cukup gunakan UIImageView (yang sesuai dengan contentMode) dengan UITapGestureRecognizer terpasang padanya, atau UIButton transparan di atasnya.
sumber
contentMode
padaimageView
jika Anda ingin melakukan apapun aspek mengisi atau fit, seperti jawaban lainnya telah diklarifikasi. Lihat: stackoverflow.com/a/7944316/746890 .Daripada mengatur
contentMode
tombol itu sendiri, Anda akan ingin mengaturcontentHorizontalAlignment
dancontentVerticalAlignment
properti dan (yang terpenting)contentMode
untuk tombol ituimageView
untuk segala jenis aspek isian atau kecocokan. Berikut contohnya:button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Tentu saja, Anda juga dapat melakukan hal lain seperti menyelaraskan gambar tombol ke bagian atas tombol. Jika Anda tidak memerlukan aspek isian atau kecocokan, Anda dapat mengatur perataannya sendiri:
button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
Di Swift, Anda ingin menggunakan:
Ini berfungsi untuk semua versi iOS, termasuk versi terbaru dengan tata letak otomatis, (yaitu iOS 4 hingga iOS 11+).
sumber
Setelah beberapa jam kebingungan, berikut cara saya membuatnya berfungsi di iOS 3.2. Seperti yang disebutkan senja, menggunakan setBackgroundImage daripada setImage melakukan pekerjaan itu untuk saya.
CGRect myButtonFrame = CGRectMake(0, 0, 250, 250); UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"]; UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom]; [myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal]; [myButton setFrame: myButtonFrame]; [myButton setContentMode: UIViewContentModeScaleAspectFit];
sumber
Jawabannya adalah menggunakan UIImageView dengan semua pengaturan Mode Konten yang Anda inginkan, dan kemudian melapisi tombol kustom di atasnya. Bodoh bahwa Anda tidak dapat melakukan itu semua dalam satu kesempatan, tetapi tampaknya Anda tidak dapat melakukannya.
sumber
Menemukan perbaikan untuk ini. Setel
adjustsImageWhenHighlighted
propertiUIButton
menjadiNO
.UIButton *b = [[UIButton alloc] initWithFrame:rect]; [b setImage:image forState:UIControlStateNormal]; [b.imageView setContentMode:UIViewContentModeScaleAspectFill]; [b setAdjustsImageWhenHighlighted:NO];
Semoga ini membantu. Jangan ragu untuk berkomentar di bawah ini, saya akan menindaklanjuti setiap pertanyaan yang Anda miliki.
sumber
Jawaban saya mirip dengan Kuba. Saya perlu gambar saya disetel secara terprogram.
UIImage *image = [[UIImage alloc] initWithContentsOfFile:...]; [button setBackgroundImage:image forState:UIControlStateNormal]; button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it. for(UIView *view in button.subviews) { view.contentMode = UIViewContentModeScaleAspectFill; }
sumber
Satu-satunya solusi yang berhasil untuk saya:
[button setImage:image forState:UIControlStateNormal]; button.imageView.contentMode = UIViewContentModeScaleAspectFill; button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
sumber
Cepat 3
self.firstButton.imageView?.contentMode = .scaleAspectFill
sumber
Sebagai ganti setImage, coba setBackgroundImage
sumber
Saya yakin kami memiliki masalah pembuat antarmuka sederhana di sini - tampaknya IB mengabaikan perubahan mode konten SETELAH Anda menyetel properti gambar.
solusinya sesederhana itu: atur mode konten, hapus nama-gambar yang telah ditetapkan sebelumnya (pastikan Anda menghapusnya di semua status, default, disorot, dll.), lalu masukkan kembali nama-gambar yang diinginkan di semua status yang diinginkan - et voilà .
sumber
Saya juga menyarankan untuk melihat
adjustsImageWhenHighlighted
UIButton
properti untuk menghindari deformasi aneh pada gambar, saat tombol ditekan.sumber
Dalam mencoba untuk mencari tahu ini, metode saya menjadi sedikit hackier seiring berjalannya waktu, dan saya akhirnya subclass UIButton dan overriding setHighlighted:
Bagi saya, ini berfungsi dengan hanya merobohkan gambar alpha menjadi 0,5, karena mereka berada di latar belakang hitam.
Namun, ini hanya berfungsi jika saya mengomentari [super setHighlighted:] (di mana tampaknya kode melar gambar sedang berlangsung), yang rasanya tidak seperti cara yang tepat untuk menyelesaikan ini sama sekali ... semuanya tampak seperti bekerja dengan baik. Kita akan lihat bagaimana hal itu bertahan saat saya terus mengerjakannya.
- (void)setHighlighted:(BOOL)highlight { if (highlight) { [self.imageView setAlpha:.5]; } else { [self.imageView setAlpha:1]; } // [super setHighlighted:highlight]; }
sumber
Jika ada yang mencari jawaban yang berfungsi di iOS 6 dan iOS 7 dan storyboard:
Anda dapat mengatur gambar di papan cerita Anda:
Lalu:
for(UIView* testId in self.subviews) { if([testId isKindOfClass:[UIImageView class]]) [testId setContentMode:UIViewContentModeScaleAspectFill]; }
sumber
Jika UIButton tampaknya tidak mendengarkan pengaturan batasan tata letak, periksa apakah gambar lebih besar dari ukuran tombol. Selalu gunakan gambar @ 2x dan @ 3x untuk resolusi retina.
sumber
Kedua hal ini (yang awalnya cukup sulit ditemukan) akan meregangkan gambar UIButton Anda agar sesuai dengan ukuran tombol:
seseorang harus selalu mencoba untuk mengaturnya di Storyboard daripada kode.
sumber