কীভাবে কোনও ইউআইভিউর শীর্ষ-বাম এবং শীর্ষ-ডান কোণার জন্য কোণার রেডিওস সেট করবেন?


407

কোনটির cornerRadiusউপরের-বাম এবং উপরের-ডান কোণে সেট করার কোনও উপায় আছে UIView?

আমি নিম্নলিখিতগুলি চেষ্টা করেছিলাম, তবে এটি আর দেখতে না পেয়ে শেষ হয়।

UIView *view = [[UIView alloc] initWithFrame:frame];

CALayer *layer = [CALayer layer];
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:frame byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(3.0, 3.0)];
layer.shadowPath = shadowPath.CGPath;
view.layer.mask = layer;

9
আপনার সম্পাদনার পরে, তিনটি জিনিস ঠিক করতে হবে: (1) বৃত্তাকার পথটি ভিত্তিক হওয়া উচিত view.bounds, নয় frame, (2) স্তরটি একটি হওয়া উচিত CAShapeLayer, নয় CALayer; (3) স্তরটি সেট করুন path, নয় shadowPath
কার্ট রেভিস


সিজিপিথের উপর কার্ভ তৈরি করতে বেজিয়ার কার্ভ অ্যালগোরিদম ব্যবহার করুন। আমি নিশ্চিত যে এটি কোর গ্রাফিক্সের অংশ। যদি তা না হয় তবে en.wikedia.org/wiki/Bézier_curve এর কিছু দুর্দান্ত সংজ্ঞা এবং অ্যানিমেশন রয়েছে।
নাট সিমার


: এখানে আমার উত্তর দেখুন stackoverflow.com/a/50396485/6246128
wcarhart

উত্তর:


224

এই বিষয়ে মনোযোগ দিন যে আপনার যদি লেআউটের সীমাবদ্ধতাগুলি এটির সাথে সংযুক্ত থাকে তবে আপনাকে অবশ্যই আপনার ইউআইভিউ সাবক্লাসে এটি রিফ্রেশ করতে হবে:

override func layoutSubviews() {
    super.layoutSubviews()
    roundCorners(corners: [.topLeft, .topRight], radius: 3.0)
}

যদি আপনি এটি না করেন তবে এটি প্রদর্শিত হবে না।


এবং কোণে গোল করতে, এক্সটেনশনটি ব্যবহার করুন:

extension UIView {
   func roundCorners(corners: UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        layer.mask = mask
    }
}

3
এটি একেবারে কোনও উত্তর নয়, লেখক কীভাবে নির্দিষ্ট কোণগুলিকে রাউন্ড করবেন, লেআউট পরিবর্তনের সাথে কোণার ব্যাসার্ধকে কীভাবে সিঙ্ক্রোনাইজ করবেন তা নয়।
কেলিন

1
এই উত্তরটি কোন মানে হয় না।
টিয়াগো কৌটো

1
উত্তরটি সম্প্রতি স্থির করা হয়েছে .. @ ক্যালিন
মাইকেল

2
এটি অবশ্যই কোণার বৃত্তাকার।
আজ্নলাইট 89

দৃশ্যটি প্রদর্শিত হওয়ার পরে আপনাকে এটি করতে হবে
জনাথন।

535

আমি নিশ্চিত না কেন আপনার সমাধান কাজ করে নি তবে নিম্নলিখিত কোডটি আমার পক্ষে কাজ করছে। বেজিয়ার মাস্ক তৈরি করুন এবং এটি আপনার দর্শনে প্রয়োগ করুন। আমার নীচে কোডে আমি _backgroundView3 পিক্সেলের ব্যাসার্ধ সহ নীচের কোণগুলিকে গোল করছিলাম । selfএকটি প্রথা UITableViewCell:

UIBezierPath *maskPath = [UIBezierPath
    bezierPathWithRoundedRect:self.backgroundImageView.bounds
    byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight)
    cornerRadii:CGSizeMake(20, 20)
];

CAShapeLayer *maskLayer = [CAShapeLayer layer];

maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;

self.backgroundImageView.layer.mask = maskLayer;

কিছু উন্নতি সহ সুইফট সংস্করণ:

let path = UIBezierPath(roundedRect:viewToRound.bounds, byRoundingCorners:[.TopRight, .BottomLeft], cornerRadii: CGSizeMake(20, 20))
let maskLayer = CAShapeLayer()

