Как программно установить пользовательский цвет границы UIView?

99

Я пытаюсь программно установить пользовательский цвет границы UIView в Swift.

Шаши Верма
источник
3
Покажите соответствующий код в вашем вопросе. Объясните, в чем проблема.
rmaddy
1
возможный дубликат Cocoa Touch: как изменить цвет и толщину границы UIView? вам просто нужно использовать его быстро,
Индер Кумар Ратор

Ответы:

201

Если вы используете Swift 2.0+

self.yourView.layer.borderWidth = 1
self.yourView.layer.borderColor = UIColor(red:222/255, green:225/255, blue:227/255, alpha: 1).cgColor
Шаши Верма
источник
Примечание: это, похоже, не сработало для меня (возможно, потому, что я использую Swift 3.1?). Версия
Эшли Кулман
Я отредактировал свой ответ. это обязательно сработает для вас .. Эшли Кулман
Шаши Верма
1
Вам не нужно явно вызывать init в swift 3.
ibrahimab
Можно ли использовать более одного цвета?
Gökhan okkeçeci
4
Есть ли разница между вашими двумя версиями?
Fogmeister
88

В Swift 4 вы можете установить цвет и ширину границы для UIControls, используя приведенный ниже код.

let yourColor : UIColor = UIColor( red: 0.7, green: 0.3, blue:0.1, alpha: 1.0 )
yourControl.layer.masksToBounds = true
yourControl.layer.borderColor = yourColor.CGColor
yourControl.layer.borderWidth = 1.0

<Swift 4 , вы можете установить ширину и цвет границы UIView, используя приведенный ниже код.

yourView.layer.borderWidth = 1

yourView.layer.borderColor = UIColor.red.cgColor
Парас Джоши
источник
1
@ShashiVerma пожалуйста. Чтобы получить более подробную информацию о слоях, прочтите справочные документы по классам различных объектов Apple, так что это также будет полезно для вас :)
Парас Джоши
16

Используйте @IBDesignable и @IBInspectable, чтобы сделать то же самое.

Их можно использовать повторно, легко изменить из Interface Builder, и изменения немедленно отражаются в раскадровке.

Соответствие объектов в раскадровке определенному классу

Фрагмент кода:

@IBDesignable
class CustomView: UIView{

@IBInspectable var borderWidth: CGFloat = 0.0{

    didSet{

        self.layer.borderWidth = borderWidth
    }
}


@IBInspectable var borderColor: UIColor = UIColor.clear {

    didSet {

        self.layer.borderColor = borderColor.cgColor
    }
}

override func prepareForInterfaceBuilder() {

    super.prepareForInterfaceBuilder()
}

}

Позволяет легко изменять из Interface Builder:

Разработчик интерфейса

Супратик Маджумдар
источник
Мне больше нравится это решение, так как оно является многоразовым, где мы устанавливаем UIView на customview, но все же оставляет место для дополнительных изменений.
n0rm 07
Это был мой любимый способ добиться этого, но с темным режимом он не очень хорошо работает. Он получает цветовой стиль текущей MacOS и использует статический. Но встроить, @IBDesignableи @IBInspectableвсе работает хорошо, поэтому у таможни должен быть способ использовать Color Assets и в темном, и в светлом режиме ~ кто-нибудь знает, как этого добиться?
Nomad Developer
12

Вы можете написать расширение, чтобы использовать его со всеми UIView, например. UIButton, UILabel, UIImageView и т. Д. Вы можете настроить мой следующий метод в соответствии с вашими требованиями, но я думаю, что он подойдет вам.

extension UIView{

    func setBorder(radius:CGFloat, color:UIColor = UIColor.clearColor()) -> UIView{
        var roundView:UIView = self
        roundView.layer.cornerRadius = CGFloat(radius)
        roundView.layer.borderWidth = 1
        roundView.layer.borderColor = color.CGColor
        roundView.clipsToBounds = true
        return roundView
    }
}

Использование:

btnLogin.setBorder(7, color: UIColor.lightGrayColor())
imgViewUserPick.setBorder(10)
Шардул
источник
1
@luda, я не думаю, что у него / нее есть большой выбор в отношении языка API!
Worthwords 06
8

быстрый 3

func borderColor(){

    self.viewMenuItems.layer.cornerRadius = 13
    self.viewMenuItems.layer.borderWidth = 1
    self.viewMenuItems.layer.borderColor = UIColor.white.cgColor
}
Дипак Тагадия
источник
8

Swift 5.2 , расширение UIView +

extension UIView {
    public func addViewBorder(borderColor:CGColor,borderWith:CGFloat,borderCornerRadius:CGFloat){
        self.layer.borderWidth = borderWith
        self.layer.borderColor = borderColor
        self.layer.cornerRadius = borderCornerRadius

    }
}

Вы использовали это расширение;

yourView.addViewBorder(borderColor: #colorLiteral(red: 0.6, green: 0.6, blue: 0.6, alpha: 1), borderWith: 1.0, borderCornerRadius: 20)
Икбал
источник
вы пропустили добавление clipsToBounds = true
Бент Эль-Эслам
3

Напишите код в своем viewDidLoad()

self.view.layer.borderColor = anyColor().CGColor

И вы можете установить ColorсRGB

func anyColor() -> UIColor {
    return UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 1.0)
}

Узнавайте что - то о CALayerвUIKit

Итан Джо
источник
Каким-то образом он ничего не делает, если вы явно не установили ширину границы.
Николас Миари
@NicolasMiari, чего и следовало ожидать ... вы не видите цвет границы, для которого не установили размер.
Джоно Гатри,
Извините, я забыл упомянуть, что имел в виду текстовые поля ... которые, похоже, с самого начала имеют ненулевую ширину границы по умолчанию. Однако я изо всех сил пытался отразить заданный мной цвет, пока я явно не установил ширину границы.
Николас Миари
3

быстрый 3.0

self.uiTextView.layer.borderWidth = 0.5
    self.txtItemShortDes.layer.borderColor = UIColor(red:205.0/255.0, green:205.0/255.0, blue:205.0/255.0, alpha: 1.0).cgColor
Чатура Джаянака
источник
3

Мы можем создать для этого метод. Просто используйте это.

public func createBorderForView(color: UIColor, radius: CGFloat, width: CGFloat = 0.7) {
    self.layer.borderWidth = width
    self.layer.cornerRadius = radius
    self.layer.shouldRasterize = false
    self.layer.rasterizationScale = 2
    self.clipsToBounds = true
    self.layer.masksToBounds = true
    let cgColor: CGColor = color.cgColor
    self.layer.borderColor = cgColor
}
Г-н Джавед Мултани
источник
2

Swift 3.0

       groundTrump.layer.borderColor = UIColor.red.cgColor
Вадим Башуров
источник
Вместо добавления нового ответа вы, должно быть, отправили запрос на редактирование первоначальному ответчику
Махешвари
@RajanMaheshwari Пожалуйста, нет. Не добавляйте код к ответам других людей. Обновления следует публиковать как собственные, а не в другие ответы. Таким образом, каждый постер несет ответственность за то, что он публикует ...
Эрик Айя,
@EricAya, дело не в обновлении ответа. Это запрос на редактирование, может быть в комментариях к автору. Вы поняли то, что я пытался передать.
Раджан Махешвари