Как создать границу в UIButton?

174

Я использую пользовательскую кнопку в своем приложении с именем «addButton», и я хочу выделить ее белым цветом, как я могу получить белую рамку вокруг моей пользовательской кнопки?

iPhone
источник
возможный дубликат Добавить рамку и тень на кнопки
Ankur

Ответы:

352

Вы можете установить свойства границы в CALayer, открыв свойство layer кнопки.

Сначала добавьте кварц

#import <QuartzCore/QuartzCore.h>

Установить свойства:

myButton.layer.borderWidth = 2.0f;
myButton.layer.borderColor = [UIColor greenColor].CGColor;

Видеть:

https://developer.apple.com/documentation/quartzcore/calayer#//apple_ref/occ/cl/CALayer

CALayer по ссылке выше позволяет вам установить другие свойства, такие как радиус радиуса, maskToBounds и т. Д.

Также хорошая статья о кнопке веселья:

https://web.archive.org/web/20161221132308/http://www.apptite.be/tutorial_custom_uibuttons.php

bryanmac
источник
3
Убедитесь, что вы связали свою цель с платформой QuartCore на вкладке Фазы сборки редактора целей.
Zekel
1
Нужно ли импортировать кварц? Я все еще могу получить доступ к слою кнопки без него. Я задаюсь вопросом: какие преимущества мы получаем при импорте кварца
Alix
1
плюс 1 за использованиеCGColor
Анураг Шарма
51

Это очень просто, просто добавьте заголовок quartzCore в свой файл (для этого вы должны добавить каркас кварца в свой проект)

а затем сделать это

[[button layer] setCornerRadius:8.0f];

[[button layer] setMasksToBounds:YES];

[[button layer] setBorderWidth:1.0f];

Вы можете изменить значения с плавающей запятой по мере необходимости.

наслаждаться.


Вот типичный современный код ...

self.buttonTag.layer.borderWidth = 1.0f;
self.buttonCancel.layer.borderWidth = 1.0f;

self.buttonTag.layer.borderColor = [UIColor blueColor].CGColor;
self.buttonCancel.layer.borderColor = [UIColor blueColor].CGColor;

self.buttonTag.layer.cornerRadius = 4.0f;
self.buttonCancel.layer.cornerRadius = 4.0f;

это похоже на сегментированные элементы управления.

ОБНОВЛЕНИЕ для Swift:

  • Не нужно добавлять "QuartzCore"

Просто сделать:

button.layer.cornerRadius = 8.0
button.layer.borderWidth = 1.0
button.layer.borderColor = UIColor.black.cgColor
Аджит Пратап Маурья
источник
23

И в быстрых, вам не нужно импортировать "QuartzCore / QuartzCore.h"

Просто используйте:

button.layer.borderWidth = 0.8
button.layer.borderColor = (UIColor( red: 0.5, green: 0.5, blue:0, alpha: 1.0 )).cgColor

или

button.layer.borderWidth = 0.8
button.layer.borderColor = UIColor.grayColor().cgColor
Щипцы
источник
Согласно XCode 9, «CGColor был переименован в cgColor».
BlenderBender
20

Проблема в настройке слоя borderWidthи borderColorсостоит в том, что когда вы касаетесь кнопки, граница не оживляет эффект выделения.

Конечно, вы можете наблюдать за событиями кнопки и соответственно менять цвет границы, но это не нужно.

Другой вариант - создать растягиваемый UIImage и установить его в качестве фонового изображения кнопки. Вы можете создать набор изображений в вашем Images.xcassets следующим образом:

Images.xcassets

Затем вы устанавливаете его как фоновое изображение кнопки:

Свойства кнопки

Если ваше изображение является шаблоном изображения, вы можете установить оттенок цвета кнопки, и граница изменится:

Последняя кнопка

Теперь граница будет выделена с остальной частью кнопки при прикосновении.

Juanjo
источник
Из чего вы делаете изображение?
Bigfoot11
1
Для создания этого изображения я использовал Sketch, но вы можете использовать Gimp, Illustrator, Photoshop ...
juanjo
Хороший ответ. Это лучше, чем менять слой borderWidth.
Александр Долоз
8

Чтобы изменить кнопку Радиус, Цвет и Ширина я установил так:

self.myBtn.layer.cornerRadius = 10;
self.myBtn.layer.borderWidth = 1;
self.myBtn.layer.borderColor =[UIColor colorWithRed:189.0/255.0f green:189.0/255.0f blue:189.0/255.0f alpha:1.0].CGColor;
Alex
источник
8

Вот обновленная версия ( Swift 3.0.1 ) из ответа Бена Паккарда .

import UIKit

@IBDesignable class BorderedButton: UIButton {

    @IBInspectable var borderColor: UIColor? {
        didSet {
            if let bColor = borderColor {
                self.layer.borderColor = bColor.cgColor
            }
        }
    }

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

    override var isHighlighted: Bool {
        didSet {
            guard let currentBorderColor = borderColor else {
                return
            }

            let fadedColor = currentBorderColor.withAlphaComponent(0.2).cgColor

            if isHighlighted {
                layer.borderColor = fadedColor
            } else {

                self.layer.borderColor = currentBorderColor.cgColor

                let animation = CABasicAnimation(keyPath: "borderColor")
                animation.fromValue = fadedColor
                animation.toValue = currentBorderColor.cgColor
                animation.duration = 0.4
                self.layer.add(animation, forKey: "")
            }
        }
    }
}

