Mengatur Radius Pojok pada UIImageView tidak berfungsi

129

Saya sedikit bingung. Saya telah menggunakan properti layer dari UIView untuk membulatkan sudut-sudut beberapa elemen di aplikasi saya. Namun, UIImageView yang satu ini tidak sesuai. Tidak yakin apa yang saya lewatkan.

UIImageView (disebut previewImage) terkandung dalam Table View Cell. Saya sudah mencoba mengatur beberapa lokasi cornerRadius properti (dalam sel itu sendiri dan di controller yang membuat sel) tidak berhasil.

static NSString *CellIdentifier = @"MyTableViewCell";

MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
    cell = [topLevelObjects objectAtIndex:0];
    cell.previewImage.layer.cornerRadius = 20; //Made it 20 to make sure it's obvious.
}

Apakah ada sesuatu tentang cara sel dimuat sehingga saya tidak ada?

MarkPowell
sumber

Jawaban:

377

Anda perlu mengatur masksToBoundsproperti layer ke YES:

cell.previewImage.layer.masksToBounds = YES;

Ini karena UIImageViewkontrol membuat pseudo-subview untuk menampung UIImageobjek.

Evan Mulawski
sumber
19
Kecuali jika Anda juga merasterisasi tampilan (view.layer.shouldRasterize = YA), setiap frame akan memerlukan mask ulang semua piksel.
jjxtra
@ jjxtra jadi lebih baik diatur shouldRasterize = false?
user924
Jika shouldRasterize salah Anda membayar biaya overhead pembuatan topeng setiap. Jika shouldRasterize benar dan layer Anda mengubah setiap frame, Anda membayar overhead mask dan overhead rasterization. Kasus ideal adalah lapisan statis (tidak sering berubah) dengan shouldRasterize = true.
jjxtra
30

Juga patut dicatat

  1. Jika Anda menggunakan aspectFit DAN cornerRadius dengan clipsToBounds / masksToBounds, Anda tidak akan mendapatkan sudut yang bulat.

yaitu jika Anda memiliki ini

theImageView.contentMode = .scaleAspectFit

dan

   theImageView.layer.cornerRadius = (theImageView.frame.size.height)/2
    theImageView.clipsToBounds = true

atau

theImageView.layer.masksToBounds = true

Itu tidak akan berhasil . Anda harus menyingkirkan kode aspekFit

//theImageView.contentMode = .scaleAspectFit
  1. Pastikan lebar dan tinggi untuk Tampilan Gambar sama
Naishta
sumber
Singkatnya: setel rasio aspek 1: 1 jika Anda ingin menggunakan
AspectFit
22

Ini seharusnya bekerja

cell.previewImage.clipsToBounds = YES;

cell.previewImage.layer.cornerRadius = 20;
Teena nath Paul
sumber
3
Tidak yakin clipsToBoundsadalah metode di kelas selanjutnya. Percayalah masksToBoundsseperti di atas.
Alfie Hanssen
4
Lapisan @AlfieHanssen memiliki maskToBounds :, views have clipsToBounds:
Kevin
11

Saya yakin Anda perlu mengatur:

cell.previewImage.layer.masksToBounds = YES;
cell.previewImage.layer.opaque = NO;
Daniel Dickison
sumber
4

Di Xcode Interface Builder, memilih atribut Menggambar 'Subviews Klip' untuk tampilan bersama-sama dengan mengatur radius sudut dalam kode cell.previewImage.layer.cornerRadius = 20;melakukan pekerjaan untuk saya!

Lihat opsi 'Klip Subview' di IB

koira
sumber
2

Cobalah potongan kode di bawah ini

cell.previewImage.layer.cornerRadius = 20;
cell.previewImage.clipsToBounds = YES;
Vaibhav Thakre
sumber
2

Coba kode ini: -

self.imgaviewName.clipsToBounds = true
self.imageviewName.layer.cornerRadius = 10
kangna sharma
sumber
Jawaban khusus kode tidak disarankan. Silakan klik edit dan tambahkan beberapa kata yang meringkas bagaimana kode Anda menjawab pertanyaan, atau mungkin menjelaskan bagaimana jawaban Anda berbeda dari jawaban / jawaban sebelumnya. Terima kasih
Nick
1

Untuk imageView.contentMode = .scaleAspectFillyang cornerRadiustidak diterapkan jika gambar sangat besar, tergantung pada perangkat keras.

Beberapa tes dengan gambar panorama yang diubah ukurannya:

  • iPhone X, ukuran gambar 5000x1107: 🚫 4000x886: ✅
  • iPhone 6s Plus, ukuran gambar 10000x2215: 🚫 5000x1107: ✅
  • iPhone 6s, ukuran gambar 10000x2215: 🚫 5000x1107: ✅

Dimensi imageView di mana 160x100. Menariknya, perangkat keras yang lebih baru belum tentu lebih mampu.

Jangan ragu untuk mengedit posting ini dengan hasil tes yang lebih banyak!

Ortwin Gentz
sumber
0
-(void) viewDidAppear:(BOOL)animated{
       [super viewDidAppear:animated];
       [self setMaskTo:viewDistance 
             byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight];
           }

- (void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners
     {
      UIBezierPath *rounded = [UIBezierPath 
                bezierPathWithRoundedRect:view.bounds
                                              byRoundingCorners:corners

                     cornerRadii:CGSizeMake(20.0, 20.0)];

          CAShapeLayer *shape = [[CAShapeLayer alloc] init];
          shape.frame = self.view.bounds;
         [shape setPath:rounded.CGPath];
          view.layer.mask = shape;
       }
Maulik Patel
sumber
0

Swift 4.2 Jawaban:

Agar jari sudut bekerja, tambahkan gambar ke a UIViewdan kemudian Anda perlu mengatur masksToBoundsproperti gambar ke true:

planeImage.layer.masksToBounds = true
planeImage.layer.cornerRadius = 20

Catatan: Ganti 20 dengan yang diinginkan cornerRadius

IronmanX46
sumber
0

Tidak ada jawaban dari jawaban sebelumnya yang berfungsi?

Mungkin saja ukuran UIImageView lebih besar dari ukuran gambar. Radius sudut dapat diatur dengan baik tetapi tidak terlihat dalam kasus itu.

Pemeriksaan cepat ukuran UIImageView berdasarkan kode: (atau dapat menggunakan alat "Lihat UI Hirarki" di XCode)

self.imageView.backgroundColor = [UIColor greenColor]; 

Dalam skenario ini, Anda harus memastikan bahwa UIImageView memiliki rasio aspek yang sama dengan gambar.

Marek Manduch
sumber