UIImageView üzerinde Köşe Yarıçapını Ayarlama çalışmıyor


129

Biraz kayboldum. Uygulamamdaki birden çok öğenin köşelerini yuvarlamak için UIView katman özelliğini kullandım. Ancak, bu UIImageView basitçe uyumlu değil. Ne kaçırdığımdan emin değilim.

UIImageView (önizlemeImage olarak adlandırılır) bir Tablo Görünüm Hücresinde bulunur. CornerRadius özelliğini çoklu konumu (hücrenin kendisinde ve hücreyi oluşturan denetleyicide) boşuna ayarlamayı denedim.

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.
}

Hücrelerin yüklenmesi ile ilgili eksik olduğum bir şey var mı?

Yanıtlar:


377

Katmanın masksToBoundsözelliğini şu şekilde ayarlamanız gerekir YES:

cell.previewImage.layer.masksToBounds = YES;

Bunun nedeni, UIImageViewdenetimin UIImagenesneyi tutmak için sözde alt görünüm oluşturmasıdır .


19
Görünümü de rasterleştirmedikçe (view.layer.shouldRasterize = YES), her kare tüm piksellerin yeniden maskelenmesini gerektirecektir.
jjxtra

@jjxtra yani ayarlamak daha shouldRasterize = falsemı iyi ?
user924

ShouldRasterize yanlışsa, her çerçevede maske oluşturma masrafını ödersiniz. ShouldRasterize doğruysa ve katmanınız her karede değişiyorsa, maske ek yükünü ve rasterleştirme ek yükünü ödersiniz. İdeal durum, shouldRasterize = true ile statik (çok sık değişmeyen) bir katmandır.
jjxtra

31

Ayrıca şunu belirtmeye değer

  1. ClipToBounds / masksToBounds ile boyFit VE cornerRadius kullanıyorsanız , yuvarlak köşeler elde edemezsiniz.

Yani eğer sende varsa

theImageView.contentMode = .scaleAspectFit

ve

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

veya

theImageView.layer.masksToBounds = true

Bu işe yaramaz . boyFit kodundan kurtulmanız gerekecek

//theImageView.contentMode = .scaleAspectFit
  1. Resim Görünümü için genişlik ve yüksekliğin aynı olduğundan emin olun

Kısacası: AspectFit'i kullanmak istiyorsanız 1: 1 en boy oranını ayarlayın
djdance

22

Bu çalışmalı

cell.previewImage.clipsToBounds = YES;

cell.previewImage.layer.cornerRadius = 20;

3
Emin değilim clipsToBoundssonraki sınıf için bir yöntemdir. masksToBoundsYukarıdaki gibi olduğuna inanın .
Alfie Hanssen

4
@AlfieHanssen katmanları var masksToBounds :, görüntülemelerde klip varToBounds:
Kevin

11

Ayarlamanız gerektiğine inanıyorum:

cell.previewImage.layer.masksToBounds = YES;
cell.previewImage.layer.opaque = NO;


2

Aşağıdaki kod parçasını deneyin

cell.previewImage.layer.cornerRadius = 20;
cell.previewImage.clipsToBounds = YES;

2

Bu kodu deneyin: -

self.imgaviewName.clipsToBounds = true
self.imageviewName.layer.cornerRadius = 10

Yalnızca kod yanıtları önerilmez. Tıklayınız düzenlemek önceki cevabı / cevapları dan nasıl cevap farklılık açıklamak belki ve kod adresleri nasıl soru özetleyen bazı kelimeler ekleyebilir veya. Teşekkürler
Nick

1

İçin görüntü çok büyükse uygulanmaz, donanım bağlı.imageView.contentMode = .scaleAspectFillcornerRadius

Yeniden boyutlandırılan panorama görüntüleri ile bazı testler:

  • iPhone X, görüntü boyutu 5000x1107: 🚫 4000x886: ✅
  • iPhone 6s Plus, görüntü boyutu 10000x2215: 🚫 5000x1107: ✅
  • iPhone 6s, görüntü boyutu 10000x2215: 🚫 5000x1107: ✅

160x100 olan imageView boyutları. İlginç bir şekilde, yeni donanımın daha yetenekli olması gerekmez.

Daha fazla test sonucuyla bu gönderiyi düzenlemekten çekinmeyin!


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;
       }

0

Swift 4.2 Cevap:

Köşe yarıçapının çalışması için, görüntüyü a'ya ekleyin UIViewve ardından görüntünün masksToBoundsözelliğini şu şekilde ayarlamanız gerekir true:

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

Not: 20'yi istediğiniz ile değiştirin cornerRadius


0

Önceki cevaplardan hiçbir şey işe yaramıyor mu?

UIImageView boyutunun görüntü boyutundan daha büyük olması olabilir. Köşe yarıçapı iyi ayarlanabilir ancak bu durumda görünmez.

UIImageView boyutunun koda göre hızlı kontrolü: (veya XCode'da "UI Hiyerarşisini Görüntüle" aracını kullanabilir)

self.imageView.backgroundColor = [UIColor greenColor]; 

Bu senaryoda UIImageView uygulamasının resimle aynı en boy oranına sahip olduğundan emin olmalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.