क्या इंटरफ़ेस बिल्डर से यूआईवीवाई सीमा गुण सेट करना संभव है?


184

क्या इंटरफ़ेस निर्माता से सीधे यूआईवीवाई सीमा गुणों (रंग, मोटाई, आदि ...) को नियंत्रित करना संभव है या मैं इसे केवल प्रोग्राम कर सकता हूं?



1
ठीक वैसे ही जैसे कोई भी Google से आता है जैसे मैंने किया। IB में उन परिवर्तनों को प्रतिबिंबित करने के लिए आपको बस UIView का एक उपवर्ग बनाने की जरूरत है और इसे देखें कि आप IB में हेरफेर करना चाहते हैं।
२-३। बजे कानोंगता २ Kan ’

जवाबों:


393

वास्तव में आप इंटरफ़ेस बिल्डर के माध्यम से किसी दृश्य की परत के कुछ गुण सेट कर सकते हैं। मुझे पता है कि मैं xcode के माध्यम से एक लेयर की सीमा और कोनेरेडियस को सेट कर सकता हूं। बॉर्डर बॉर्डर काम नहीं करता है, शायद क्योंकि परत एक यूआईसी बॉर्डर के बजाय सीजीकोलर चाहती है।

आपको संख्याओं के बजाय स्ट्रिंग्स का उपयोग करना पड़ सकता है, लेकिन यह काम करता है!

layer.cornerRadius
layer.borderWidth
layer.borderColor

अद्यतन करें: layer.masksToBounds = true

उदाहरण

अद्यतन: कुंजीपथ के लिए उपयुक्त प्रकार का चयन करें:

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


3
आपके और पीटर डी वेजेस के लिए: मैं Xcode 4.6.3 का उपयोग करता हूं और मैं कीलर टाइप को "कलर" पर सेट कर सकता हूं बिना किसी काॅलियर इंटरफेस को लागू किए

39
दुर्भाग्य से layer.borderColor को इस तरह से सेट नहीं किया जा सकता है। यह एक CGColorRef है, लेकिन IB रंग मान प्रकार एक UIColor है।
mrgrieves

12
तो यह वह है जो उपयोगकर्ता परिभाषित रनटाइम विशेषताएँ करता है! Haha, 2011 के बाद से iOS के लिए लिख रहा है और मैंने कभी नहीं सीखा कि उन क्षेत्रों के लिए क्या था। इस भयानक जवाब के लिए धन्यवाद।
एंडी इबानेज़

3
अच्छा है, लेकिन आपको प्रत्येक संपत्ति के लिए सही प्रकार सेट करना होगा। टाइप फॉर उदा "लेयर.कोर्नररेडियस" को "स्ट्रिंग" के बजाय "नंबर" पर सेट करना होगा!
पीटर क्रिनज़

5
इसके अलावा, "क्लिप टू बाउंड" चेकबॉक्स की जांच करना न भूलें, ताकि कोनेरेडियस काम कर सके।
पियरे-ओलिवियर सिमोनार्ड

182

Rich86Man का उत्तर सही है, लेकिन आप श्रेणियों का उपयोग छद्म गुणों जैसे कि layer.borderColor पर कर सकते हैं। ( कन्वेंशनल सी कोकोआ से)

CALayer + XibConfiguration.h:

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@interface CALayer(XibConfiguration)

// This assigns a CGColor to borderColor.
@property(nonatomic, assign) UIColor* borderUIColor;

@end

CALayer + XibConfiguration.m:

#import "CALayer+XibConfiguration.h"

@implementation CALayer(XibConfiguration)

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

-(UIColor*)borderUIColor
{
    return [UIColor colorWithCGColor:self.borderColor];
}

@end

इंटरफ़ेस बिल्डर

layer.borderUIColor

परिणाम रनटाइम के दौरान स्पष्ट होगा, एक्सकोड में नहीं।

संपादित करें : आपको layer.borderWidthचुने हुए रंग के साथ सीमा को देखने के लिए कम से कम 1 पर सेट करना होगा।

स्विफ्ट 2.0 में:

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.CGColor
        }

        get {
            return UIColor(CGColor: self.borderColor!)
        }
    }
}

