Как программно установить пользовательский цвет границы 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, дело не в обновлении ответа. Это запрос на редактирование, может быть в комментариях к автору. Вы поняли то, что я пытался передать.
Раджан Махешвари
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.