UIView गोल कोनों देते हैं


577

मेरे लॉगिन दृश्य में एक सबव्यू है जिसमें एक UIActivityViewऔर एक UILabelकहावत है "साइनिंग इन ..."। इस सबव्यू में कोने हैं जो गोल नहीं हैं। मैं उन्हें गोल कैसे बना सकता हूं?

क्या मेरे जिब के अंदर ऐसा करने का कोई तरीका है?


6
आईबी में इस तरह से कुछ करने के लिए गोल कोनों के साथ एक पूर्व-प्रदान की गई छवि की आवश्यकता होगी
एड मार्टी

9
जरूरी नहीं कि @ एड-मार्टी, @Gujamin का यह जवाब कुछ और श्रेय का हकदार है क्योंकि यह दिखाता है कि cornerRadiusकेवल इंटरफ़ेस बिल्डर का उपयोग करके टेबल पर संपत्ति कैसे लागू की जाए , बिना पूर्व-प्रदत्त छवियों का उपयोग किए या इसे कोड में सेट किए बिना।
djskinner 16

जवाबों:


1219

इसे इस्तेमाल करे

#import <QuartzCore/QuartzCore.h> // not necessary for 10 years now  :)

...

view.layer.cornerRadius = 5;
view.layer.masksToBounds = true;

नोट: यदि आप गोल कोनों को UIViewController's' के दृश्य में लागू करने का प्रयास कर रहे हैं , तो इसे व्यू कंट्रोलर के कंस्ट्रक्टर में लागू नहीं किया जाना चाहिए, बल्कि इसके -viewDidLoadबाद view, वास्तव में तुरंत किया जाता है।


6
ध्यान दें कि संपत्ति केवल iPhone 3.0 में मौजूद है, पहले के संस्करणों में नहीं।
केंडल हेल्मसटेटर गेलनर

5
मुझे सिर्फ इतना कहना है कि यह सबसे संतोषजनक जवाब है जो मैंने कभी एसओ पर देखा है। यहाँ जाँचने से पहले मुझे सिर्फ एक छवि संपादक के साथ लड़ने का एक घंटा बचाना पड़ा और रंग बदलने / आकार बदलने के लिए मेरे विचार को अधिक भंगुर बना दिया। धन्यवाद!
जस्टिन सियर्स

20
संबंधित नोट: किसी और दृश्य दृश्य (यानी छाया) में रुचि रखने वाले व्यक्ति आसानी से एक यूआईवाईवाईई पर लागू हो सकते हैं, उन्हें कैलेयर क्लास संदर्भ की जांच करनी चाहिए। अधिकांश यह उक्त उत्तर की तरह एक या दो संपत्ति मूल्यों को सेट करने में आसान है: developer.apple.com/mac/library/documentation/GraphicsImaging/…
जस्टिन सियर्स

6
@ कोलिन (या किसी और को भी, जिसे यह समस्या है), सुनिश्चित करें कि आपके विचार में "क्लिप साक्षात्कार" सेट है। आप इसे इंटरफ़ेस बिल्डर में देख सकते हैं।
zem

2
यदि आप किसी भी तरह के स्क्रॉल दृश्य या एनीमेशन में इन गोल कोनों में से बहुत से हैं, तो यह बहुत काम करता है (मैंने UITableView में उनका उपयोग करने की कोशिश की) आपको बहुत नुकसान होगा। अच्छा चिकनी स्क्रॉलिंग टेबल दृश्य जल्दी से
कटा

261

आप मुख्य मूल्य को मुख्य पथ पर सेट करने के लिए इंटरफ़ेस बिल्डर के उपयोगकर्ता परिभाषित रनटाइम एट्रिब्यूट फ़ीचर का भी उपयोग कर सकते हैं layer.cornerRadius। सुनिश्चित करें कि आप QuartzCoreलाइब्रेरी को शामिल करते हैं ।

