Налаштування кутового радіуса на UIImageView не працює


129

Я трохи втрачаю. Я використовував властивість шару UIView, щоб округлити кути декількох елементів у моєму додатку. Однак цей UIImageView просто не відповідає. Не впевнений, чого мені не вистачає.

UIImageView (званий previewImage) міститься в комірці перегляду таблиці. Я намагався встановити декілька розташувань властивості cornerRadius (у самій комірці та в контролері, який створює комірку) безрезультатно.

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

Чи є щось про те, як завантажуються клітини, що мені не вистачає?

Відповіді:


377

Потрібно встановити masksToBoundsвластивість шару YES:

cell.previewImage.layer.masksToBounds = YES;

Це відбувається тому, що UIImageViewелемент керування створює псевдопідгляд для утримання UIImageоб'єкта.


19
Якщо ви також не растрируете представлення (view.layer.shouldRasterize = ТАК), кожен кадр потребуватиме повторної маски всіх пікселів.
jjxtra

@jjxtra, тож краще встановити shouldRasterize = false?
user924

Якщо falseRasterize хибне, ви платите за створення маски накладних кадрів. Якщо trueRasterize відповідає дійсності, і ваш шар змінює кожен кадр, ви оплачуєте маску накладних даних та накладення растерізації. Ідеальний випадок - це статичний (не змінюється дуже часто) шар з shouldRasterize = true.
jjxtra

30

Також варто це відзначити

  1. Якщо ви використовуєте аспектFit AND cornerRadius із clipsToBounds / masksToBounds, округлі кути ви не отримаєте.

тобто якщо у вас це є

theImageView.contentMode = .scaleAspectFit

і

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

або

theImageView.layer.masksToBounds = true

Це не спрацює . вам доведеться позбутися коду аспектуFit

//theImageView.contentMode = .scaleAspectFit
  1. Переконайтесь, що ширина та висота для перегляду зображень однакові

Якщо коротко: встановіть співвідношення сторін 1: 1, якщо ви хочете використовувати AspectFit
djdance

22

Це має спрацювати

cell.previewImage.clipsToBounds = YES;

cell.previewImage.layer.cornerRadius = 20;

3
Не впевнений clipsToBounds, що це метод на пізнішому класі. Повірте, masksToBoundsяк вище.
Альфі Ханссен

4
У шарах @AlfieHanssen є маскиToBounds :, у переглядах є кліпиToBounds:
Кевін,


4

У Xcode Interface Builder, вибір атрибута малювання 'Sub Subviews Clip' для перегляду разом із встановленням кутового радіуса в коді cell.previewImage.layer.cornerRadius = 20;робить для мене роботу!

Див. Опцію "Кліп-підзор" у IB



2

Спробуйте цей код: -

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

Відповіді, що стосуються лише коду, не враховують. Клацніть по редагуванню та додайте кілька слів, узагальнюючи те, як ваш код вирішує питання, або, можливо, поясніть, чим ваша відповідь відрізняється від попередньої відповіді / відповіді. Спасибі
Нік

1

Для imageView.contentMode = .scaleAspectFillцього cornerRadiusне застосовується, якщо зображення дуже велике, залежно від обладнання.

Деякі тести із зміненими панорамними зображеннями:

  • iPhone X, розмір зображення 5000x1107: 🚫 4000x886: ✅
  • iPhone 6s Plus, розмір зображення 10000x2215: 🚫 5000x1107: ✅
  • iPhone 6s, розмір зображення 10000x2215: 🚫 5000x1107: ✅

Розміри imageView, де 160x100. Цікаво, що новіше обладнання не обов'язково є більш здатним.

Не соромтесь редагувати цю публікацію з більшою кількістю результатів тесту!


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:

Для того, щоб радіус кута працював, додайте зображення до а, UIViewа потім потрібно встановити masksToBoundsвластивість зображення на true:

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

Примітка: замініть 20 на потрібне cornerRadius


0

Нічого з попередніх відповідей не працює?

Може статися, що розмір UIImageView перевищує розмір зображення. Радіус кута можна встановити добре, але не видно в такому випадку.

Швидка перевірка розміру UIImageView за кодом: (або можна використовувати інструмент "Переглянути ієрархію інтерфейсу користувача" в XCode)

self.imageView.backgroundColor = [UIColor greenColor]; 

У цьому сценарії ви повинні переконатися, що UIImageView має те саме співвідношення сторін, що і зображення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.