Як створити кордон в UIButton?


174

Я використовую власну кнопку в моєму додатку під назвою "addButton", і я хочу обшити її білим кольором. Як я можу отримати межу білого кольору навколо моєї спеціальної кнопки?


Відповіді:


352

Ви можете встановити властивості кордону на CALayer, отримавши доступ до властивості шару кнопки.

Спочатку додайте кварц

#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


3
Переконайтесь, що ви пов’язали свою ціль із рамкою QuartCore на вкладці Фази збірки цільового редактора.
zekel

1
Чи потрібно імпортувати кварц? Я все ще можу отримати доступ до шару кнопки без нього. Моя мета запитати: які переваги ми отримуємо при імпорті кварцу
Алікс

1
плюс 1 за використанняCGColor
Anurag Sharma

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

Потім ви встановлюєте його як фонове зображення кнопки:

Властивості кнопки

Якщо ваше зображення є шаблоновим зображенням, ви можете встановити колір відтінку кнопки, і межа буде змінена:

Заключна кнопка

Тепер рамка буде підкреслена рештою кнопки при дотику.


З чого ви робите Зображення?
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;

8

Ось оновлена версія ( Swift 3.0.1 ) від Бена Packard в відповідь .

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: "")
            }
        }
    }
}

Отриману кнопку можна використовувати всередині вашої StoryBoard завдяки тегам @IBDesignableта @IBInspectable.

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

Також два визначені властивості дозволяють встановлювати ширину та колір межі безпосередньо на програмі інтерфейсу та попередньо переглядати результат.

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

Інші властивості можуть бути додані аналогічно, для радіуса кордону та підкреслення часу вицвітання.


У мене проблеми з обмеженнями на швидкості 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];

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: [Рекомендовано]

Використовуйте метод розширення, так що кнопка через додаток буде виглядати послідовно і не потрібно повторювати кілька рядків коду скрізь.

//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 ****

Для створення кордону

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

Щоб кут був закругленим

 btnName.layer.cornerRadius = 5

1

Швидкий 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 теж прийнятний!
Карлос Ірано
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.