यह ट्रिक layer.borderWidth को सेट करने के लिए भी काम करती है, हालांकि यह काम नहीं करेगा layer.borderColorक्योंकि यह उम्मीद करता है कि CGColorनहीं UIColor

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

कोने त्रिज्या सेट करने के लिए इंटरफ़ेस बिल्डर का उपयोग करना


10
Clip Subviewsआईबी के साथ
पीटर के

2
(या) एक मुख्य पथ जोड़ें: layer.masksToBounds, प्रकार: बूलियन: चेक किया गया
अमिताभ

64

अब आप स्टोरीबोर्ड पर परिणाम दिखाने के लिए @IBInspectable के साथ UIView (चित्र का कोड bellow) में एक स्विफ्ट श्रेणी का उपयोग कर सकते हैं (यदि आप श्रेणी का उपयोग कर रहे हैं, तो केवल कोनेरेडियस का उपयोग करें और एक प्रमुख पथ के रूप में परत नहीं।

extension UIView {
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }
}

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


और यदि आप एक कस्टम उप-वर्ग का उपयोग कर रहे हैं, तो @IBDesignableआईबी में लाइव पूर्वावलोकन प्राप्त करने के लिए इसे टैग करना सुनिश्चित करें ! ( Nshipster.com/ibinspectable-ibdesignable पर अधिक )
clozach

56

तीव्र

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

myView.layer.cornerRadius = 8
myView.layer.masksToBounds = true  // optional

अनुपूरक उत्तर

यदि आप इस उत्तर पर आए हैं, तो आप शायद पहले से ही अपनी समस्या को हल करने के लिए पर्याप्त देख चुके हैं। मैं इस जवाब को जोड़ रहा हूं कि क्यों वे क्या करते हैं, इसके लिए थोड़ा अधिक दृश्य स्पष्टीकरण देने के लिए।

यदि आप एक नियमित रूप से शुरू करते हैं UIViewतो इसके चौकोर कोने हैं।

let blueView = UIView()
blueView.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
blueView.backgroundColor = UIColor.blueColor()
view.addSubview(blueView)

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

cornerRadiusदृश्य की संपत्ति को बदलकर आप इसे गोल कोनों दे सकते हैं layer

blueView.layer.cornerRadius = 8

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

बड़े त्रिज्या मान अधिक गोल कोनों देते हैं

blueView.layer.cornerRadius = 25

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

और छोटे मूल्य कम गोल कोने देते हैं।

blueView.layer.cornerRadius = 3

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

यह आपकी समस्या को हल करने के लिए पर्याप्त हो सकता है। हालांकि, कभी-कभी एक दृश्य में एक सबव्यू या एक सबलेयर हो सकता है जो दृश्य की सीमा के बाहर जाता है। उदाहरण के लिए, अगर मुझे इस तरह से एक उप दृश्य जोड़ना था

let mySubView = UIView()
mySubView.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
mySubView.backgroundColor = UIColor.redColor()
blueView.addSubview(mySubView)

या अगर मैं इस तरह एक उप परत जोड़ना था

let mySubLayer = CALayer()
mySubLayer.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
mySubLayer.backgroundColor = UIColor.redColor().CGColor
blueView.layer.addSublayer(mySubLayer)

तब मैं खत्म हो जाता

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

अब, यदि मैं नहीं चाहता कि चीजें सीमा के बाहर लटकी हों, तो मैं यह कर सकता हूं

blueView.clipsToBounds = true

या यह

blueView.layer.masksToBounds = true

जो यह परिणाम देता है:

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

दोनों clipsToBoundsऔर masksToBoundsकर रहे हैं बराबर । यह सिर्फ इतना है कि पहले का उपयोग किया जाता है UIViewऔर दूसरे का उपयोग किया जाता है CALayer

यह सभी देखें


4
मैं यह भी जोड़ना चाहूंगा कि कोने की त्रिज्या को छोटे पक्ष के आधे हिस्से में (इस मामले में blueView.frame.size.height/2) पूरी तरह से गोल कोने में परिणाम दिया जाए।
जोहान बर्गेस

