Настройка углового радиуса на UIImageView не работает

Я немного растерялся. Я использовал свойство layer 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.
}

Есть ли что-то в том, как загружаются клетки, которые мне не хватает?

13 ответов

Решение

Вам нужно установить слой masksToBounds собственность на YES:

cell.previewImage.layer.masksToBounds = YES;

Это потому что UIImageView элемент управления создает псевдо-подпредставление для хранения UIImage объект.

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

  1. Если вы используете aspectFit AND cornerRadius с clipsToBounds/masksToBounds, вы не получите скругленные углы.

т.е. если у вас есть это

theImageView.contentMode = .scaleAspectFit

а также

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

или же

theImageView.layer.masksToBounds = true

Это не сработает. вам придется избавиться от кода aspectFit

//theImageView.contentMode = .scaleAspectFit
  1. Убедитесь, что ширина и высота для просмотра изображения одинаковы

Это должно работать

cell.previewImage.clipsToBounds = YES;

cell.previewImage.layer.cornerRadius = 20;

Я считаю, что вам нужно установить:

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

В Xcode Interface Builder, выбирая атрибут рисования 'Clip Subviews' для представления вместе с установкой углового радиуса в коде cell.previewImage.layer.cornerRadius = 20;делает работу для меня!

Смотрите опцию "Клип Subviews" в IB

UIImageView дает angularRadius с clipsToBounds, следующим является пример Swift и Objectiv-C (следующий пример кода для круглого изображения)

Быстрый

      myImageView.layer.cornerRadius = myImageView.frame.size.height/2.0
myImageView.clipsToBounds = true

Цель -C

      [myImageView.layer setCornerRadius:myImageView.frame.size.height/2.0];
[myImageView setClipsToBounds:TRUE];

Попробуйте этот фрагмент кода ниже

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

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

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

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

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

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

Размеры imageView - 160x100. Интересно, что новое оборудование не обязательно более способно.

Не стесняйтесь редактировать этот пост с дополнительными результатами тестирования!

Swift 4.2 Ответ:

Чтобы радиус угла работал, добавьте изображение в UIView а затем вам нужно установить изображение masksToBounds собственность на true:

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

Примечание: замените 20 на желаемый cornerRadius

Ничего из предыдущих ответов не работает?

Может случиться так, что размер UIImageView больше, чем размер изображения. Угловой радиус можно установить правильно, но в этом случае он не будет виден.

Быстрая проверка размера UIImageView по коду: (или можно использовать инструмент "Просмотр иерархии пользовательского интерфейса" в XCode)

self.imageView.backgroundColor = [UIColor greenColor]; 

В этом сценарии вы должны убедиться, что UIImageView имеет то же соотношение сторон, что и изображение.

Вы можете использовать этот код

      override func viewDidLayoutSubviews() { 
    yourImageView.layer.cornerRadius = yourImageView.frame.width / 2
}
-(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;
       }
Другие вопросы по тегам