क्या इंटरफ़ेस निर्माता से सीधे यूआईवीवाई सीमा गुणों (रंग, मोटाई, आदि ...) को नियंत्रित करना संभव है या मैं इसे केवल प्रोग्राम कर सकता हूं?
क्या इंटरफ़ेस निर्माता से सीधे यूआईवीवाई सीमा गुणों (रंग, मोटाई, आदि ...) को नियंत्रित करना संभव है या मैं इसे केवल प्रोग्राम कर सकता हूं?
जवाबों:
वास्तव में आप इंटरफ़ेस बिल्डर के माध्यम से किसी दृश्य की परत के कुछ गुण सेट कर सकते हैं। मुझे पता है कि मैं xcode के माध्यम से एक लेयर की सीमा और कोनेरेडियस को सेट कर सकता हूं। बॉर्डर बॉर्डर काम नहीं करता है, शायद क्योंकि परत एक यूआईसी बॉर्डर के बजाय सीजीकोलर चाहती है।
आपको संख्याओं के बजाय स्ट्रिंग्स का उपयोग करना पड़ सकता है, लेकिन यह काम करता है!
layer.cornerRadius
layer.borderWidth
layer.borderColor
अद्यतन करें: layer.masksToBounds = true
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!)
}
}
}
इसी तरह का उत्तर 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
}
}
}
तब यह यूटिलिटीज पैनल> एट्रिब्यूट्स इंस्पेक्टर: में हर बटन, इमेज व्यू, लेबल आदि के लिए इंटरफेस बिल्डर में उपलब्ध होगा:
नोट: सीमा केवल रनटाइम पर दिखाई देगी।
@IBDesignable
एक्सटेंशन की शुरुआत से हटा नहीं दिया गया मुझे इस दृष्टिकोण के साथ इंटरफ़ेस बिल्डर क्रैश हो रहा था ।
आप 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 .. कहीं भी श्रेणी आयात करने की आवश्यकता नहीं है, बस प्रोजेक्ट में श्रेणी की फाइलें जोड़ें और इन गुणों को स्टोरीबोर्ड में देखें।
के लिए स्विफ्ट 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
}
}
}
हालांकि यह गुण सेट कर सकता है, यह वास्तव में आईबी में प्रतिबिंबित नहीं करता है। इसलिए यदि आप अनिवार्य रूप से आईबी में कोड लिख रहे हैं, तो आप इसे अपने सोर्स कोड में भी कर सकते हैं
यदि आप समय बचाना चाहते हैं, तो बस UIViews
एक-दूसरे के ऊपर दो का उपयोग करें , एक सीमा के रंग में, और एक सामने छोटा, सीमावर्ती प्रभाव देता है। मुझे नहीं लगता कि यह एक सुंदर समाधान है या नहीं, लेकिन अगर Apple ने थोड़ा और ध्यान दिया तो आपको ऐसा नहीं करना चाहिए।
यह पूरी तरह से संभव है जब आप सेट layer.masksToBounds = true
करते हैं और आप आराम करते हैं।
स्टोरीबोर्ड मेरे लिए यहां सभी समाधान की कोशिश करने के बाद भी हर समय काम नहीं करता है
तो यह हमेशा सही उत्तर होता है कि कोड का उपयोग कर रहा है, बस UIVIV का IBOutlet उदाहरण बनाएं और गुण जोड़ें
संक्षिप्त जवाब :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
लंबा जवाब :
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor
कृपया कोड की इन 2 सरल रेखा को जोड़ें:
self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true
यह ठीक काम करेगा।