UIView скругленных углов в Swift 4

В Swift 3 я мог бы сделать что-то подобное, чтобы закруглить углы UIView:

import UIKit

@IBDesignable
class DesignableView: UIView {
}

extension UIView {

    @IBInspectable
    var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
        }
    }
}

И в раскадровке я мог бы просто изменить это: properties

В настоящее время я получаю сообщение «Ошибка сборки» при проектировании, но не знаю, почему. Я работаю над быстрым 4 и Xcode 9.

Почему это не работает в Swift 4?


person Jonathan Solorzano    schedule 12.10.2017    source источник
comment
в чем проблема? Все работает нормально.   -  person Gagan_iOS    schedule 12.10.2017
comment
Предоставьте достаточный код, чтобы мы могли воспроизвести проблему.   -  person matt    schedule 12.10.2017
comment
@matt Я обновил код и добавил описательное изображение того, что я делаю в Xcode 8 и swift 3.   -  person Jonathan Solorzano    schedule 12.10.2017
comment
Но это не позволяет нам воспроизвести проблему. То, что вы показываете, работает нормально. (Попробуйте это в простом ванильном свежем проекте. Но, пожалуйста, не используйте для этого extension.) Проблема заключается в другом, и вы ее не показали.   -  person matt    schedule 12.10.2017
comment
Извините за публикацию вопроса, все работает нормально, у меня было представление изображения, из-за которого я подумал, что UIView не обновляется, в конце концов, это был визуальный эффект.   -  person Jonathan Solorzano    schedule 12.10.2017


Ответы (4)


Я пробовал ваш код, и он отлично работает с iOS 11.1 и Swift 4.0. (Как вы упомянули, это показывает вам ошибку, но не показывает мне никакой ошибки)

@IBDesignable
class RoundUIView: UIView {

    @IBInspectable var borderColor: UIColor = UIColor.white {
        didSet {
            self.layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable var borderWidth: CGFloat = 2.0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }

}

Вот результат

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


Обновление:
даже ваш обновленный код тоже работает нормально.

@IBDesignable
class DesignableView: UIView {
}

extension UIView {

    @IBInspectable
    var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
        }
    }
}

Вот результат для него:

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

person Krunal    schedule 12.10.2017
comment
Ответы, что простое состояние, которое у меня работает, на самом деле не являются приемлемыми ответами на переполнение стека. - person rmaddy; 12.10.2017
comment
@rmaddy Иногда требуется доказательство, чтобы показать ОП, что код работает. Я думаю, что этот ответ вполне разумен. - person matt; 12.10.2017
comment
@matt См. meta.stackoverflow.com/questions/277923/ - person rmaddy; 12.10.2017
comment
@rmaddy Хорошо, но мне все равно. Он говорит то, что говорит, и я говорю то, что говорю. Серви — это не закон, а мы тем временем здесь, в поле, пытаемся доказать тем, кто задает вопросы, что они не представили воспроизводимого случая. Если вы действительно так сильно к этому относитесь, отметьте ответ или понизьте его. - person matt; 12.10.2017
comment
@Krunal имя модуля не имеет значения; у него есть имя модуля, но он заблокировал его на своем снимке экрана, потому что не хочет, чтобы мы знали, что это такое (посмотрите внимательно, и вы увидите доказательства стирания) - person matt; 12.10.2017
comment
Спасибо! Идеальное решение. Как мы можем сделать это для UISearchbar? - person Faizan Mubasher; 20.02.2018
comment
@FaizanMubasher - поднимите новый вопрос с вашим точным требованием и примером кода, как добавить панель поиска в интерфейс. Я обязательно помогу вам решить ваши вопросы - person Krunal; 20.02.2018

Это решение работает для меня, чтобы получить округленный UIView в Swift 5.

view.layer.cornerRadius = 10;
view.clipsToBounds  =  true
person Arjun    schedule 26.05.2020

swift

public func RoundFrameBackground(_ aView: UIView!, borderWidth: CGFloat!, cornerRadius: CGFloat!, borderColor: UIColor, backgroundColor: UIColor) {
    aView.layer.borderWidth = borderWidth ; aView.layer.borderColor = borderColor.cgColor
    aView.backgroundColor = backgroundColor ; aView.clipsToBounds = true
    aView.layer.cornerRadius = cornerRadius
}

public func RoundFrameOnly(_ aView: UIView!, cornerRadius: CGFloat!) {
    aView.clipsToBounds = true
    aView.layer.cornerRadius = cornerRadius
}

использовать:

RoundFrameBackground(*a view*, borderWidth: 1, cornerRadius: 10, borderColor: UIColor.red, backgroundColor: UIColor.blue)

RoundFrameOnly(*a view*, cornerRadius: 10)
person iOS Flow    schedule 12.07.2018

Ваш код отлично работает в Swift 4.0 с новым проектом. Однако, , если вы используете раскадровку и также устанавливаете ее как LaunchScreen, вы не нельзя использовать пользовательские классы прямо здесь.

В этом случае просто снимите флажок Использовать как экран запуска, и вы сможете снова начать сборку.

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

person jvrmed    schedule 12.10.2017
comment
Это не на LaunchScreen - person Jonathan Solorzano; 12.10.2017
comment
Не могли бы вы поделиться дополнительной информацией об ошибке сборки? Подробные сообщения можно увидеть, открыв навигатор отчетов. - person jvrmed; 12.10.2017
comment
Нет ошибки сборки приложения, это проектируемая ошибка сборки, она не останавливает работу приложения. - person Jonathan Solorzano; 12.10.2017