44

एक एड मार्टी की तुलना में एक अलग दृष्टिकोण:

#import <QuartzCore/QuartzCore.h>

[v.layer setCornerRadius:25.0f];
[v.layer setMasksToBounds:YES];

IB के सभी ऑब्जेक्ट्स को लोड करने के लिए आपको इसके लिए setMasksToBounds की आवश्यकता है ... मुझे एक समस्या मिली जहां मेरा विचार गोल हो गया, लेकिन आईबी से ऑब्जेक्ट नहीं थे: /

यह तय यह = डी आशा है कि यह मदद करता है!


48
यह कैसे अलग है? डॉट सिंटैक्स का उपयोग नहीं करने के अलावा?
user102008

3
[v.layer setMasksToBounds: YES]; \ n यह रेखा जादू है, यह मेरी बड़ी समस्या को हल करती है
कलन सन

3
मैंने यह तब लिखा था जब मैंने iOS का विकास शुरू किया था और मुझे नहीं पता था कि डॉट सिंटैक्स और ब्रैकेट सिंटैक्स में कोई अंतर नहीं था। इसलिए मैंने इसे "अलग" के रूप में लिखा। मेरे कोड में आयात भी शामिल था <> कि एड मार्टी ने अपनी मूल प्रतिक्रिया (बाद में संपादित की गई) में नहीं थी और इसलिए मेरा जवाब लोगों को उनकी समस्या को हल करने में मदद करता है (उर्फ आयातित नहीं है)।
क्रिस्टियन फ्लैटहेम जेन्सेन

28

जैसा कि इस ब्लॉग पोस्ट में बताया गया है , यहां एक UIView के कोनों को गोल करने की विधि है:

+(void)roundView:(UIView *)view onCorner:(UIRectCorner)rectCorner radius:(float)radius
{
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds
                                                   byRoundingCorners:rectCorner
                                                         cornerRadii:CGSizeMake(radius, radius)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = view.bounds;
    maskLayer.path = maskPath.CGPath;
    [view.layer setMask:maskLayer];
    [maskLayer release];
}

इसके बारे में अच्छा हिस्सा यह है कि आप चुन सकते हैं कि आप किन किन कोनों को गोल करना चाहते हैं।


6
केवल एक बाहरी साइट पर एक लिंक प्रदान करने के बजाय, हम पसंद करते हैं कि उत्तर यहां स्व-निहित हों, इसलिए मैं लिंक किए गए ब्लॉग पोस्ट से संबंधित कोड आपके उत्तर में लाया हूं। लोग अधिक विस्तार के लिए ब्लॉग पोस्ट पर जा सकते हैं, लेकिन यह सुनिश्चित करें कि यदि प्रश्न में पोस्ट चली गई तो सामग्री बच जाएगी। इसके अलावा, आपने इस उत्तर को कई अलग-अलग प्रश्नों में पोस्ट किया है जो वास्तव में एक ही बात नहीं पूछते हैं। जिन्हें हटा दिया गया था, और एक प्रश्न को इस एक के डुप्लिकेट के रूप में बंद कर दिया गया था। हमें प्रत्येक प्रश्न के मिलान के लिए तैयार किए गए उत्तर पसंद हैं।
ब्रैड लार्सन

5
पूर्वद्रष्टा। ब्लॉग पोस्ट अब 404 है।
एंथनी सी

यह दृष्टिकोण साफ है लेकिन यह दृश्य पर किसी भी छाया प्रभाव को छिपाएगा।
थिसुमर्सिग्न

19

आपको पहले हेडर फ़ाइल आयात करना होगा <QuartzCore/QuartzCore.h>

 #import QuartzCore/QuartzCore.h>