В результате кнопка может быть использована внутри раскадровки , благодаря применению @IBDesignableи @IBInspectableтегов.

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

Также определены два свойства, позволяющие установить ширину и цвет границы непосредственно в конструкторе интерфейса и предварительно просмотреть результат.

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

Другие свойства могут быть добавлены аналогичным образом для радиуса границы и времени затухания выделения.

LaloLoop
источник
У меня проблемы с ограничениями по Swift 4, я сделал полноразмерную кнопку (из стороны в сторону по ширине), В xcode я очень хорошо видел предварительный просмотр границы, но поверх эмулятора или устройства я увидел, что граница уменьшена до размера текст внутри кнопки. Единственное ограничение авторазметки, которое я добавил, было центрировано по горизонтали, как это исправить? Спасибо!
Кристиан Чапарро А.
@CristianChaparroA. Причина в том, что вызывается prepareForInterfaceBuilderтолько из IB, а не при запуске приложения. Так что также установите UIEdgeInsets awakeFromNib, тогда он будет отображаться и при запуске приложения.
Самуэль
6

Вам не нужно импортировать QuartzCore.hсейчас. Беру iOS 8 sdk и Xcode 6.1 в ссылке.

Непосредственно используйте:

[[myButton layer] setBorderWidth:2.0f];
[[myButton layer] setBorderColor:[UIColor greenColor].CGColor];
Vinay Jain
источник
6

Вот UIButtonподкласс, который поддерживает выделенную анимацию состояния без использования изображений. Он также обновляет цвет границы при изменении режима оттенка вида.

class BorderedButton: UIButton {
    override init(frame: CGRect) {
        super.init(frame: frame)

        layer.borderColor = tintColor.CGColor
        layer.borderWidth = 1
        layer.cornerRadius = 5

        contentEdgeInsets = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("NSCoding not supported")
    }

    override func tintColorDidChange() {
        super.tintColorDidChange()

        layer.borderColor = tintColor.CGColor
    }

    override var highlighted: Bool {
        didSet {
            let fadedColor = tintColor.colorWithAlphaComponent(0.2).CGColor

            if highlighted {
                layer.borderColor = fadedColor
            } else {
                layer.borderColor = tintColor.CGColor

                let animation = CABasicAnimation(keyPath: "borderColor")
                animation.fromValue = fadedColor
                animation.toValue = tintColor.CGColor
                animation.duration = 0.4
                layer.addAnimation(animation, forKey: "")
            }
        }
    }
}

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

let button = BorderedButton(style: .System) //style .System is important

Внешность:

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

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

Бен Паккард
источник
6

Это может быть достигнуто различными способами в Swift 3.0. Работает на последней версии Август - 2017

Опция 1:

Непосредственно назначьте значения свойства borderWidth для кнопки пользовательского интерфейса:

  btnUserButtonName.layer.borderWidth = 1.0

Установить заголовок со значениями цвета по умолчанию для кнопки пользовательского интерфейса:

btnUserButtonName.setTitleColor(UIColor.darkGray, for: .normal)

Установите границу с цветом по умолчанию для значений свойств границы для кнопки пользовательского интерфейса:

btnUserButtonName.layer.borderColor = UIColor.red

Установите пользовательский цвет для значений свойств границы для кнопки пользовательского интерфейса:

   let myGrayColor = UIColor(red: 0.889415, green: 0.889436, blue:0.889424, alpha: 1.0 )
   btnUserButtonName.layer.borderColor = myGrayColor.cgColor

Вариант 2: [Рекомендуется]

Используйте метод Extension, чтобы Button во всем приложении выглядела согласованно и не нужно было повторять несколько строк кода где угодно.

//Create an extension class in any of the swift file

extension UIButton {
func setBordersSettings() {
        let c1GreenColor = (UIColor(red: -0.108958, green: 0.714926, blue: 0.758113, alpha: 1.0))
        self.layer.borderWidth = 1.0
        self.layer.cornerRadius = 5.0
        self.layer.borderColor = c1GreenColor.cgColor
        self.setTitleColor(c1GreenColor, for: .normal)
        self.layer.masksToBounds = true
    }
}

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

//use the method and call whever the border has to be applied

btnUserButtonName.setBordersSettings()

Вывод метода расширения Кнопка:

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

БХУВАНЕШ МОХАНКУМАР
источник
2

Обновление со Swift 3

    button.layer.borderWidth = 0.8
    button.layer.borderColor = UIColor.blue.cgColor

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

Радж Джоши
источник
2

**** В Свифт 3 ****

Создать границу

 btnName.layer.borderWidth = 1
 btnName.layer.borderColor = UIColor.black.cgColor

Сделать угол закругленным

 btnName.layer.cornerRadius = 5
Джайсвал Раджан
источник
1

Swift 5

button.layer.borderWidth = 2

Для изменения цвета рамки используйте

button.layer.borderColor = CGColor(srgbRed: 255/255, green: 126/255, blue: 121/255, alpha: 1)
Фахим Рахман
источник
1
button.layer.borderColor = UIColor.gray.cgColor тоже приемлемо!
Карлос Ирана