UIViewContentModeScaleAspectFill tidak memotong


144

Saya mencoba menggambar beberapa gambar mini dengan ukuran tetap (100x100) menggunakan UIImageView. Saya telah mengatur ukuran bingkai tampilan gambar saya menjadi 100x100, dan mengatur contentModeke UIViewContentModeScaleAspectFill.

Pemahaman saya adalah bahwa ini harus menyebabkan gambar diambil pada ukuran yang saya set, dan gambar akan mengisi area gambar, dan klip bagian dari gambar yang berada di luar ukuran yang saya tetapkan untuk tampilan gambar. Namun, gambarnya masih tergambar lebih besar atau lebih kecil dari ukuran 100x100 yang saya tetapkan untuk itu.

Jika saya atur contentModeke UIviewContentModeScaleToFill, maka gambar digambar tepat 100x100, tetapi terdistorsi agar sesuai dengan dimensi tersebut. Adakah ide mengapa isi aspek tidak terpotong seperti yang diharapkan?

Ini kode saya:

_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];

CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;

Untuk ilustrasi yang lebih baik, berikut adalah screenshot dari apa yang saya lihat Kotak hijau adalah yang UIViewberisi yang UIImageViewsaya kerjakan. Saya telah mengatur warna latar belakangnya menjadi hijau, dan bingkai tampilan menjadi 100x100. Sebagai tes, UIImageViewsukurannya adalah 50x50. Seperti yang Anda lihat, saat menggunakan ...AspectFill, gambar tidak berukuran 50x50, dan dalam beberapa kasus diimbangi dari tempat saya suka. Saat menggunakan ...ScaleToFill, ukurannya benar, tetapi gambarnya terdistorsi.

Tangkapan layar menggambarkan masalah

Jawaban:


352

Bisakah Anda mencoba mengatur klip ke batas

[_photoview setClipsToBounds:YES];

Atau langsung di Storyboard / Xib Anda jika Anda dapat:

masukkan deskripsi gambar di sini


10
Itu dia - terima kasih. (Saya menambahkan tangkapan layar di atas untuk menunjukkan dengan lebih baik apa yang saya lihat, lebih sebagai contoh jika ada orang lain yang menemukan masalah ini.)
Josh Buhler

3
Di InterfaceBuilder, berganti nama (tidak membantu) menjadi "Klip tayangan cuplikan" (NB: dalam hal ini, tidak tumpang tindih "tayangan tayangan", namanya salah: itu klip DIRI DAN subview)
Adam

3
Centang pilihan 'Klip Subview' dalam file NIB melakukan hal yang sama. Bersulang.
codeburn

Tetapi bagaimana jika Anda ingin menambahkan bayangan menggunakan properti CALayer :( menambahkan pandangan lain di belakangnya tidak ideal untuk saya
Rambatino

Jika Anda menggunakan Tata Letak Otomatis seperti saya, ada kemungkinan penyebab lain, yaitu NSLayoutConstraint "UIView-Encapsulated-Layout-Height" melanggar batasan ukuran UIImageView.
ewiinnnnn

8

Jika Anda ingin memperluas pengetahuan Anda, ada artikel yang sangat bagus tentang bagaimana tumpukan iOS UIView diberikan . Ada juga artikel yang lebih mendalam tentang keseluruhan pipa gambar .

Singkatnya:

  1. Rasterisasi - Semua konten tampilan dirasterisasi (ditarik atau buffer piksel layar) dalam ruang koordinat batas Tampilan. Ini bisa berupa data gambar atau gambar kustom (yaitu drawRect:) tetapi konten subview. Rasterisasi ini memperhitungkan contentModeproperti.

    Apa pun di luar batas tampilan dihapus.

  2. Komposisi - Hasilnya dikomposisikan (digambar di atas satu sama lain) dari subview ke superview. Ini menggunakan properti bingkai dari subview.

    Jika clipsToBoundsproperti berada YESdi superview maka ia akan membuang konten subview di luar batasnya.


2

memiliki masalah yang sama dan diselesaikan dengan mencentang "Klip Subview".

Gambar ditampilkan dengan benar untuk semua tampilan (3,5,4,4,7,5,5, ipad) di pratinjau storyboard tetapi tidak di simulator.

Setelah saya mencentang "Klip Subview" masalah diselesaikan. :)


1

Memeriksa "Klip cuplikan layar" langsung di Storyboard / Xib juga berfungsi untuk saya. masukkan deskripsi gambar di sini


0

Subview saya mengubah ukuran dan saya menyadari itu karena xib memiliki set tata letak otomatis: masukkan deskripsi gambar di sini


0

Jika semuanya gagal,

lakukan klip untuk membatasi dalam Metode viewDidLayoutSubviews.

Contoh:

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }
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.