CALayers ব্যবহার করে গোলাকার ইউআইভিউউ - কেবল কয়েকটি কোণ - কীভাবে?


121

আমার আবেদনে - এখানে চারটি বোতামের নাম দেওয়া আছে:

  • উপরে বাঁদিকে
  • নিচে বামে
  • উপরের ডানে
  • নিচের ডানে

বোতামগুলির উপরে একটি চিত্র দেখুন (বা একটি ইউআইভিউ) রয়েছে is

এখন, ধরুন যে কোনও ব্যবহারকারী উপরে - বাম বোতামে ট্যাপ করুন। উপরের চিত্র / দর্শনটি নির্দিষ্ট কোণে গোল করা উচিত।

ইউআইভিউতে গোলাকার কোণগুলি প্রয়োগ করতে আমার কিছুটা সমস্যা হচ্ছে।

এখনই আমি প্রতিটি ভিউতে বৃত্তাকার কোণগুলি প্রয়োগ করতে নিম্নলিখিত কোডটি ব্যবহার করছি:

    // imgVUserImg is a image view on IB.
    imgVUserImg.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"any Url Here"];
    CALayer *l = [imgVUserImg layer];
    [l setMasksToBounds:YES];
    [l setCornerRadius:5.0];  
    [l setBorderWidth:2.0];
    [l setBorderColor:[[UIColor darkGrayColor] CGColor]];

উপরের কোডটি সরবরাহ করা ভিউয়ের প্রতিটি কোণে গোলাকৃতি প্রয়োগ করছে। পরিবর্তে আমি কেবল নির্বাচিত কোণগুলিতে যেমন শীর্ষ - উপরে / শীর্ষ + বাম / নীচে + ডান ইত্যাদিতে বৃত্তাকারতা প্রয়োগ করতে চেয়েছিলাম etc.

এটা কি সম্ভব? কিভাবে?

উত্তর:


44

আমি উত্তরটি ব্যবহার করেছিলাম কীভাবে আমি আইফোনে একটি বৃত্তাকার কোণযুক্ত ইউআইএলবেল তৈরি করব? এবং আইফোনটিতে স্বচ্ছতার সাথে একটি বৃত্তাকার রেক্ট ভিউ কীভাবে কোড থেকে আসে ?এই কোড করতে।

তখন আমি বুঝতে পেরেছি যে আমি ভুল প্রশ্নের উত্তর দিয়েছি (ইউআইআইজেজের পরিবর্তে গোলাকার ইউআইএলবেল দিয়েছি) সুতরাং আমি এই কোডটি এটি পরিবর্তন করতে ব্যবহার করেছি:

http://discussions.apple.com/thread.jspa?threadID=1683876

ভিউ টেম্পলেট দিয়ে একটি আইফোন প্রকল্প তৈরি করুন। ভিউ কন্ট্রোলারে, এটি যুক্ত করুন:

- (void)viewDidLoad
{
    CGRect rect = CGRectMake(10, 10, 200, 100);
    MyView *myView = [[MyView alloc] initWithFrame:rect];
    [self.view addSubview:myView];
    [super viewDidLoad];
}

MyViewকেবল একটি UIImageViewসাবক্লাস:

@interface MyView : UIImageView
{
}

