स्टोरीबोर्ड में UIButton BorderColor बदलें


80

मैं उपयोगकर्ता परिभाषित रनटाइम विशेषताओं में UIbutton के लिए CornerRadius और BorderWidth सेट करता हूं। बिना layer.borderColor जोड़े यह ब्लैक कलर में वेल और डिस्प्ले बॉर्डर का काम करता है। लेकिन जब लेयर जोड़ते हैं।बॉर्डरकलर काम नहीं करता है (सीमा नहीं दिखाता है)।

यहाँ छवि विवरण दर्ज करें

जवाबों:


159

स्विफ्ट के लिए:

यहाँ छवि विवरण दर्ज करें

स्विफ्ट 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
        }
    }
}

स्विफ्ट 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
        }
    }
}

हैलो, मैं उद्देश्य c में CustomeView वर्ग बना रहा हूँ, लेकिन इसके स्टोरीबोर्ड में नहीं दिखा रहा है Plz मेरी मदद करें।
पूजा श्रीवास्तव

इसके लिए एक टन धन्यवाद! :)
विजय वी.एस.

धन्यवाद, विस्मयकारी, बिल्कुल सही
Abo3atef

1
हालाँकि, XCode (संस्करण 8.3.3 (8E3004b)) पूर्वावलोकन में परिणाम नहीं दिखाता है, क्या यह सही है और बदलने का कोई तरीका नहीं है (कस्टम दृश्य बनाने के अलावा)?
कॉन्स्टेंटिन बेरकोव

यह सबसे सुरुचिपूर्ण समाधान है! अच्छी नौकरी!
ज़ोल्टन विंकलर

88

मुझे जवाब मिल गया। परत के बजाय बॉर्डर रंग बदलें । सीमा :

Xcode स्निपेट

और इस कोड को .m फ़ाइल में जोड़ें:

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

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

@end

गुण निरीक्षक में टिक गुण

निरीक्षक की भूमिका निभाएं


5
@jithin मैं एक स्विफ्ट विस्तार के रूप में यह लिखा था, यहाँ कोड है: विस्तार CALayer {समारोह setBorderColorFromUIColor (रंग: UIColor) {self.borderColor = color.CGColor}}
लड़का

1
ट्रिक काम कर गई। आंशिक रूप से। कैसे मैं पृथ्वी पर काला बॉर्डर रंग मिल रहा है, भले ही मैंने लाल रंग निर्दिष्ट किया हो? !!!!!! कोई विचार? किसी को?
स्थैतिक ० .६ static

@ static0886: यह इस वजह से था कि आप जो रंग लगा रहे हैं वह सीमा पर सेट नहीं है। मेरी समझ के अनुसार हम स्टोरीबोर्ड से बॉर्डर कलर सेट नहीं कर सकते हैं क्योंकि यह प्रॉपर्टी रनटाइम में UIComponent में परिलक्षित नहीं होगी। डिफ़ॉल्ट रूप से यह काला रंग है। यदि आप विशेषताओं से रंग की संपत्ति को हटाकर एक परीक्षण देना चाहते हैं।
जावेद

स्विफ्ट के लिए आप इसे इस प्रकार सेट कर सकते हैं: self.button.layer.borderColor = <UIColor.CGColor>
Sam

उस लेयर.बॉर्डरकोलरफ्रेम यूकोलर ने मेरे लिए स्टोरी बोर्ड में काम किया। धन्यवाद।
रामकृष्ण

50

स्विफ्ट 4, एक्सकोड 9.2 - कस्टम कंट्रोल बनाने IBDesignableऔर उपयोग IBInspectableकरने और इंटरफ़ेस बिल्डर में डिजाइन का पूर्वावलोकन करने के लिए।

यहाँ Swift में एक नमूना कोड है, UIKitViewController.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)
        }
    }
}

यदि आप दृश्य के निरीक्षण योग्य गुणों पर जाते हैं, तो आपको इन गुणों को नेत्रहीन रूप से ढूंढना चाहिए, गुणों को संपादित करें:

यहाँ छवि विवरण दर्ज करें

परिवर्तन उपयोगकर्ता परिभाषित रनटाइम विशेषताओं में भी परिलक्षित होते हैं:

यहाँ छवि विवरण दर्ज करें

निर्माण समय और Voila में भागो! आप सीमा के साथ अपना स्पष्ट गोल बटन देखेंगे।

यहाँ छवि विवरण दर्ज करें


इससे मुझे स्टोरीबोर्ड में इसे हासिल करने में मदद मिली। आपका जवाब लागू करने के लिए बहुत स्पष्ट है।
आर। मोहन

इस सवाल का सबसे सटीक उत्तर स्पष्ट रूप से समझाया गया उदाहरण है।
SeaWarrior404

यदि आप ऑब्जेक्टिव-सी के लिए जोड़ सकते हैं, तो इसकी सराहना की जाएगी।
मिहिर ओझा

9

स्पष्टीकरण, शायद यहाँ कुछ अन्य उत्तरों में खो रहा है:

यह गुण सेट नहीं होने का कारण यह है कि layer.borderColorप्रकार के साथ एक मूल्य की आवश्यकता है CGColor

लेकिन UIColorइंटरफ़ेस बिल्डर के उपयोगकर्ता परिभाषित रनटाइम एट्रीब्यूट के माध्यम से केवल प्रकार सेट किए जा सकते हैं!

इसलिए, आपको इंटरफ़ेस बिल्डर के माध्यम से एक प्रॉक्सी प्रॉपर्टी के लिए एक यूआईसीकलर सेट करना होगा, फिर इंटरसेप्ट करें जो कॉल करने के लिए बराबर CGColor सेट करें layer.borderColor संपत्ति है।

यह कैलेयर पर एक श्रेणी बनाकर, एक अद्वितीय नए "संपत्ति" ( borderColorFromUIColor) के लिए कुंजी पथ सेट करके पूरा किया जा सकता है , और संबंधित सेटर ( setBorderColorFromUIColor:) से आगे निकलने वाली श्रेणी में ।


1

ऐसा करने का एक बेहतर तरीका है! आपको @IBInspectable का उपयोग करना चाहिए। यहां देखें माइक वोल्मर की ब्लॉग प्रविष्टि: देखें https://spin.atomicobject.com/2017/07/18/swift-interface-IIder/

यह वास्तव में Xcode में IB को फीचर जोड़ता है! अन्य उत्तरों में से कुछ स्क्रीनशॉट में यह दिखाई देता है जैसे कि आईबी में फ़ील्ड मौजूद हैं, लेकिन कम से कम Xcode 9 में वे नहीं हैं। लेकिन उनके पोस्ट के बाद उन्हें जोड़ा जाएगा।


मैंने इस दृष्टिकोण की कोशिश की और इसने Xcode को बहुत धीमा कर दिया। क्या यह आप सभी के साथ भी हो रहा है?
मेप

0

स्विफ्ट के मामले में, फ़ंक्शन काम नहीं करता है। वांछित परिणाम प्राप्त करने के लिए आपको एक संगणित संपत्ति की आवश्यकता होगी:

extension CALayer {
    var borderColorFromUIColor: UIColor {
        get {
            return UIColor(CGColor: self.borderColor!)
        } set {
            self.borderColor = newValue.CGColor
        }
    }
}

0

यह मेरे लिए काम करता है।

स्विफ्ट 3, एक्सकोड 8.3

इस मामले में पहचान निरीक्षक (UIButton)

कायर एक्सटेंशन:

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

}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.