উত্তর:
সীমানা সম্পত্তি সেট করতে আপনাকে ভিউয়ের স্তরটি ব্যবহার করতে হবে। উদাহরণ:
#import <QuartzCore/QuartzCore.h>
...
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth = 3.0f;
এই কার্যকারিতাটি অ্যাক্সেস করতে আপনার কোয়ার্টজকোর.ফ্রেমওয়ার্কের সাথেও লিঙ্ক করতে হবে।
__bridge CGColorRef
। এটা কাজ করে না. এটা তোলে হওয়া প্রয়োজন [UIColor blackColor].CGColor
যেমন উত্তর উল্লেখ করেছে।
#import <QuartzCore/QuartzCore.h>
আর দরকার নেই।
এক্সকোডের নতুন সংস্করণ যেহেতু এর আরও ভাল সমাধান আছে:
সঙ্গে @IBInspectable
আপনি গুণাবলী থেকে সরাসরি সেট করতে পারেন মধ্যেAttributes Inspector
।
এটি আপনার User Defined Runtime Attributes
জন্য সেট করে :
এটি সেট আপ করার জন্য দুটি পন্থা রয়েছে:
বিকল্প 1 (স্টোরিবোর্ডে লাইভ আপডেটিং সহ)
MyCustomView
।UIView
।@IBDesignable
(এটি ভিউ আপডেটটিকে লাইভ করে) *@IBInspectable
MyCustomView
`
@IBDesignable
class MyCustomView: UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
* @IBDesignable
শুধুমাত্র যখন শুরুতে সেট করা হয় তখন কাজ করেclass MyCustomView
বিকল্প 2 (সুইফট 1.2 থেকে কাজ করছে না, মন্তব্য দেখুন)
আপনার ইউআইভিউ ক্লাসটি প্রসারিত করুন:
extension UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
এইভাবে, আপনার ডিফল্ট ভিউটিতে সর্বদা সেই অতিরিক্ত সম্পাদনযোগ্য ক্ষেত্র থাকে Attributes Inspector
। আরেকটি সুবিধা হ'ল আপনাকে MycustomView
প্রতিবার ক্লাস পরিবর্তন করতে হবে না । যাইহোক, এটির একটি অসুবিধা হ'ল আপনি যখন নিজের অ্যাপটি চালাবেন কেবল তখনই আপনার পরিবর্তনগুলি দেখতে পাবেন।
আপনি নিজের ইচ্ছার রঙের সাথে সীমানাও তৈরি করতে পারেন ..
view.layer.borderColor = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0].CGColor;
* r, g, b হল 0 থেকে 255 এর মধ্যে মান।
ইউআইভিউ এক্সটেনশনে নিম্নলিখিত আইবিআই স্পেসটেবলগুলি যুক্ত করুন
extension UIView {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set(newValue) {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
if let color = layer.borderColor {
return UIColor(CGColor: color)
}
return nil
}
set(newValue) {
layer.borderColor = newValue?.CGColor
}
}
}
এবং তারপরে আপনার অ্যাট্রিবিউট ইন্সপেক্টর থেকে সরাসরি বর্ডার কালার এবং বর্ডারউইথ অ্যাট্রিবিউট সেট করতে সক্ষম হওয়া উচিত। সংযুক্ত চিত্র দেখুন
আমি যখন ভ্লাদিমিরের ক্যালিয়ার দ্রবণটি ব্যবহার করি এবং উপরে আমার কাছে একটি অ্যানিমেশন থাকে যেমন একটি মডেল ইউআইএনএভিগেশন কন্ট্রোলারকে বরখাস্ত করা হয়, আমি প্রচুর বিভ্রান্তি ঘটতে দেখি এবং অঙ্কনের পারফরম্যান্সের সমস্যা রয়েছে।
সুতরাং, এটি অর্জনের আরেকটি উপায়, তবে গ্লিটস এবং পারফরম্যান্স ক্ষতি না ছাড়াই একটি কাস্টম ইউআইভিউ তৈরি করা এবং drawRect
বার্তাটি এভাবে প্রয়োগ করা :
- (void)drawRect:(CGRect)rect
{
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(contextRef, 1);
CGContextSetRGBStrokeColor(contextRef, 255.0, 255.0, 255.0, 1.0);
CGContextStrokeRect(contextRef, rect);
}
setNeedsDisplay
এবং ভিউতে কল করুন। এটি ইউআইভিউর পুনর্নির্মাণকে বাধ্য করবে এবং সুস্পষ্টভাবে পুনরায় কল করবে drawRect
। পরীক্ষা করা হয়নি, তবে ...
view.layer.borderWidth = 1.0
view.layer.borderColor = UIColor.lightGray.cgColor
এই কোড ব্যবহার করে দেখুন:
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth= 2.0;
[view setClipsToBounds:YES];
পারফরম্যান্স হিট হওয়ার কারণে আমি ড্রয়ারকে ওভাররাইড করার পরামর্শ দেব না।
পরিবর্তে, আমি নীচের মতো শ্রেণীর বৈশিষ্ট্যগুলি সংশোধন করব (আপনার কাস্টম ইউভিউতে):
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.layer.borderWidth = 2.f;
self.layer.borderColor = [UIColor redColor].CGColor;
}
return self;
উপরোক্ত পদ্ধতির গ্রহণ করার সময় আমি কোনও ত্রুটি দেখতে পেলাম না - কেন নিশ্চিত নয় যে দীক্ষাথ্রে ফ্রেম লাগানো এইগুলি বন্ধ করে দেয় ;-)
আমি এটি একটি মন্তব্য হিসাবে @ মার্কজিংয়ের উত্তরে ( বিকল্প 1 ) যুক্ত করতে চেয়েছিলাম, তবে স্ট্যাকওভারফ্লোতে আমার ন্যূনতম অবস্থানটি এটি প্রতিরোধ করছে।
অবজেক্টিভ সিতে @ মার্কজিংয়ের জবাবের একটি বন্দর আমি করলাম মনোযোগের মতো কাজ করে, ধন্যবাদ @ মার্কজিং!
UIView + + Border.h:
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface UIView (Border)
-(void)setBorderColor:(UIColor *)color;
-(void)setBorderWidth:(CGFloat)width;
-(void)setCornerRadius:(CGFloat)radius;
@end
UIView + + Border.m:
#import "UIView+Border.h"
@implementation UIView (Border)
// Note: cannot use synthesize in a Category
-(void)setBorderColor:(UIColor *)color
{
self.layer.borderColor = color.CGColor;
}
-(void)setBorderWidth:(CGFloat)width
{
self.layer.borderWidth = width;
}
-(void)setCornerRadius:(CGFloat)radius
{
self.layer.cornerRadius = radius;
self.layer.masksToBounds = radius > 0;
}
@end
@ আইবিআইএনস্পেক্টেবল আইওএস 9, সুইফট 2.0 তে আমার জন্য কাজ করছে
extension UIView {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set(newValue) {
layer.borderWidth = newValue
}
}
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set(newValue) {
layer.cornerRadius = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
if let color = layer.borderColor {
return UIColor(CGColor: color)
}
return nil
}
set(newValue) {
layer.borderColor = newValue?.CGColor
}
}
আপনি যদি কোনও ইউআইভিউর স্তরটি সম্পাদনা করতে না চান তবে আপনি সর্বদা অন্য দৃশ্যের মধ্যে ভিউ এম্বেড করতে পারেন। প্যারেন্ট ভিউটির সীমানা রঙে এর পটভূমি রঙ সেট করা থাকবে। আপনি সীমানাটি কত প্রশস্ত করতে চান তার উপর নির্ভর করে এটি কিছুটা বড়ও হবে।
অবশ্যই, এটি কেবল তখনই কার্যকর হয় যদি আপনার দৃষ্টিভঙ্গি স্বচ্ছ না হয় এবং আপনি কেবল একটি একক সীমানা রঙ চান। ওপি নিজেই ভিউটিতে সীমানা চেয়েছিল, তবে এটি একটি কার্যকর বিকল্প হতে পারে।
আপনি যদি বিভিন্ন দিকে বিভিন্ন সীমানা যুক্ত করতে চান তবে নির্দিষ্ট স্টাইলের সাথে একটি সাবউভি যুক্ত করা সহজ উপায় হ'ল সহজ উপায়।