Как программно установить пользовательский цвет границы 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.