Установка радиуса угла в 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 = YES), каждый кадр потребует повторной маски всех пикселей.
jjxtra

@jjxtra так что лучше ставить shouldRasterize = false?
user924

Если shouldRasterize имеет значение false, накладные расходы на создание маски оплачиваются за каждый кадр. Если shouldRasterize истинно и ваш слой меняется каждый кадр, вы оплачиваете накладные расходы на маску и растеризацию. Идеальный случай - статический (не очень часто меняющийся) слой с shouldRasterize = true.
jjxtra

31

Также стоит отметить, что

  1. Если вы используете аспектFit И 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как указано выше.
Alfie Hanssen

4
Слои @AlfieHanssen имеют masksToBounds :, представления имеют clipsToBounds:
Кевин




2

Попробуйте этот код: -

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

Ответы только на код не приветствуются. Нажмите « Изменить» и добавьте несколько слов, описывающих, как ваш код решает вопрос, или, возможно, объясните, чем ваш ответ отличается от предыдущего ответа / ответов. Спасибо
Ник

1

Для не применяется , если изображение является очень большим, в зависимости от оборудования.imageView.contentMode = .scaleAspectFillcornerRadius

Некоторые тесты с измененными размерами панорамных изображений:

  • 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 Ответ:

Чтобы радиус угла работал, добавьте изображение в a, 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.