maskLayer.path = path.CGPath
viewToRound.layer.mask = maskLayer

সুইফট 3.0 সংস্করণ:

let path = UIBezierPath(roundedRect:viewToRound.bounds,
                        byRoundingCorners:[.topRight, .bottomLeft],
                        cornerRadii: CGSize(width: 20, height:  20))

let maskLayer = CAShapeLayer()

maskLayer.path = path.cgPath
viewToRound.layer.mask = maskLayer

এখানে সুইফট এক্সটেনশন


2
পাঠ্যক্ষেত্রের চেষ্টা করুন। বামে সাফল্য, ডানদিকে ব্যর্থতা
রাইনার লিয়াও

10
@ রাইনারলিয়াও আমার একই সমস্যা ছিল, আমি viewDidLoadপদ্ধতিতে এই সমস্ত করেছি , এটিকে সরান viewDidAppearএবং এটি কাজ করে।
লুচো

আমি কোনও ডিভাইসের জন্য এটি কীভাবে কাজ করতে পারি তা সেট করতে পারি। এটি কেবল simulatorস্টোরিবোর্ডের আকারের জন্য সূক্ষ্ম কাজ করে। ex: if the simulator size is 6s it works fine for 6s, but not of others.আমি কিভাবে এই কাটিয়ে উঠতে পারি।
চানাকা

1
সুইফট 3 সংস্করণে সামান্য সিনট্যাক্স ত্রুটি: path.CGPathহওয়া উচিতpath.cgPath
রব

@ রাইনারলিয়াও যদি ভিউটি প্রদর্শিত না হতে চাইলে এটি ঝাঁকুনি না চান তবে viewWillAppearপরিবর্তে এটিকে পরিবর্তন করুন। এটিও কাজ করে।
ম্যাথু ন্নিপেন

263

এখানে @ জনি রোকেক্স উত্তরের একটি সুইফ্ট সংস্করণ

extension UIView {

    func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
         let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
         let mask = CAShapeLayer()
         mask.path = path.cgPath
         self.layer.mask = mask
    }

}

view.roundCorners([.topLeft, .bottomRight], radius: 10)

বিঃদ্রঃ

আপনি ব্যবহার করেন, তাহলে অটো লেআউট , আপনি আপনার উপশ্রেণী করতে হবে UIViewএবং কল roundCornersদৃশ্য এর layoutSubviewsঅনুকূল প্রভাব জন্য।

class View: UIView {
    override func layoutSubviews() {
        super.layoutSubviews()

        self.roundCorners([.topLeft, .bottomLeft], radius: 10)
    }
}

12
দুর্দান্ত এক্সটেনশন। তবে: .TopRightএবং .BottomRightআমার পক্ষে কাজ করবে বলে মনে হয় না।
ওনিচান

4
সুইফট 2 তে :view.roundCorners([.TopLeft , .BottomLeft], radius: 10)
ফাহরুলাজমি

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

3
@ ডসডস সাবক্লাস যা স্বরূপের কোণগুলিকে দেখে এবং লেআউটসুবউভিউগুলিতে দেখে।
আরবিটর

10
আপনি যদি স্বয়ংক্রিয় বিন্যাস ব্যবহার করেন, এবং ভিউটির সাথে উল্লেখটি দেখতে না চান তবে আপনি কল করতে পারেন .layoutIfNeeded(), তবে এই পদ্ধতিটি।
zgjie

209

এবং অবশেষে ... আইওএস 11- এ রয়েছে সিএকর্নারমাস্ক! CACornerMaskএটি দিয়ে খুব সহজ করা যায়:

let view = UIView()
view.clipsToBounds = true
view.layer.cornerRadius = 10
view.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner] // Top right corner, Top left corner respectively

1
এটি অবশ্যই সবচেয়ে ভাল কাজ করে। গতিশীলভাবে টেবিলভিউ কক্ষগুলি আকারের আকারের প্রান্তটি ঘোরানোর সময় আমাদের অন্যান্য সমাধানগুলির সাথে সর্বদা সমস্যা ছিল।
কর্নার

2
এই সমাধানটি ব্যবহার করতে প্রকল্পের অবশ্যই iOS 11 সমর্থন করবে।
এলিয়েনস

13
@ অ্যালিয়েনস এবং… আমি এটি উল্লেখ করেছি।
সের্গেই বেলোস

