Подтвердить что ты не робот

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

4b9b3361

Ответ 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

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