Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change UIButton BorderColor in Storyboard

I Set CornerRadius and BorderWidth for UIbutton in User Defined Runtime Attributes. Without adding layer.borderColor it works Well and Display border in black color. But when add layer.borderColor does not work(does not show border).

enter image description here

like image 666
Mohamed Jaleel Nazir Avatar asked Mar 04 '15 12:03

Mohamed Jaleel Nazir


People also ask

How do I add a border to UIButton storyboard?

Border Color you can set your UIButton User Defined Run Time Attributes ie borderWidth, cornerRadius, borderColor etc. As shown in the image. Note:- don't use layer. before the attribute name, it will not work.


5 Answers

I got answer. Change borderColor instead of layer.borderColor:

Xcode snippet

and add this code in .m file:

#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)

- (void)setBorderColorFromUIColor:(UIColor *)color
{
    self.borderColor = color.CGColor;
}

@end

Tick properties in Attribute Inspector

Attribute Inspector

like image 165
Mohamed Jaleel Nazir Avatar answered Oct 05 '22 14:10

Mohamed Jaleel Nazir


Swift 4, Xcode 9.2 - Use IBDesignable and IBInspectable to build custom controls and live preview the design in Interface Builder.

Here is a sample code in Swift, place just below the UIKit in ViewController.swift:

@IBDesignable extension UIButton {

    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
        }
        get {
            return layer.cornerRadius
        }
    }

    @IBInspectable var borderColor: UIColor? {
        set {
            guard let uiColor = newValue else { return }
            layer.borderColor = uiColor.cgColor
        }
        get {
            guard let color = layer.borderColor else { return nil }
            return UIColor(cgColor: color)
        }
    }
}

If you go to the Attributes inspectable of the view, you should find these properties visually, edit the properties:

enter image description here

The changes are also reflected in User Defined Runtime Attributes:

enter image description here

Run in build time and Voila! you will see your clear rounded button with border.

enter image description here

like image 29
Cons Bulaquena Avatar answered Oct 05 '22 13:10

Cons Bulaquena


The explanation, perhaps being lost in some of the other answers here:

The reason that this property is not being set is that layer.borderColor needs a value with type CGColor.

But only UIColor types can be set via Interface Builder's User Defined Runtime Attributes!

So, you must set a UIColor to a proxy property via Interface Builder, then intercept that call to set the equivalent CGColor to the layer.borderColor property.

This can be accomplished by creating a Category on CALayer, setting the Key Path to a unique new "property" (borderColorFromUIColor), and in the category overriding the corresponding setter (setBorderColorFromUIColor:).

like image 29
pkamb Avatar answered Oct 05 '22 13:10

pkamb


There is a much better way to do this! You should use @IBInspectable. Check out Mike Woelmer's blog entry here: https://spin.atomicobject.com/2017/07/18/swift-interface-builder/

It actually adds the feature to IB in Xcode! Some of the screenshots in other answers make it appear as though the fields exist in IB, but at least in Xcode 9 they do not. But following his post will add them.

like image 26
cdeerinck Avatar answered Oct 05 '22 14:10

cdeerinck


This works for me.

Swift 3, Xcode 8.3

Identity inspector (UIButton in this case

CALayer extension:

extension CALayer {
var borderWidthIB: NSNumber {
    get {
        return NSNumber(value: Float(borderWidth))
    }
    set {
        borderWidth = CGFloat(newValue.floatValue)
    }
}
var borderColorIB: UIColor? {
    get {
        return borderColor != nil ? UIColor(cgColor: borderColor!) : nil
    }
    set {
        borderColor = newValue?.cgColor
    }
}
var cornerRadiusIB: NSNumber {
    get {
        return NSNumber(value: Float(cornerRadius))
    }
    set {
        cornerRadius = CGFloat(newValue.floatValue)
    }
}

}

like image 39
Jovan Stankovic Avatar answered Oct 05 '22 13:10

Jovan Stankovic