1
ডিভাইসটি ঘোরানোর সময় অন্যান্য উত্তরগুলি কাজ করে না, এই কোডটি ঘূর্ণনের জন্য কাজ করে এবং আপনাকে নির্দিষ্ট কোণগুলিকে গোল করার অনুমতি দেয়, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
ক্লাউড 9999 স্ট্রিফ

1
সরল সুন্দর
eharo2

99

সুইফট কোডের উদাহরণ এখানে: https://stackoverflow.com/a/35621736/308315


সরাসরি নয় আপনি করতে হবে:

  1. একটা তৈরি কর CAShapeLayer
  2. এটি ভিত্তিক pathহিসাবে সেট CGPathRefকরুন view.boundsতবে কেবল দুটি গোলাকার কোণ (সম্ভবত ব্যবহার করে +[UIBezierPath bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:])
  3. আপনার view.layer.maskহতে সেট করুনCAShapeLayer

21
সতর্কতা অবলম্বন করুন এটি যদি আপনি কয়েকটি দর্শন চেয়ে বেশি কিছু করেন তবে পারফরম্যান্স ক্ষতিগ্রস্থ হবে ...
jjxtra

@jjxtra সুতরাং বেশি পারফরম্যান্স ক্ষতি না করে এটি করার সর্বোত্তম উপায় কী? আমি এটি ইউআইটিএবলভিউসেল-এ দেখাতে চাই।
xi.lin

@ xi.lin আমার যে স্তরটি সেট করা মনে আছে তার থেকে স্তর.শোল্ডআরাস্টারাইজ == হ্যাঁ গতি 5 বার বা তার চেয়ে বেশি উন্নতি করে। তবে ডক্স বলছে এটি কেবল তখনই কার্যকর হয় যদি আপনি স্বচ্ছ নন এমন কক্ষগুলির সাথে কাজ করেন। ইহাকে একটি লাথি দাও.
কোডার্ট

64

এখানে এইভাবে প্রয়োগ করা একটি স্বল্প পদ্ধতি:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *openInMaps = [UIButton new];
    [openInMaps setFrame:CGRectMake(15, 135, 114, 70)];
    openInMaps = (UIButton *)[self roundCornersOnView:openInMaps onTopLeft:NO topRight:NO bottomLeft:YES bottomRight:NO radius:5.0];
}

- (UIView *)roundCornersOnView:(UIView *)view onTopLeft:(BOOL)tl topRight:(BOOL)tr bottomLeft:(BOOL)bl bottomRight:(BOOL)br radius:(float)radius {

    if (tl || tr || bl || br) {
        UIRectCorner corner = 0;
        if (tl) {corner = corner | UIRectCornerTopLeft;}
        if (tr) {corner = corner | UIRectCornerTopRight;}
        if (bl) {corner = corner | UIRectCornerBottomLeft;}
        if (br) {corner = corner | UIRectCornerBottomRight;}

        UIView *roundedView = view;
        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:roundedView.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)];
        CAShapeLayer *maskLayer = [CAShapeLayer layer];
        maskLayer.frame = roundedView.bounds;
        maskLayer.path = maskPath.CGPath;
        roundedView.layer.mask = maskLayer;
        return roundedView;
    }
    return view;
}

রঙ নির্ধারণ সম্পর্কে কি? maskLayer.borderWidth = 10; মাস্কলায়ার.বর্ডার কালার = [ইউআইকলার রেড কালার] .সিজি কলার; এটা আমার জন্য কাজ করে না স্যার।
কিরণ

1
@কিরান একটি মুখোশের রঙ নেই, আপনি যদি একটি সীমান্ত রাখতে চান তবে আপনি দ্বিতীয় ক্যাশপেয়ার যুক্ত করতে পারেন
জনি রোকেক্স

25

দ্রুত 4.1 এবং এক্সকোড 9.4.1 এ

ইন আইওএস 11 এই একক লাইন যথেষ্ট:

detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]//Set your view here

সম্পূর্ণ কোডটি দেখুন:

//In viewDidLoad
if #available(iOS 11.0, *){
        detailsSubView.clipsToBounds = false
        detailsSubView.layer.cornerRadius = 10
        detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
} else {
      //For lower versions
}

তবে কম সংস্করণের জন্য

