Как установить угловой радиус imageView?

В 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 какой-либо другой способ достижения этой цели? Я проверил некоторые другие темы здесь, и обычно это делается в Swift так, как показано выше.


person theDC    schedule 09.01.2015    source источник
comment
self.mainImageView.layer.cornerRadius = (self.mainImageView.frame)/2.0   -  person Kirit Modi    schedule 09.01.2015
comment
CGRect не конвертируется в double   -  person theDC    schedule 09.01.2015
comment
self.mainImageView.layer.cornerRadius = (self.mainImageView.frame.size.height)/2.0 тоже не работает   -  person theDC    schedule 09.01.2015


Ответы (10)


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

self.mainImageView.layer.masksToBounds = true

Из документов:

По умолчанию радиус угла не применяется к изображению в свойстве содержимого слоя; он применяется только к фоновому цвету и границе слоя. Однако установка для свойства masksToBounds значения true приводит к тому, что содержимое обрезается до закругленных углов.

person DarthMike    schedule 09.01.2015
comment
Я пропустил эту строку, теперь все работает отлично, спасибо, @DarthMike! - person theDC; 09.01.2015
comment
этот ответ верен для закругления после получения изображения из URL-адреса и установки изображения для просмотра - person iman kazemayni; 24.12.2017
comment
мой guuyyyy приятно! - person rolandforbes; 15.11.2020

Между 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

   }
 }
person theDC    schedule 25.09.2016
comment
masksToBounds также был нужен мне, чтобы заставить его работать после обновления до Swift 3.0. - person erics; 18.11.2016

Вы можете определить радиус границы любого вида, предоставив «Определенные пользователем атрибуты времени выполнения», указав ключевой путь «layer.cornerRadius» строки типа, а затем значение необходимого радиуса;) См. Прикрепленные изображения ниже:

Настройка в XCode

Результат в эмуляторе

person Marcelo Tadeu    schedule 25.09.2017
comment
Это чистое и простое решение - person Vincent Gigandet; 10.03.2018

попробуй это

self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
self.mainImageView.clipsToBounds = true
person Anbu.Karthik    schedule 18.11.2015

Помеченные @IBInspectable в swift (или IBInspectable в Objective-C), они легко редактируются на панели инспектора атрибутов Interface Builder.
Вы можете напрямую установить 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
    }
  }
}

введите описание изображения здесь

person Amit Jagesha シ    schedule 02.06.2017
comment
Цвет границы не работает. Он всегда возвращает черный. - person Joe Sene; 12.06.2017
comment
@JoeSene layer.borderColor = borderColor?.cgColor неверен, просто обновите его следующим образом: layer.borderColor = newValue?.cgColor - person Phuc Dang; 06.08.2019

в swift 3 «CGRectGetWidth» заменено свойством «CGRect.width»

    view.layer.cornerRadius = view.frame.width/4.0
    view.clipsToBounds = true
person Nicolas Desormiere    schedule 04.08.2016

Свифт 3, Xcode 8, iOS 10

DispatchQueue.main.async {
  self.mainImageView.layer.cornerRadius = self.mainImageView.bounds.size.width / 2.0
  self.mainImageView.clipsToBounds = true
}
person Gaurav Rami    schedule 26.09.2016
comment
Вызов из основного потока помог мне, потому что я округлил containerView — который был подпредставлением моих ячеек tableView — в методе делегата willDisplay tableView. Без вызова из основного потока кадр был неправильным - person fredericdnd; 11.09.2018

Самый простой способ - создать подкласс 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
person Claudia Fitero    schedule 05.10.2016

Я создал расширение UIView, которое позволяет закруглять определенные углы:

import UIKit

enum RoundType {
    case top
    case none
    case bottom
    case both
}

extension UIView {

    func round(with type: RoundType, radius: CGFloat = 3.0) {
        var corners: UIRectCorner

        switch type {
        case .top:
            corners = [.topLeft, .topRight]
        case .none:
            corners = []
        case .bottom:
            corners = [.bottomLeft, .bottomRight]
        case .both:
            corners = [.allCorners]
        }

        DispatchQueue.main.async {
            let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            self.layer.mask = mask
        }
    }

}
person fredericdnd    schedule 11.09.2018

import UIKit

class BorderImage: UIImageView {

    override func awakeFromNib() {
        self.layoutIfNeeded()
        layer.cornerRadius = self.frame.height / 10.0
        layer.masksToBounds = true
    }
}

На основе ответа @DCDC

person Chinedu Ofor    schedule 28.01.2020