проблемы с UIImageView.слой.cornerRadius для создания закругленных изображений на разных плотностях пикселей ios

Я просто пытаюсь создать идеально круглое изображение. Вот мой код:

myImage.layer.cornerRadius = myImage.frame.size.width/2
myImage.layer.masksToBounds = true

это работает на 4s, но не совсем круглый на 5s, и появляется как закругленный прямоугольник на iphone 6.

Я предполагаю, что это связано с рамы.размер.ширина возвращает значения в пикселях, а не точки или что-то в этом роде, но я не смог решить эту проблему.

5 ответов


Если вы вводите этот код в viewDidLoad, попробуйте переместить его в viewDidLayoutSubviews.

Я предполагаю, что это проблема автоматического макета - хотя вы использовали свойство радиуса угла соответствующим образом и фактически делаете кадр изображения круговым, после автоматического макета радиус угла остается тем же, но изображение растягивается так, что оно больше не круговое.


проблема в том, что если вы измените cornerRadius любого вида и ожидаете, что он будет выглядеть как круг, вид должен быть квадратом.

теперь из-за разных устройств и разного размера устройства размер вашего изображения может измениться, и это может быть прямоугольник.

, например Если вы просматриваете 50 * 50

myImage.layer.cornerRadius = myImage.frame.size.width/2

это добавило бы угловые радиостанции 25 с обеих сторон, чтобы сделать его кругом.

но из-за автоматической компоновки изменения устройства, ваш взгляд может быть 50 * 80

радиус угла добавит 25, но поскольку высота 80, он добавит 25 с обеих сторон, а оставшиеся 30 не будут кривой и выглядят прямо.

что вы можете сделать, это попробовать просмотреть экран в различных ориентациях в раскадровке и изменить ограничения автоматической компоновки (или структуры и пружины), чтобы убедиться, что представление изображения является квадратом во всех устройствах


если ваш код в viewDidLoad на ViewController, попробуйте переместить его в viewDidLayoutSubviews.

если ваше округленное изображение находится в tableViewCell, попробуйте переместить его в draw.

override func draw(_ rect: CGRect) {
    avatarView.layer.cornerRadius = avatarView.frame.size.width / 2
    avatarView.layer.masksToBounds = true
    avatarView.clipsToBounds = true
    avatarView.contentMode = .scaleAspectFill
}

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()

  myImage.layer.cornerRadius  = myImage.frame.size.width/2
  myImage.layer.masksToBounds = true
}

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

myImage.layer.cornerRadius = myImage.**bounds**.size.width/2
myImage.layer.masksToBounds = true