let rectShape = CAShapeLayer()
    rectShape.bounds = detailsSubView.frame
    rectShape.position = detailsSubView.center
    rectShape.path = UIBezierPath(roundedRect: detailsSubView.bounds,    byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
    detailsSubView.layer.mask = rectShape

সম্পূর্ণ কোড হয়।

if #available(iOS 11.0, *){
    detailsSubView.clipsToBounds = false
    detailsSubView.layer.cornerRadius = 10
    detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
}else{
    let rectShape = CAShapeLayer()
    rectShape.bounds = detailsSubView.frame
    rectShape.position = detailsSubView.center
    rectShape.path = UIBezierPath(roundedRect: detailsSubView.bounds,    byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
    detailsSubView.layer.mask = rectShape
}

আপনি স্টোরিবোর্ডে অটো রাইজাইজিং ব্যবহার করা হলে এই কোডটি ভিউডিডলআউটসুবউভিউস () এ লিখুন

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if #available(iOS 11.0, *){
        detailsSubView.clipsToBounds = false
        detailsSubView.layer.cornerRadius = 10
        detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
    }else{
        let rectShape = CAShapeLayer()
        rectShape.bounds = detailsSubView.frame
        rectShape.position = detailsSubView.center
        rectShape.path = UIBezierPath(roundedRect: detailsSubView.bounds,    byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
        detailsSubView.layer.mask = rectShape
    }
}

1
এটি আইওএস 9 কাজ করে না তবে 11 এ কাজ করে
আলী ইহসান URAL

আইওএস 9 এর জন্য কোনও সমাধান?
জে

@ জাজি রেক্টট শেপ = ক্যাস্যাপলায়ার () রেকটশ্যাপ.বাউন্ডস = বিশদসুব ভিউ.ফ্রেম রেক্টস্যাপ.প্যাজেশন = বিশদসুব ভিউ.সেন্টার রেকটশ্যাপ.প্যাথ = ইউআইবিজেয়ারপ্যাথ (বৃত্তাকার রেট: বিশদসুভিউ.বাউন্ডস, রাউটারাইজাইট:, চৌরাস্তা), [টিউটোরিয়াল] width 20, উচ্চতা: 20)) cgPath detailsSubView.layer.mask = rectShape এই কোড iOS 9 এর জন্য কাজ করতে পারেন।
আইওএস

@Jay আমাকে অবহিত না করে তা যাচাই করুন
iOS

আইওএস ৯ এর জন্য কাজ করছে না এটি কোণার অংশে কোনও সীমানা নেই।
jey

24

আইওএস 11, সুইফট 4
এবং আপনি এই কোডটি চেষ্টা করতে পারেন:

if #available(iOS 11.0, *) {
   element.clipsToBounds = true
   element.layer.cornerRadius = CORNER_RADIUS
   element.layer.maskedCorners = [.layerMaxXMaxYCorner]
} else {
   // Fallback on earlier versions
}

এবং আপনি এটি টেবিল ভিউ ঘরে ব্যবহার করতে পারেন।


1
এটিই আজকের কোডিংয়ের সঠিক উত্তর। বিদায় বাই মুখোশ স্তর।
অ্যালেন লিয়াং

1
এটি সেরা উত্তর হতে হবে!
ফুজিয়ানজিন 6471

18

এটি সহজ উত্তর হবে:

yourView.layer.cornerRadius = 8
yourView.layer.masksToBounds = true
yourView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]

ট্যাগ করুন যে এটি আইওএস 11 বা তদূর্ধ্বের সমাধান
আনকুর লাহির

16

এই কোডটি ব্যবহার করে দেখুন,

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:( UIRectCornerTopLeft | UIRectCornerTopRight) cornerRadii:CGSizeMake(5.0, 5.0)];

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

view.layer.mask = maskLayer;

15

এমা: .TopRightএবং আপনার .BottomRightপক্ষে কাজ করছে না সম্ভবত কলটি view.roundCornersচূড়ান্ত করার আগে কলটি করা হয়েছে বলে view boundsগণনা করা হচ্ছে। দ্রষ্টব্য যে এটি Bezier Pathদেখার সময় সীমা থেকে উদ্ভূত হয়েছে। উদাহরণস্বরূপ, অটো লেআউটটি যদি ভিউটি সঙ্কুচিত করে, ডানদিকে গোলাকার কোণগুলি দৃশ্যটির বাইরে থাকতে পারে। এটিতে কল করার চেষ্টা করুন viewDidLayoutSubviews, যেখানে দেখার সীমা চূড়ান্ত।


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