[yourView.layer setCornerRadius:8.0f];
yourView.layer.borderColor = [UIColor redColor].CGColor;
yourView.layer.borderWidth = 2.0f;
[yourView.layer setMasksToBounds:YES];

का उपयोग करने के लिए याद नहीं है - setMasksToBoundsअन्यथा प्रभाव नहीं दिखाया जा सकता है।


2
"क्वार्ट्जकोर / क्वार्ट्जकोर.ह" आयात करने की आवश्यकता नहीं है
सुधीर कुमार

हाँ, आपको आयात करने की आवश्यकता है।
लॉर्ड ज़सोल्ट

3
@LordZsolt शायद वे iOS7 के साथ बदल गए हैं, लेकिन आपको क्वार्ट्जकोर को अब आयात करने की आवश्यकता नहीं है।
मार्क

14

आप निम्नलिखित कस्टम UIViewवर्ग का उपयोग कर सकते हैं जो सीमा रंग और चौड़ाई भी बदल सकते हैं। जैसा कि यह है IBDesignalbeआप इंटरफ़ेस बिल्डर में विशेषताओं को भी बदल सकते हैं।

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

import UIKit

@IBDesignable public class RoundedView: UIView {

    @IBInspectable var borderColor: UIColor = UIColor.white {
        didSet {
            layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable var borderWidth: CGFloat = 2.0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            layer.cornerRadius = cornerRadius
        }
    }

}

6
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 50, 200, 200)];

view.layer.backgroundColor = [UIColor whiteColor].CGColor;
view.layer.cornerRadius = 20.0;
view.layer.frame = CGRectInset(v.layer.frame, 20, 20);

view.layer.shadowOffset = CGSizeMake(1, 0);
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowRadius = 5;
view.layer.shadowOpacity = .25;

[self.view addSubview:view];
[view release];

SetMasksToBounds लागू करना महत्वपूर्ण है। पृष्ठभूमि का रंग और ड्रॉप छाया सेट करना नहीं है।
djskinner

3

स्विफ्ट 4 - IBDesignable का उपयोग करना

   @IBDesignable
    class DesignableView: UIView {
    }

    extension UIView
    {

        @IBInspectable
        var cornerRadius: CGFloat {
            get {
                return layer.cornerRadius
            }
            set {
            layer.cornerRadius = newValue
        }
    }
}

मुझे खेद है, लेकिन IOS विकास के लिए एक नवागंतुक के रूप में। समाधान layer.cornerRadiusमूल स्थिति में वापस आने से कैसे रोकता है? (ईआई कैसे एक्सकोड के स्टोरीबोर्ड को जानता है कि cornerRadiusमूल UIViewके आरंभ होने के बाद ही कैसे सेट किया जाए)?
एलनटॉके


3

- स्विफ्टयूआई

SwiftUI में, आप cornerRadiusकिसी भी Viewइच्छित पर सीधे संशोधक का उपयोग कर सकते हैं। इस प्रश्न के उदाहरण के लिए:

Text("Signing In…")
    .padding(16)
    .background(Color.red)
    .cornerRadius(50)

पूर्वावलोकन

ध्यान दें कि त्रिज्या जैसा कोई और हीरा नहीं है, इसलिए भले ही आप कोनेरेडियस को आधी से अधिक ऊंचाई पर सेट करें , यह आसानी से गोल हो जाएगा।

SwiftUI में राउंड स्पेसिफिक कॉर्नर्स को कैसे अलग करना है, इस उत्तर को चेकआउट करें


2

कृपया आयात करें Quartzcore frameworkफिर आपको इसे बहुत महत्वपूर्ण पंक्ति में सेट setMaskToBoundsकरना TRUEहोगा।

फिर: [[yourView layer] setCornerRadius:5.0f];


2
UIView* viewWithRoundedCornersSize(float cornerRadius,UIView * original)
{
    // Create a white border with defined width
    original.layer.borderColor = [UIColor yellowColor].CGColor;
    original.layer.borderWidth = 1.5;

    // Set image corner radius
    original.layer.cornerRadius =cornerRadius;

    // To enable corners to be "clipped"
    [original setClipsToBounds:YES];
    return original;
}

