Change UIButton BorderColor in Storyboard

后端 未结 7 1291
南笙
南笙 2020-12-12 14:31

I Set CornerRadius and BorderWidth for UIbutton in User Defined Runtime Attributes. Without adding layer.borderColor it works Well and Display border in bla

相关标签:
7条回答
  • 2020-12-12 15:13

    This works for me.

    Swift 3, Xcode 8.3

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

    }

    0 讨论(0)
  • 2020-12-12 15:16

    In case of Swift, function doesn't work. You'll need a computed property to achieve the desired result:

    extension CALayer {
        var borderColorFromUIColor: UIColor {
            get {
                return UIColor(CGColor: self.borderColor!)
            } set {
                self.borderColor = newValue.CGColor
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-12 15:21

    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

    0 讨论(0)
  • 2020-12-12 15:21

    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.

    0 讨论(0)
  • 2020-12-12 15:25

    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:

    The changes are also reflected in User Defined Runtime Attributes:

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

    0 讨论(0)
  • 2020-12-12 15:33

    For Swift:

    Swift 3:

    extension UIView {
    
        @IBInspectable var cornerRadius: CGFloat {
            get {
                return layer.cornerRadius
            }
            set {
                layer.cornerRadius = newValue
                layer.masksToBounds = newValue > 0
            }
        }
    
        @IBInspectable var borderWidth: CGFloat {
            get {
                return layer.borderWidth
            }
            set {
                layer.borderWidth = newValue
            }
        }
    
        @IBInspectable var borderColor: UIColor? {
            get {
                return UIColor(cgColor: layer.borderColor!)
            }
            set {
                layer.borderColor = newValue?.cgColor
            }
        }
    }
    

    Swift 2.2:

    extension UIView {
    
        @IBInspectable var cornerRadius: CGFloat {
            get {
                return layer.cornerRadius
            }
            set {
                layer.cornerRadius = newValue
                layer.masksToBounds = newValue > 0
            }
        }
    
        @IBInspectable var borderWidth: CGFloat {
            get {
                return layer.borderWidth
            }
            set {
                layer.borderWidth = newValue
            }
        }
    
        @IBInspectable var borderColor: UIColor? {
            get {
                return UIColor(CGColor: layer.borderColor!)
            }
            set {
                layer.borderColor = newValue?.CGColor
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题