তুমি ঠিক. এটি অটোলেআউট নিয়ে সমস্যা তৈরি করবে এবং আপনি ভাল কাজ করেছেন।
আশীষ কাক্কাদ

15

1 লাইনে সুইফ্ট 4 সুইফ্ট 5 সহজ উপায়

ব্যবহার:

//MARK:- Corner Radius of only two side of UIViews
self.roundCorners(view: yourview, corners: [.bottomLeft, .topRight], radius: 12.0)

ফাংশন:

//MARK:- Corner Radius of only two side of UIViews
func roundCorners(view :UIView, corners: UIRectCorner, radius: CGFloat){
        let path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        view.layer.mask = mask
}

অবজেক্টিভ-সি তে

ব্যবহার:

[self.verticalSeparatorView roundCorners:UIRectCornerTopLeft radius:10.0];

বিভাগে ব্যবহৃত ফাংশন (কেবলমাত্র একটি কোণে):

-(void)roundCorners: (UIRectCorner) corners radius:(CGFloat)radius {
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)];
        CAShapeLayer *mask = [[CAShapeLayer alloc] init];
        mask.path = path.CGPath;
        self.layer.mask = mask;
    }

কেবল মনে রাখবেন যে ভিডলিডলআউটসুবভিউগুলি করা না হওয়া পর্যন্ত আপনার দেখার কোণগুলি গণনা করা হয় না তাই আপনার এর ভিতরে গোলাকারকর্নার্সকে ফ্যান বলা উচিত
জিরসন টাভেরা

আপনি কি বলতে পারবেন যে আমি কীভাবে এই দর্শনগুলিতে ছায়া যুক্ত করতে পারি?
ভাদলপল্লী মাথন

@ শাকিলআহমেড আপনি যদি ভিউতে একটি ছায়া যুক্ত করতে চান তবে এটি কাজ করবে না।
মোজতাবা আল মোসসভি

প্রথমে কোণার ব্যাসার্ধ যুক্ত করুন এবং তারপরে ছায়া যুক্ত করুন
শাকিল আহমেদ

10

দ্রুতগতিতে ইউআইভিউ এবং ইউআইটিএফেক্সটফিলের নির্দিষ্ট কোণগুলিকে গোল করার জন্য আমার সমাধানটি ব্যবহার করা

.layer.cornerRadius

এবং

layer.maskedCorners

প্রকৃত ইউআইভিউ বা ইউআইটিেক্সটফিল্ডস।

উদাহরণ:

fileprivate func inputTextFieldStyle() {
        inputTextField.layer.masksToBounds = true
        inputTextField.layer.borderWidth = 1
        inputTextField.layer.cornerRadius = 25
        inputTextField.layer.maskedCorners = [.layerMaxXMaxYCorner,.layerMaxXMinYCorner]
        inputTextField.layer.borderColor = UIColor.white.cgColor
    }

এবং ব্যবহার করে

.layerMaxXMaxYCorner

এবং

.layerMaxXMinYCorner

, আমি বৃত্তাকার হওয়ার জন্য ইউআইটিেক্সটফিল্ডের উপরের ডান এবং নীচে ডান কোণটি নির্দিষ্ট করতে পারি।

আপনি এখানে ফলাফল দেখতে পারেন:

এখানে চিত্র বর্ণনা লিখুন


সীমানা এবং নির্দিষ্ট কোণ সংমিশ্রণের জন্য উপযুক্ত 🎉🎉🎉
নামমাত্র

8

সুইফট 4

extension UIView {

    func roundTop(radius:CGFloat = 5){
        self.clipsToBounds = true
        self.layer.cornerRadius = radius
        if #available(iOS 11.0, *) {
            self.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
        } else {
            // Fallback on earlier versions
        }
    }

    func roundBottom(radius:CGFloat = 5){
        self.clipsToBounds = true
        self.layer.cornerRadius = radius
        if #available(iOS 11.0, *) {
            self.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner]
        } else {
            // Fallback on earlier versions
        }
    }
}

আপনি আমার ক্ষেত্রে আমার দিনটি বাঁচিয়েছিলেন আমাকে বিশেষ কক্ষগুলির জন্য টেবিলের ভিউটি গোল করতে হয়েছিল
শক্তি

