Я знаю, что формулы frame.size.width/2
должны создавать границу круга, однако в XCode я в настоящее время испытываю некоторые несоответствия.
У меня есть два тестовых устройства (iPhone6 и iPod touch 5-го поколения). У меня также работает симулятор. Оба моих устройства отображаются правильно, но симулятор рисует круг как закругленный прямоугольник:
Код, который я использую для достижения этого (хотя и очень простой):
imgAvatar.layer.masksToBounds = true
imgAvatar.clipsToBounds = true
imgAvatar.layer.cornerRadius = imgAvatar.frame.size.width/2
imgAvatar.layer.borderWidth = 5
imgAvatar.layer.borderColor = UIColor.whiteColor().CGColor
Есть ли причина, почему это происходит? Это сводит меня с ума!
ОБНОВЛЕНИЕ Чтобы очистить путаницу, UIImageView
объявлен в моем раскадровке как 190x190
, он также имеет ограничение на соотношение сторон 1:1
, чтобы гарантировать, что он поддерживает пропорциональную ширину и высоту.
ОБНОВЛЕНИЕ 2 Чтобы помещать какие-либо подозрения в отношении ограничений, связанных с автоматической компоновкой, я добавил следующее изображение, которое показывает ограничения, установленные для imgAvatar
. Поскольку вы можете видеть совпадение по ширине и высоте, и AR установлен, чтобы гарантировать, что он поддерживает соотношение 1:1. Я надеюсь, что это устранит любые дальнейшие сомнения.
ANSWER Леонардо указал на чрезвычайно практичное и многоразовое решение для решения этой проблемы, используя расширения Swift, можно гарантировать, что данный UIImage всегда квадратный, поэтому всегда создавая круг, я опубликовал решение Leonardo ниже:
extension UIImage {
var circleMask: UIImage {
let square = size.width < size.height ? CGSize(width: size.width, height: size.width) : CGSize(width: size.height, height: size.height)
let imageView = UIImageView(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: square))
imageView.contentMode = UIViewContentMode.ScaleAspectFill
imageView.image = self
imageView.layer.cornerRadius = square.width/2
imageView.layer.borderColor = UIColor.whiteColor().CGColor
imageView.layer.borderWidth = 5
imageView.layer.masksToBounds = true
UIGraphicsBeginImageContext(imageView.bounds.size)
imageView.layer.renderInContext(UIGraphicsGetCurrentContext())
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return result
}
}
imgAvatar.image = yourImage.circleMask