2

इस प्रोग्राम को obj c में करें

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 50,    200, 200)];

view.layer.backgroundColor = [UIColor whiteColor].CGColor;
view.layer.cornerRadius = 20.0;
view.layer.frame = CGRectInset(v.layer.frame, 20, 20);

[view.layer.shadowOffset = CGSizeMake(1, 0);
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowRadius = 5;
view.layer.shadowOpacity = .25;][1]

[self.view addSubview:view];

वी कैन भी स्टोयबोर्ड से ऐसा कर सकता है।

 layer.cornerRadius  Number  5

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


2

अगर दृश्य में काम नहीं कर रहा राउंड कॉर्नर () दृश्य में कोड लिखना बेहतर है DidLayoutSubview ()

-(void)viewDidLayoutSubviews
{
    viewTextfield.layer.cornerRadius = 10.0 ;                                               
    viewTextfield.layer.borderWidth = 1.0f;
    viewTextfield.layer.masksToBounds =  YES;
    viewTextfield.layer.shadowRadius = 5;
    viewTextfield.layer.shadowOpacity = 0.3;
    viewTextfield.clipsToBounds = NO;
    viewTextfield.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
}

उम्मीद है की यह मदद करेगा!


0

आप एक छवि का उपयोग भी कर सकते हैं:

UIImage *maskingImage = [UIImage imageNamed:@"bannerBarBottomMask.png"];
CALayer *maskingLayer = [CALayer layer];
maskingLayer.frame = CGRectMake(-(self.yourView.frame.size.width - self.yourView.frame.size.width) / 2
                                , 0
                                , maskingImage.size.width
                                , maskingImage.size.height);
[maskingLayer setContents:(id)[maskingImage CGImage]];
[self.yourView.layer setMask:maskingLayer];

0

राउंड व्यू के लिए कॉर्नररियस प्रॉपर्टी सेट करें

छवि के लिए सेट मास्कटबाउंड बूलियन मान अभी भी कोने की त्रिज्या सीमा के बाहर नहीं खींचा जाएगा

view.layer.cornerRadius = 5;

view.layer.masksToBounds = YES;

0

UIView एक्सटेंशन का उपयोग करना:

extension UIView {    

func addRoundedCornerToView(targetView : UIView?)
{
    //UIView Corner Radius
    targetView!.layer.cornerRadius = 5.0;
    targetView!.layer.masksToBounds = true

    //UIView Set up boarder
    targetView!.layer.borderColor = UIColor.yellowColor().CGColor;
    targetView!.layer.borderWidth = 3.0;

    //UIView Drop shadow
    targetView!.layer.shadowColor = UIColor.darkGrayColor().CGColor;
    targetView!.layer.shadowOffset = CGSizeMake(2.0, 2.0)
    targetView!.layer.shadowOpacity = 1.0
}
}

उपयोग:

override func viewWillAppear(animated: Bool) {

sampleView.addRoundedCornerToView(statusBarView)

}

0

स्विफ्ट 4.2 और एक्सकोड 10.1 में

let myView = UIView()
myView.frame = CGRect(x: 200, y: 200, width: 200, height: 200)
myView.myViewCorners()
//myView.myViewCorners(width: myView.frame.width)//Pass View width
view.addSubview(myView)

extension UIView {
    //If you want only round corners
    func myViewCorners() {
        layer.cornerRadius = 10
        layer.borderWidth = 1.0
        layer.borderColor = UIColor.red.cgColor
        layer.masksToBounds = true
    }
    //If you want complete round shape, enable above comment line
    func myViewCorners(width:CGFloat) {
        layer.cornerRadius = width/2
        layer.borderWidth = 1.0
        layer.borderColor = UIColor.red.cgColor
        layer.masksToBounds = true
    }
}

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