আমি এর আগে গ্রাফিক্স প্রসঙ্গটি কখনও ব্যবহার করতাম না, তবে আমি এই কোডটি একসাথে হোবল করতে সক্ষম হয়েছি। এটি দুটি কোণে কোডটি অনুপস্থিত। আপনি যদি কোডটি পড়ে থাকেন তবে দেখতে পাবেন যে আমি কীভাবে এটি প্রয়োগ করেছি (কিছু CGContextAddArcকল মুছে ফেলা এবং কোডের কিছু ব্যাসার্ধের মান মুছে ফেলাতে all যে অংশগুলি আপনার প্রয়োজন নেই এমন কোণ তৈরি করে। নোট করুন যে আপনি চাইলে খুব বেশি 2 বা 3 টি বৃত্তাকার কোণ দিয়ে আয়তক্ষেত্র তৈরি করতে পারেন।

কোডটি নিখুঁত নয়, তবে আমি নিশ্চিত আপনি এটি কিছুটা পরিষ্কার করতে পারবেন।

static void addRoundedRectToPath(CGContextRef context, CGRect rect, float radius, int roundedCornerPosition)
{

    // all corners rounded
    //  CGContextMoveToPoint(context, rect.origin.x, rect.origin.y + radius);
    //  CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height - radius);
    //  CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius, 
    //                  radius, M_PI / 4, M_PI / 2, 1);
    //  CGContextAddLineToPoint(context, rect.origin.x + rect.size.width - radius, 
    //                          rect.origin.y + rect.size.height);
    //  CGContextAddArc(context, rect.origin.x + rect.size.width - radius, 
    //                  rect.origin.y + rect.size.height - radius, radius, M_PI / 2, 0.0f, 1);
    //  CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + radius);
    //  CGContextAddArc(context, rect.origin.x + rect.size.width - radius, rect.origin.y + radius, 
    //                  radius, 0.0f, -M_PI / 2, 1);
    //  CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y);
    //  CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + radius, radius, 
    //                  -M_PI / 2, M_PI, 1);

    // top left
    if (roundedCornerPosition == 1) {
        CGContextMoveToPoint(context, rect.origin.x, rect.origin.y + radius);
        CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height - radius);
        CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius, 
                        radius, M_PI / 4, M_PI / 2, 1);
        CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, 
                                rect.origin.y + rect.size.height);
        CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y);
        CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y);
    }   

    // bottom left
    if (roundedCornerPosition == 2) {
        CGContextMoveToPoint(context, rect.origin.x, rect.origin.y);
        CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height);
        CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, 
                                rect.origin.y + rect.size.height);
        CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y);
        CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y);
        CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + radius, radius, 
                        -M_PI / 2, M_PI, 1);
    }

    // add the other corners here


    CGContextClosePath(context);
    CGContextRestoreGState(context);
}


-(UIImage *)setImage
{
    UIImage *img = [UIImage imageNamed:@"my_image.png"];
    int w = img.size.width;
    int h = img.size.height;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);

    CGContextBeginPath(context);
    CGRect rect = CGRectMake(0, 0, w, h);


    addRoundedRectToPath(context, rect, 50, 1);
    CGContextClosePath(context);
    CGContextClip(context);

    CGContextDrawImage(context, rect, img.CGImage);

    CGImageRef imageMasked = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    [img release];

    return [UIImage imageWithCGImage:imageMasked];
}

Alt পাঠ্য http://nevan.net/skitch/skitched-20100224-092237.png

ভুলে যাবেন না যে এটি কাজ করার জন্য আপনাকে কোয়ার্টজোর কাঠামোটি পেতে হবে।


যার আকার পরিবর্তন হতে পারে এমন দর্শনগুলির সাথে প্রত্যাশার মতো কাজ করে না। উদাহরণ: একটি ইউআইএলবেল। মুখোশের পথটি সেট করা এবং তারপরে পাঠ্য সেট করে আকার পরিবর্তন করা পুরানো মুখোশটি বজায় রাখবে। সাবক্র্যাসিং এবং ড্রআরেক্টকে ওভারলোডিংয়ের প্রয়োজন হবে।
ব্যবহারকারী 3099609

358

আইওএস ৩.২ থেকে শুরু করে, আপনি একটি কার্যের UIBezierPathবাইরে বাক্সাকার বৃত্তাকার রেকটি তৈরি করতে এর কার্যকারিতাটি ব্যবহার করতে পারেন (যেখানে কেবলমাত্র কোণগুলি বৃত্তাকার হয়)। তারপরে আপনি এটিকে একটি এর পথ হিসাবে ব্যবহার করতে পারেন এবং এটি CAShapeLayerআপনার দর্শনের স্তরটির জন্য একটি মুখোশ হিসাবে ব্যবহার করতে পারেন:

// Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds 
                                               byRoundingCorners:UIRectCornerTopLeft
                                                     cornerRadii:CGSizeMake(10.0, 10.0)];

// Create the shape layer and set its path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = imageView.bounds;
maskLayer.path = maskPath.CGPath;

// Set the newly created shape layer as the mask for the image view's layer
imageView.layer.mask = maskLayer;

এবং এটি হ'ল - কোর গ্রাফিকগুলিতে ম্যানুয়ালি আকারগুলি সংজ্ঞায়িত করার বিষয়ে কোনও গোলযোগ নেই, ফটোশপটিতে কোনও মাস্কিং চিত্র তৈরি হচ্ছে না। স্তরটি এমনকি অবৈধকরণের প্রয়োজন নেই। বৃত্তাকার কোণটি প্রয়োগ করা বা একটি নতুন কোণে পরিবর্তন করা একটি নতুন সংজ্ঞা দেওয়া UIBezierPathএবং CGPathএটি মাস্ক স্তরের পথের মতোই সহজ । cornersএর প্যারামিটার bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:পদ্ধতি বিট-মাস্ক, এবং তাই একাধিক কোণে তাদের একসঙ্গে ORing দ্বারা বৃত্তাকার করা যেতে পারে।


সম্পাদনা: একটি ছায়া যুক্ত করা

আপনি যদি এটিতে একটি ছায়া যুক্ত করতে চাইছেন তবে আরও কিছু কাজ করা দরকার।

" imageView.layer.mask = maskLayer" একটি মাস্ক প্রয়োগ করার কারণে , একটি ছায়া সাধারণত এর বাইরে প্রদর্শিত হবে না। কৌশলটি হ'ল স্বচ্ছ দৃষ্টিভঙ্গিটি ব্যবহার করা হবে এবং তারপরে CALayerদৃশ্যের স্তরে দুটি সাবলেয়ার ( গুলি) যুক্ত করুন: shadowLayerএবং roundedLayer। উভয় ব্যবহার করা প্রয়োজন UIBezierPath। ছবিটি সামগ্রী হিসাবে যুক্ত করা হয়েছে roundedLayer

// Create a transparent view
UIView *theView = [[UIView alloc] initWithFrame:theFrame];
[theView setBackgroundColor:[UIColor clearColor]];

// Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:theView.bounds 
                                               byRoundingCorners:UIRectCornerTopLeft
                                                     cornerRadii:CGSizeMake(10.0f, 10.0f)];

// Create the shadow layer
CAShapeLayer *shadowLayer = [CAShapeLayer layer];
[shadowLayer setFrame:theView.bounds];
[shadowLayer setMasksToBounds:NO];
[shadowLayer setShadowPath:maskPath.CGPath];
// ...
// Set the shadowColor, shadowOffset, shadowOpacity & shadowRadius as required
// ...

// Create the rounded layer, and mask it using the rounded mask layer
CALayer *roundedLayer = [CALayer layer];
[roundedLayer setFrame:theView.bounds];
[roundedLayer setContents:(id)theImage.CGImage];

CAShapeLayer *maskLayer = [CAShapeLayer layer];
[maskLayer setFrame:theView.bounds];
[maskLayer setPath:maskPath.CGPath];

roundedLayer.mask = maskLayer;

// Add these two layers as sublayers to the view
[theView.layer addSublayer:shadowLayer];
[theView.layer addSublayer:roundedLayer];

1
ভালো লাগল, এটি আমাকে ইউআইটিবেবল ভিউ সেলের নির্বাচিত
ব্যাকগ্রাউন্ডভিউস