स्विफ्ट 3.0 में:

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.cgColor
        }

        get {
            return UIColor(cgColor: self.borderColor!)
        }
    }
}

मुझे यह मेरे लिए काम करने के लिए नहीं मिल सकता है। .M फ़ाइल सीमा के बारे में moan सीमा के बारे में बताती है कि सीमावर्ती है और इसे ठीक करने के लिए, ऐसा करने के बाद भी यह चेतावनी दिखाता है और सीमा रंग रनटाइम पर प्रस्तुत नहीं करता है। बिट जो मेरा अलग है, मेरे पास @ कार्यान्वयन NameOfFile है, @ कार्यान्वयन CALayer (NameOfFile) नहीं है, मैं न तो CALayer भाग को समझ सकता हूं, क्या आप यह समझा सकते हैं कि कृपया
डेव हैग

2
@PeterDeWeese महान जवाब! =)
सी-विलेन

1
आप वास्तव में सीमा के साथ नंबर का उपयोग कर सकते हैं और एक NSNumber स्वीकार कर सकते हैं। यह बढ़िया काम करता है।
पीटर डेविस

1
यह निश्चित रूप से मेरी राय में बॉर्डरकलर के मुद्दे को हल करने का सबसे अच्छा समाधान है। श्रेणियों का शानदार उपयोग!
EricWasTaken

1
स्विफ्ट में काम किया!
KOTIOS

81

इसी तरह का उत्तर iHulk के एक, लेकिन स्विफ्ट में

अपनी परियोजना में UIView.swift नाम की एक फ़ाइल जोड़ें (या किसी भी फ़ाइल में इसे पेस्ट करें):

import UIKit

@IBDesignable extension UIView {
    @IBInspectable var borderColor: UIColor? {
        set {
            layer.borderColor = newValue?.cgColor
        }
        get {
            guard let color = layer.borderColor else {
                return nil
            }
            return UIColor(cgColor: color)
        }
    }
    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}

तब यह यूटिलिटीज पैनल> एट्रिब्यूट्स इंस्पेक्टर: में हर बटन, इमेज व्यू, लेबल आदि के लिए इंटरफेस बिल्डर में उपलब्ध होगा:

गुण निरीक्षक

नोट: सीमा केवल रनटाइम पर दिखाई देगी।


@ गौरव आप क्या त्रुटि देखते हैं? किस घटक (UIButton, UILabel, आदि) पर आप इसका उपयोग कर रहे हैं?
एक्सल गुइलमिन