আমার প্রয়োজন অনুযায়ী নিখুঁত আনস। আমি সমস্ত উত্তর ব্যবহার করেছি, আমার পক্ষে কিছুই কার্যকর হয়নি তবে আপনার উত্তর আমাকে সাহায্য করেছে এবং আমার সমস্যা সমাধান করেছে।
নিকিতা পাতিল

6

এই প্রোগ্রামটিমেটিক্যালি করার একটি উপায় হ'ল গোলাকার কোণগুলির UIViewউপরের অংশটির উপরের অংশটি তৈরি করা UIView। অথবা আপনি কিছু নীচে শীর্ষ লুকিয়ে রাখতে পারে।


6
এটি খুব কুৎসিত সমাধান: পি
আরবিটর

6
    // Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds 
                           byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight) 
                           cornerRadii:CGSizeMake(7.0, 7.0)];

// Create the shape layer and set its path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = cell.stripBlackImnageView.bounds;
maskLayer.path = maskPath.CGPath; 
// Set the newly created shapelayer as the mask for the image view's layer
view.layer.mask = maskLayer;

4

সবচেয়ে সহজ উপায়টি হল একটি বৃত্তাকার কোণার স্তর সহ একটি মুখোশ তৈরি করা।

CALayer *maskLayer = [CALayer layer];
maskLayer.frame = CGRectMake(0,0,maskWidth ,maskHeight);
maskLayer.contents = (__bridge id)[[UIImage imageNamed:@"maskImageWithRoundedCorners.png"] CGImage];

aUIView.layer.mask = maskLayer;

এবং ভুলবেন না:

#import <QuartzCore/QuartzCore.h>

4

ইতিমধ্যে প্রদত্ত উত্তরগুলির সবগুলিই সত্যিই ভাল এবং বৈধ (বিশেষত ইউনূস ব্যবহারের ধারণা mask সম্পত্তিটি )।

তবে আমার আরও জটিল কিছু দরকার ছিল কারণ আমার স্তরটি প্রায়শই আকার পরিবর্তন করতে পারে যার অর্থ প্রতিবার সেই মুখোশ যুক্তিকে কল করা দরকার এবং এটি কিছুটা বিরক্তিকর হয়েছিল।

আমি extensionsএকটি বাস্তব নির্মাণের জন্য দ্রুত এবং গণনাযুক্ত বৈশিষ্ট্য ব্যবহার করেছিcornerRadii সম্পত্তি যা স্তরটি বাইরে বেরোনোর ​​পরে মুখোশটি আপডেট করার ক্ষেত্রে যত্ন নেয়।

পিটার স্টেইনবার্গ দুর্দান্ত দিকগুলি ব্যবহার করে এটি অর্জন করা হয়েছিলসুইজারিংয়ের জন্য গ্রন্থাগারটি ।

সম্পূর্ণ কোড এখানে:

extension CALayer {
  // This will hold the keys for the runtime property associations
  private struct AssociationKey {
    static var CornerRect:Int8 = 1    // for the UIRectCorner argument
    static var CornerRadius:Int8 = 2  // for the radius argument
  }

  // new computed property on CALayer
  // You send the corners you want to round (ex. [.TopLeft, .BottomLeft])
  // and the radius at which you want the corners to be round
  var cornerRadii:(corners: UIRectCorner, radius:CGFloat) {
    get {
      let number = objc_getAssociatedObject(self, &AssociationKey.CornerRect)  as? NSNumber ?? 0
      let radius = objc_getAssociatedObject(self, &AssociationKey.CornerRadius)  as? NSNumber ?? 0
      return (corners: UIRectCorner(rawValue: number.unsignedLongValue), radius: CGFloat(radius.floatValue))
    }
    set (v) {
      let radius = v.radius
      let closure:((Void)->Void) = {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: v.corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.CGPath
        self.mask = mask
      }
      let block: @convention(block) Void -> Void = closure
      let objectBlock = unsafeBitCast(block, AnyObject.self)
      objc_setAssociatedObject(self, &AssociationKey.CornerRect, NSNumber(unsignedLong: v.corners.rawValue), .OBJC_ASSOCIATION_RETAIN)
      objc_setAssociatedObject(self, &AssociationKey.CornerRadius, NSNumber(float: Float(v.radius)), .OBJC_ASSOCIATION_RETAIN)
      do { try aspect_hookSelector("layoutSublayers", withOptions: .PositionAfter, usingBlock: objectBlock) }
      catch _ { }
    }
  }
}

