Swift - как задать угловой радиус изображения
В objective-c такая строка
self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0f;
выполняет свою работу, я попробовал его в Swift, используя аналогию
self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
и это ничего не меняет, углы такие же, как раньше. Более того, XCode не показывает никаких синтаксических ошибок. Поддерживает ли Swift какой-либо другой способ достижения этой цели? Я проверил некоторые другие темы здесь, и обычно это делается в Свифте, как показано выше.
Ответы
Ответ 1
Слой вытягивается из области клипа, вам нужно настроить его на маскировку:
self.mainImageView.layer.masksToBounds = true
Из docs:
По умолчанию радиус угла не применяется к изображению в свойство содержимого слоев; он применяется только к цвету фона и границы слоя. Однако, задав свойство masksToBounds true приводит к тому, что содержимое обрезается до закругленных углов.
Ответ 2
Существует одна крошечная разница в Swift 3.0 и Xcode8
Всякий раз, когда вы хотите применить радиус угла к UIView, убедитесь, что вы вызываете
yourUIView.layoutIfNeeded()
перед вызовом cornerRadius
.
В противном случае он вернет значение по умолчанию для высоты и ширины UIView (1000.0), что, вероятно, приведет к исчезновению вашего представления.
Всегда проверяйте, чтобы все эффекты, изменяющие размер UIView (ограничения компоновщика интерфейса и т.д.), применяются перед установкой любых свойств слоя.
Пример реализации класса UIView
class BadgeView: UIView {
override func awakeFromNib() {
self.layoutIfNeeded()
layer.cornerRadius = self.frame.height / 2.0
layer.masksToBounds = true
}
}
Ответ 3
попробуйте это
self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
self.mainImageView.clipsToBounds = true
Ответ 4
в swift 3 'CGRectGetWidth' заменен свойством 'CGRect.width'
view.layer.cornerRadius = view.frame.width/4.0
view.clipsToBounds = true
Ответ 5
Самый простой способ - создать подкласс UIImageView (я его пробовал и отлично работает на iPhone 7 и XCode 8):
class CIRoundedImageView: UIImageView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
self.layoutIfNeeded()
layer.cornerRadius = self.frame.height / 2.0
layer.masksToBounds = true
}
}
а затем вы также можете установить границу:
imageView.layer.borderWidth = 2.0
imageView.layer.borderColor = UIColor.blackColor().CGColor
Ответ 6
Отмечено с помощью @IBInspectable
в swift (или IBInspectable в Objective-C), они легко редактируются в панели инспекторов атрибутов Interface Builders.
Вы можете напрямую установить borderWidth, cornerRadius, borderColor в указателе атрибутов
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get{
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
return UIColor(cgColor: layer.borderColor!)
}
set {
layer.borderColor = borderColor?.cgColor
}
}
}
![введите описание изображения здесь]()
Ответ 7
Swift3 ----- XCode-8 ----- iOS10
DispatchQueue.main.async {
self.mainImageView.layer.cornerRadius = self.mainImageView.bounds.size.width / 2.0
self.mainImageView.clipsToBounds = true
}
Ответ 8
Вы можете определить радиус границы любого вида, предоставляя "Пользовательские атрибуты времени выполнения", предоставляя ключевой путь "layer.cornerRadius" строки типа, а затем значение радиуса, которое вам нужно;)
См. Прикрепленные изображения ниже:
![Configuring in XCode]()
![Результат в эмуляторе]()