मैं आपको अधिक जानकारी के बिना मदद नहीं कर सकता :(
एक्सिल गिल्मिन

2
जब तक मैं @IBDesignableएक्सटेंशन की शुरुआत से हटा नहीं दिया गया मुझे इस दृष्टिकोण के साथ इंटरफ़ेस बिल्डर क्रैश हो रहा था ।
अल्बर्ट बोरी

1
यह अद्भुत है ... धन्यवाद! मैं XCode 8.2.1
bobwki

1
बहुत आसान और साफ! धन्यवाद!
कार्ल-जॉन चाउ

56

आप UIView की एक श्रेणी बना सकते हैं और इसे .h श्रेणी की फ़ाइल में जोड़ सकते हैं

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

अब इसे .m फाइल में जोड़ें

@dynamic borderColor,borderWidth,cornerRadius;

और इस में भी। एम फ़ाइल

-(void)setBorderColor:(UIColor *)borderColor{
    [self.layer setBorderColor:borderColor.CGColor];
}

-(void)setBorderWidth:(CGFloat)borderWidth{
    [self.layer setBorderWidth:borderWidth];
}

-(void)setCornerRadius:(CGFloat)cornerRadius{
    [self.layer setCornerRadius:cornerRadius];
}

अब आप इसे अपने स्टोरीबोर्ड में सभी UIView उपवर्गों (UILabel, UITextField, UIImageView आदि) के लिए देखेंगे।

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

Thats it .. कहीं भी श्रेणी आयात करने की आवश्यकता नहीं है, बस प्रोजेक्ट में श्रेणी की फाइलें जोड़ें और इन गुणों को स्टोरीबोर्ड में देखें।


2
IB_DESIGNABLE ड्राअर का उपयोग करके अपने कस्टम दृश्य को दोबारा बनाने के लिए IB_DESIGNABLE के साथ इसे लागू करें: विधि developer.apple.com/library/ios/recipes/…
txulu

3
यह बढ़िया है, यदि आप इंटरफ़ेस लाइन से पहले .h फ़ाइल में IB_DESIGNABLE लिखते हैं, तो आपको न ही @dynamic लाइन को .m में जोड़ना होगा
जसमीत

@ user1618612 इसका रिज़ॉल्यूशन से कोई लेना-देना नहीं है, यह सिर्फ सामान्य लेयर प्रॉपर्टीज़ सेट कर रहा है।
इलहाक

11

के लिए स्विफ्ट 3 और 4 , यदि आप करने के लिए उपयोग को तैयार हैं IBInspectableरों, वहाँ इस है:

@IBDesignable extension UIView {
    @IBInspectable var borderColor:UIColor? {
        set {
            layer.borderColor = newValue!.cgColor
        }
        get {
            if let color = layer.borderColor {
                return UIColor(cgColor: color)
            }
            else {
                return nil
            }
        }
    }
    @IBInspectable var borderWidth:CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius:CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}

यह मेरे लिए सबसे अच्छा समाधान है
Mục 18ng

महान समाधान, धन्यवाद u
Ebtehal___

7

हालांकि यह गुण सेट कर सकता है, यह वास्तव में आईबी में प्रतिबिंबित नहीं करता है। इसलिए यदि आप अनिवार्य रूप से आईबी में कोड लिख रहे हैं, तो आप इसे अपने सोर्स कोड में भी कर सकते हैं


1
MVC में आपका स्वागत है! आपको लगता है कि गुणों को कोड में कभी नहीं होना चाहिए !
अलेजांद्रो इवान

2
^ यह वह नहीं है जो एमवीसी है।
एंड्रयू प्लमर

1
यह देखते हुए कि 95% समय यह कोड कंट्रोलर में जाता है, यह भी MVC है, निश्चित रूप से आपको ठीक से सबक्लास करना चाहिए या अपने विचार का विस्तार करना चाहिए फिर कोडिंग :-) पर इसका सिर्फ विन्यास :-)
डेनियल बर्नार्डिनी

4

यदि आप समय बचाना चाहते हैं, तो बस UIViewsएक-दूसरे के ऊपर दो का उपयोग करें , एक सीमा के रंग में, और एक सामने छोटा, सीमावर्ती प्रभाव देता है। मुझे नहीं लगता कि यह एक सुंदर समाधान है या नहीं, लेकिन अगर Apple ने थोड़ा और ध्यान दिया तो आपको ऐसा नहीं करना चाहिए।


10
Workarounds अब समय बचाते हैं और भविष्य में बहुत अधिक समय बर्बाद करते हैं।
लाचेज़र टोडोरोव

0

यह पूरी तरह से संभव है जब आप सेट layer.masksToBounds = trueकरते हैं और आप आराम करते हैं।


-1

स्टोरीबोर्ड मेरे लिए यहां सभी समाधान की कोशिश करने के बाद भी हर समय काम नहीं करता है

तो यह हमेशा सही उत्तर होता है कि कोड का उपयोग कर रहा है, बस UIVIV का IBOutlet उदाहरण बनाएं और गुण जोड़ें

संक्षिप्त जवाब :

layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor

लंबा जवाब :

UIView / UIButton आदि के गोल कोनों

customUIView.layer.cornerRadius = 10

बॉर्डर की मोटाई

pcustomUIView.layer.borderWidth = 2

किनारे का रंग

customUIView.layer.borderColor = UIColor.blue.cgColor

प्रश्न बहुत विशिष्ट है और पूछें कि इसे इंटरफ़ेस बिल्डर से कैसे किया जाए। आपका उत्तर अप्रासंगिक है।
शिनक्स

-5

कृपया कोड की इन 2 सरल रेखा को जोड़ें:

self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true

यह ठीक काम करेगा।

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