আমি এটি ব্যাখ্যা করে একটি সাধারণ ব্লগ পোস্ট লিখেছি ।



2

এভাবে আপনি সি # তে জামারিনের সাহায্যে একটি বোতামের প্রতিটি কোণার জন্য একটি কোণার ব্যাসার্ধ সেট করতে পারেন :

var maskPath = UIBezierPath.FromRoundedRect(MyButton.Bounds, UIRectCorner.BottomLeft | UIRectCorner.BottomRight,
    new CGSize(10.0, 10.0));
var maskLayer = new CAShapeLayer
{
    Frame = MyButton.Bounds,
    Path = maskPath.CGPath
};
MyButton.Layer.Mask = maskLayer;

2

ইউনূস নেদিম মেহেল সমাধানটি পুনঃব্যবহার করার জন্য একটি সুন্দর প্রসারণ

সুইফট 2.3

extension UIView {
func roundCornersWithLayerMask(cornerRadii: CGFloat, corners: UIRectCorner) {
    let path = UIBezierPath(roundedRect: bounds,
                            byRoundingCorners: corners,
                            cornerRadii: CGSize(width: cornerRadii, height: cornerRadii))
    let maskLayer = CAShapeLayer()
    maskLayer.path = path.CGPath
    layer.mask = maskLayer
} }

ব্যবহার

let view = UIView()
view.roundCornersWithLayerMask(10,[.TopLeft,.TopRight])

সুন্দর পরিষ্কার সমাধান
আগ্রাসক

1

কোড বিট করার পরে @apinho দ্রুত 4.3 জরিমানা কাজ করছে

extension UIView {
func roundCornersWithLayerMask(cornerRadii: CGFloat, corners: UIRectCorner) {
    let path = UIBezierPath(roundedRect: bounds,
                            byRoundingCorners: corners,
                            cornerRadii: CGSize(width: cornerRadii, height: cornerRadii))
    let maskLayer = CAShapeLayer()
    maskLayer.path = path.cgPath
    layer.mask = maskLayer
  }
}

আপনি দেখতে জন্য এই ফাংশনটি ব্যবহার করতে

YourViewName. roundCornersWithLayerMask(cornerRadii: 20,corners: [.topLeft,.topRight])

0

স্টিফেনের উত্তরটির আরও একটি সংস্করণ ।

import UIKit

    class RoundCornerView: UIView {
    var corners : UIRectCorner = [.topLeft,.topRight,.bottomLeft,.bottomRight]
        var roundCornerRadius : CGFloat = 0.0
        override func layoutSubviews() {
            super.layoutSubviews()
            if corners.rawValue > 0 && roundCornerRadius > 0.0 {
                self.roundCorners(corners: corners, radius: roundCornerRadius)
            }
        }
        private func roundCorners(corners: UIRectCorner, radius: CGFloat) {
            let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            layer.mask = mask
        }

    }

0

সুইফটে ৪.২-তে, এটির মাধ্যমে এটি তৈরি করুন @IBDesignable:

@IBDesignable

class DesignableViewCustomCorner: UIView {

    @IBInspectable var cornerRadious: CGFloat = 0 {
        didSet {
            let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: cornerRadious, height: cornerRadious))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            self.layer.mask = mask
        }
    }

}

0

সাধারণ এক্সটেনশন

extension UIView {
    func roundCorners(corners: UIRectCorner, radius: CGFloat) {
        if #available(iOS 11, *) {
            self.clipsToBounds = true
            self.layer.cornerRadius = radius
            var masked = CACornerMask()
            if corners.contains(.topLeft) { masked.insert(.layerMinXMinYCorner) }
            if corners.contains(.topRight) { masked.insert(.layerMaxXMinYCorner) }
            if corners.contains(.bottomLeft) { masked.insert(.layerMinXMaxYCorner) }
            if corners.contains(.bottomRight) { masked.insert(.layerMaxXMaxYCorner) }
            self.layer.maskedCorners = masked
        }
        else {
            let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            layer.mask = mask
        }
    }
}

ব্যবহার:

view.roundCorners(corners: [.bottomLeft, .bottomRight], radius: 12)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.