যাইহোক আপনি কোণে বৃত্তাকার পরে এই দৃশ্যটিতে একটি ড্রপ ছায়া যুক্ত করবেন? সাফল্য ছাড়াই নিম্নলিখিত চেষ্টা করেছেন। । self.layer.masksToBounds = কোন; স্ব.লায়ার.শাদো কালার = [ইউআইকলার ব্ল্যাক কালার] .সিজি কলার; self.layer.shadowRadius = 3; self.layer.shadowOffset = CGSizeMake (-3, 3); self.layer.shadowOpacity = 0.8; self.layer.shouldRasterize = হ্যাঁ; `
ক্রিস ওয়াগনার

1
@ ক্রিসওয়াগনার: বৃত্তাকার দৃশ্যে ছায়া প্রয়োগ করার ক্ষেত্রে আমার সম্পাদনা দেখুন।
স্টুয়ার্ট

পছন্দ করেছেন আমি ছায়া দর্শনের জন্য একটি সংক্ষিপ্তসার নিয়ে গিয়েছিলাম তবে এটি অনেক সুন্দর! এটির মতো সাব স্তরগুলি যুক্ত করার কথা ভাবেনি। ধন্যবাদ!
ক্রিস ওয়াগনার

কেন আমার চিত্রটি সাদা হয়ে যায়, তারপরে আমি যখন ইউআইটিবেবল ভিউ স্ক্রোল করি এবং ঘরটি পুনরায় তৈরি করা হয় - এটি কাজ করে! কেন?
ফার্নান্দো রেডোন্ডো

18

আমি আমার কোডটিতে অনেক জায়গায় এই কোডটি ব্যবহার করেছি এবং এটি 100% সঠিকভাবে কাজ করে। "যে রাউন্ডিং কর্নার্স: ইউআইআরেক্টকর্নারবটম লেফট" দ্বারা একটি সম্পত্তি পরিবর্তিত হয়ে আপনি যে কোনও ক্রর্ডার পরিবর্তন করতে পারেন

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:UIRectCornerBottomLeft cornerRadii:CGSizeMake(10.0, 10.0)];

                CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
                maskLayer.frame = view.bounds;
                maskLayer.path = maskPath.CGPath;
                view.layer.mask = maskLayer;
                [maskLayer release];

UITableView-সুভিউ- তে এই সমাধানটি ব্যবহার করার সময় (যেমন UITableViewCellগুলি UITableViewHeaderFooterViewগুলি) এর স্ক্রল করার সময় খারাপ মসৃণতার ফলাফল হয়এই ব্যবহারের জন্য আরেকটি পদ্ধতি হ'ল আরও ভাল পারফরম্যান্স সহ এই সমাধানটি (এটি সমস্ত কোণে একটি কোণার রেডিয়াস যুক্ত করে)। কেবল নির্দিষ্ট কোণগুলিকে বৃত্তাকার (উপরে এবং নীচের ডান কোণগুলির মতো) 'প্রদর্শন' করতে আমি এর উপর একটি নেতিবাচক মান যুক্ত একটি সংক্ষিপ্তসার যুক্ত করেছি frame.origin.xএবং কোণার রেডিয়াসকে তার স্তরটিতে নির্ধারিত করেছি। যদি কেউ এর থেকে ভাল সমাধান খুঁজে পান তবে আমি আগ্রহী।
anneblue

11

আইওএস 11 এ, আমরা এখন কেবলমাত্র কয়েকটি কোণে গোল করতে পারি

let view = UIView()

view.clipsToBounds = true
view.layer.cornerRadius = 8
view.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner]

7

সুইফট 3+ সিনট্যাক্স সহ ক্যালায়ার এক্সটেনশন

extension CALayer {

    func round(roundedRect rect: CGRect, byRoundingCorners corners: UIRectCorner, cornerRadii: CGSize) -> Void {
        let bp = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: cornerRadii)
        let sl = CAShapeLayer()
        sl.frame = self.bounds
        sl.path = bp.cgPath
        self.mask = sl
    }
}

এটি এর মতো ব্যবহার করা যেতে পারে:

let layer: CALayer = yourView.layer
layer.round(roundedRect: yourView.bounds, byRoundingCorners: [.bottomLeft, .topLeft], cornerRadii: CGSize(width: 5, height: 5))

5

নির্দিষ্ট কোণগুলির বৃত্তাকার জন্য স্টুয়ার্টস উদাহরণ দুর্দান্ত কাজ করে। আপনি যদি শীর্ষে বাম এবং ডানদিকে একাধিক কোণে গোল করতে চান তবে এটি কীভাবে করবেন

// Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageview
                                               byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight
                                                     cornerRadii:CGSizeMake(10.0, 10.0)];

// Create the shape layer and set its path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = imageview.bounds;
maskLayer.path = maskPath.CGPath;

// Set the newly created shape layer as the mask for the image view's layer
imageview.layer.mask = maskLayer; 

UITableView-সুভিউ- তে এই সমাধানটি ব্যবহার করার সময় (যেমন UITableViewCellগুলি UITableViewHeaderFooterViewগুলি) এর স্ক্রল করার সময় খারাপ মসৃণতার ফলাফল হয়এই ব্যবহারের জন্য আরেকটি পদ্ধতি হ'ল আরও ভাল পারফরম্যান্স সহ এই সমাধানটি (এটি সমস্ত কোণে একটি কোণার রেডিয়াস যুক্ত করে)। কেবল নির্দিষ্ট কোণগুলিকে বৃত্তাকার (উপরে এবং নীচের ডান কোণগুলির মতো) 'প্রদর্শন' করতে আমি এর উপর একটি নেতিবাচক মান যুক্ত একটি সংক্ষিপ্তসার যুক্ত করেছি frame.origin.xএবং কোণার রেডিয়াসকে তার স্তরটিতে নির্ধারিত করেছি। যদি কেউ এর থেকে ভাল সমাধান খুঁজে পান তবে আমি আগ্রহী।
anneblue

5

ভাগ করে নেওয়ার জন্য ধন্যবাদ. এই সমস্যাটিতে আরও রেফারেন্সের জন্য আমি এখানে সুইফট ২.০ তে সমাধানটি ভাগ করতে চাই। (ইউআইআরেক্টেক্টর্নারের প্রোটোকল অনুসারে)

let mp = UIBezierPath(roundedRect: cell.bounds, byRoundingCorners: [.bottomLeft, .TopLeft], cornerRadii: CGSize(width: 10, height: 10))
let ml = CAShapeLayer()
ml.frame = self.bounds
ml.path = mp.CGPath
self.layer.mask = ml

4

একটি সহজ এবং দ্রুত উত্তর রয়েছে যা আপনার প্রয়োজনের উপর নির্ভর করে কাজ করতে পারে এবং ছায়ার সাথেও কাজ করে। আপনি সুপারলায়ারের উপর মাস্কটোবাউন্ডসকে সত্য হিসাবে সেট করতে পারেন এবং চাইল্ড স্তরগুলি অফসেট করতে পারেন যাতে তাদের 2 কোণগুলি সুপারলেয়ার সীমানার বাইরে থাকে, কার্যকরভাবে 2 পাশের বৃত্তাকার কোণগুলি কাটা যায়।

অবশ্যই এটি কেবল তখনই কার্যকর হয় যখন আপনি একই দিকে কেবল দুটি গোলাকার কোণ রাখতে চান এবং যখন আপনি একপাশ থেকে কয়েক পিক্সেল কেটে ফেলেন তখন স্তরটির বিষয়বস্তু একই দেখায়। বারের চার্টগুলি কেবল উপরের দিকে গোল করা জন্য দুর্দান্ত কাজ করে।


3

দেখুন এই সংশ্লিষ্ট প্রশ্ন । আপনি একটি আপনার নিজস্ব আয়তক্ষেত্র আঁকা করতে হবে CGPathসঙ্গে কিছু , বৃত্তাকার কোণ যোগ CGPathআপনার টু CGContextএবং তারপর ব্যবহার করে এটি ক্লিপCGContextClip

আপনি কোনও চিত্রে আলফা মানগুলির সাথে বৃত্তাকার রেকট আঁকতে পারেন এবং তারপরে একটি নতুন স্তর তৈরি করতে সেই চিত্রটি ব্যবহার করুন যা আপনি আপনার স্তরের maskসম্পত্তি হিসাবে সেট করেছেন ( অ্যাপলের ডকুমেন্টেশন দেখুন )।


2

আধ দশক দেরি হয়ে গেছে, তবে আমি মনে করি বর্তমান যেভাবে লোকেরা এটি করে 100% সঠিক নয়। অনেকেরই সমস্যা ছিল যে UIBezierPath + CAShapeLayer পদ্ধতিটি অটো-লেআউটে হস্তক্ষেপ করে, বিশেষত যখন এটি স্টোরিবোর্ডে সেট করা থাকে। কোনও উত্তরই এর চেয়ে বেশি যায় না, তাই আমি নিজের নিজের যুক্ত করার সিদ্ধান্ত নিয়েছি।

এটিকে আটকানোর একটি খুব সহজ উপায় রয়েছে: drawRect(rect: CGRect)ফাংশনে গোলাকার কোণগুলি আঁকুন ।

উদাহরণস্বরূপ, আমি যদি কোনও ইউআইভিউয়ের জন্য শীর্ষ গোলাকার কোণগুলি চাইতাম তবে আমি ইউআইভিউ সাবক্লাস করব এবং তারপরে যেখানে উপযুক্ত হবে সেই সাবক্লাসটি ব্যবহার করব।

import UIKit

class TopRoundedView: UIView {

    override func drawRect(rect: CGRect) {
        super.drawRect(rect)

        var maskPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: UIRectCorner.TopLeft | UIRectCorner.TopRight, cornerRadii: CGSizeMake(5.0, 5.0))

        var maskLayer = CAShapeLayer()
        maskLayer.frame = self.bounds
        maskLayer.path = maskPath.CGPath

        self.layer.mask = maskLayer
    }
}

এটি ইস্যুটি বিজয়ের সর্বোত্তম উপায় এবং মানিয়ে নিতে কোনও সময় নেয় না।


1
সমস্যাটি সমাধানের এটি সঠিক উপায় নয়। আপনি কেবল drawRect(_:)নিজের দৃষ্টিভঙ্গিতে কাস্টম অঙ্কন (যেমন কোর গ্রাফিক্স সহ) করছেন তবে আপনার ওভাররাইড করা উচিত , অন্যথায় খালি বাস্তবায়নও কার্য সম্পাদনকে প্রভাবিত করতে পারে। প্রতিবার একটি নতুন মাস্ক স্তর তৈরি করাও অপ্রয়োজনীয়। pathদর্শনের সীমা পরিবর্তিত হওয়ার পরে আপনাকে আসলে যা করতে হবে তা হ'ল মাস্ক স্তরের সম্পত্তি আপডেট করা এবং এটি করার জায়গাটি layoutSubviews()পদ্ধতির ওভাররাইডের মধ্যে is
স্টুয়ার্ট

2

কেবল কয়েকটি কোণে গোল করা স্বয়ংক্রিয় আকার পরিবর্তন বা স্বয়ংক্রিয় বিন্যাসের সাথে দুর্দান্ত খেলবে না।

সুতরাং অন্য বিকল্পটি হ'ল নিয়মিত ব্যবহার করুন cornerRadiusএবং যে কোণগুলি আপনি চান না তা অন্য দৃষ্টির অধীনে বা তার তত্ত্বাবধানের সীমানার বাইরে লুকিয়ে রাখুন তা নিশ্চিত করে নিন যে এটির বিষয়বস্তুগুলি ক্লিপ করতে সেট করা আছে making


1

করতে জুড়তে উত্তর এবং উপরন্তু , আমি একটি সহজ, পুনর্ব্যবহারযোগ্য নির্মিত UIViewসুইফট হবে। আপনার ব্যবহারের ক্ষেত্রে উপর নির্ভর করে আপনি সংশোধন করতে চাইতে পারেন (প্রতিটি বিন্যাসে অবজেক্ট তৈরি করা এড়ানো ইত্যাদি), তবে আমি এটিকে যথাসম্ভব সহজ রাখতে চেয়েছিলাম। এক্সটেনশনটি আপনাকে UIImageViewসাবউক্লাসিং পছন্দ না করলে এটিকে অন্যান্য দৃশ্যের (প্রাক্তন ) আরও সহজে প্রয়োগ করতে দেয় ।

extension UIView {

    func roundCorners(_ roundedCorners: UIRectCorner, toRadius radius: CGFloat) {
        roundCorners(roundedCorners, toRadii: CGSize(width: radius, height: radius))
    }

    func roundCorners(_ roundedCorners: UIRectCorner, toRadii cornerRadii: CGSize) {
        let maskBezierPath = UIBezierPath(
            roundedRect: bounds,
            byRoundingCorners: roundedCorners,
            cornerRadii: cornerRadii)
        let maskShapeLayer = CAShapeLayer()
        maskShapeLayer.frame = bounds
        maskShapeLayer.path = maskBezierPath.cgPath
        layer.mask = maskShapeLayer
    }
}

class RoundedCornerView: UIView {

    var roundedCorners: UIRectCorner = UIRectCorner.allCorners
    var roundedCornerRadii: CGSize = CGSize(width: 10.0, height: 10.0)

    override func layoutSubviews() {
        super.layoutSubviews()
        roundCorners(roundedCorners, toRadii: roundedCornerRadii)
    }
}

আপনি এটিতে কীভাবে এটি প্রয়োগ করবেন তা এখানে UIViewController:

class MyViewController: UIViewController {

    private var _view: RoundedCornerView {
        return view as! RoundedCornerView
    }

    override func loadView() {
        view = RoundedCornerView()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        _view.roundedCorners = [.topLeft, .topRight]
        _view.roundedCornerRadii = CGSize(width: 10.0, height: 10.0)
    }
}

0

স্টুয়ার্টের উত্তর মোড়ানো, আপনি নিম্নলিখিত হিসাবে গোলাকার কোণার পদ্ধতি থাকতে পারে:

@implementation UIView (RoundCorners)

- (void)applyRoundCorners:(UIRectCorner)corners radius:(CGFloat)radius {
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)];

    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;

    self.layer.mask = maskLayer;
}

@end

সুতরাং গোলাকার কোণার প্রয়োগ করতে, আপনি কেবল:

[self.imageView applyRoundCorners:UIRectCornerTopRight|UIRectCornerTopLeft radius:10];

0

আমি একটি স্তরের মাস্ক সংজ্ঞায়িত করার পরামর্শ দেব। মুখোশ নিজেই CAShapeLayerএকটি উত্সর্গীকৃত পাথ সহ একটি বস্তু হওয়া উচিত । আপনি পরবর্তী ইউআইভিউ এক্সটেনশনটি ব্যবহার করতে পারেন (সুইফট ৪.২):

extension UIView {
    func round(corners: UIRectCorner, with radius: CGFloat) {
        let maskLayer = CAShapeLayer()
        maskLayer.frame = bounds
        maskLayer.path = UIBezierPath(
            roundedRect: bounds,
            byRoundingCorners: corners,
            cornerRadii: CGSize(width: radius, height: radius)
        ).cgPath
        layer.mask = maskLayer
   }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.