2011-07-05 10 views
116

मैं एक कस्टम UIView को चित्रित करने के बारे में कैसे जाऊं जो सचमुच केवल एक गेंद (2 डी सर्कल) है? क्या मैं सिर्फ drawRect विधि को ओवरराइड करूँगा? और क्या कोई मुझे नीली सर्कल बनाने के लिए कोड दिखा सकता है?एक कस्टम UIView को कैसे आकर्षित करें जो सिर्फ एक सर्कल है - आईफोन ऐप

साथ ही, क्या कक्षा के भीतर उस दृश्य के फ्रेम को बदलना ठीक होगा? या मुझे फ्रेम को एक अलग वर्ग से बदलने की ज़रूरत है?

उत्तर

189

आप QuartzCore इस्तेमाल कर सकते हैं और कुछ ऐसा करने -

self.circleView = [[UIView alloc] initWithFrame:CGRectMake(10,20,100,100)]; 
self.circleView.alpha = 0.5; 
self.circleView.layer.cornerRadius = 50; // half the width/height 
self.circleView.backgroundColor = [UIColor blueColor]; 
+95

एफवाईआई, क्वार्टकोर का उपयोग करके आपके दृश्य को देखने के लिए, आपके कोने त्रिज्या को आपकी फ्रेम ऊंचाई/चौड़ाई का आधा होना चाहिए। सर्कल बनाने का यह सबसे आसान तरीका है, लेकिन यह सबसे प्रभावी नहीं है। यदि प्रदर्शन महत्वपूर्ण है, तो drawRect शायद बेहतर परिणाम देगा। –

+4

और यह है। 100 ऊंचाई/चौड़ाई है। – Kal

+2

हाँ, माफ करना आपको उस पर निर्देश नहीं दे रहा था, कल। मैं उल्लेख कर रहा था कि अगर वह विभिन्न आकार के विचारों का उपयोग करना चाहता था तो स्टेनली को। –

127

मैं सिर्फ drawRect विधि ओवरराइड हैं (सिर्फ एक गेंद के चारों ओर उछल स्थापित करने के लिए कोशिश कर रहा है)?

हाँ:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextAddEllipseInRect(ctx, rect); 
    CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor blueColor] CGColor])); 
    CGContextFillPath(ctx); 
} 

इसके अलावा, यह वर्ग के भीतर ही उस दृश्य के फ्रेम को बदलने के लिए ठीक हो सकता है?

आदर्श रूप से नहीं, लेकिन आप कर सकते हैं।

या क्या मुझे फ्रेम को एक अलग वर्ग से बदलने की ज़रूरत है?

मैं माता-पिता को उस पर नियंत्रण करने देता हूं।

+1

मैं कस्टम रंग कैसे निर्धारित कर सकते हैं में backgroundColor सेट का उपयोग करता केवल नीले नहीं? मैं इस तरह सफेद और नीले रंग का उपयोग करने की कोशिश करता हूं: ([स्वयं।colorOfCircle CGColor]) लेकिन कुछ भी नहीं होता है: \ – gaussblurinc

+0

@loldop self.colorOfCircle एक UIColor है? क्या यह सेट है? यदि आप उस रेखा पर ब्रेकपॉइंट डालते हैं और मूल्य को देखते हैं, तो क्या आप इसकी अपेक्षा कर रहे हैं? यदि आप इसे तथ्य के बाद सेट करते हैं, तो आपको अपने दृश्य के उस हिस्से को अमान्य करना होगा जिसमें मंडल शामिल है। – Steve

+9

@gaussblurinc 'CGContextSetFillColorWithColor (ctx, self.colorOfCircle.CGColor) का उपयोग करें; 'समाधान में प्रस्तावित विधि' CGColorGetComponents' केवल कुछ रंगों के साथ काम करती है, http://stackoverflow.com/questions/9238743/is-here- एक-मुद्दे-साथ-cgcolorgetcomponents – yonilevy

26

यहाँ UIBezierPath का उपयोग करके एक और तरीका है (शायद यह बहुत देर हो चुकी ^^) मंडली बनाएं और इसके साथ UIView मुखौटा, इस प्रकार है:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
view.backgroundColor = [UIColor blueColor]; 

CAShapeLayer *shape = [CAShapeLayer layer]; 
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:view.center radius:(view.bounds.size.width/2) startAngle:0 endAngle:(2 * M_PI) clockwise:YES]; 
shape.path = path.CGPath; 
view.layer.mask = shape; 
+1

उस आकार परत को मास्क बनाने की वास्तव में आवश्यकता नहीं है; आप आकृति परत को सीधे दृश्य की परत के रूप में उपयोग कर सकते हैं और इसे भरने का रंग दे सकते हैं। मास्क शायद काफी महंगा है। –

+0

UIView की परत CALAYer है तो हम इस परत पर एक आकार कैसे आकर्षित कर सकते हैं। मुझे लगता है कि हम आकार परत को मास्किंग किए बिना परत को जोड़ते हैं ?? – Gintama

+1

आप UIView को उपclass कर सकते हैं और इसे 'लेयर क्लास' क्लास विधि को एक आकृति परत बनाने के लिए ओवरराइड कर सकते हैं। –

6

enter image description here मास्क का उपयोग करके सर्कल (और अन्य आकार) ड्राइंग के आने का एक और तरीका है। आप सर्किल या अन्य आकृतियों को आकर्षित करते हैं, सबसे पहले, आपको आवश्यक आकारों के मास्क बनाते हैं, दूसरा, अपने रंग के वर्ग प्रदान करते हैं और तीसरे, रंग के उन वर्गों पर मुखौटा लागू करते हैं। नया कस्टम सर्कल या अन्य आकार प्राप्त करने के लिए आप या तो मुखौटा या रंग बदल सकते हैं। उपरोक्त कोड का आउटपुट ऊपर है।

#import <QuartzCore/QuartzCore.h> 

@interface ViewController() 
@property (weak, nonatomic) IBOutlet UIView *area1; 
@property (weak, nonatomic) IBOutlet UIView *area2; 
@property (weak, nonatomic) IBOutlet UIView *area3; 
@property (weak, nonatomic) IBOutlet UIView *area4; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.area1.backgroundColor = [UIColor blueColor]; 
    [self useMaskFor: self.area1]; 

    self.area2.backgroundColor = [UIColor orangeColor]; 
    [self useMaskFor: self.area2]; 

    self.area3.backgroundColor = [UIColor colorWithRed: 1.0 green: 0.0 blue: 0.5 alpha:1.0]; 
    [self useMaskFor: self.area3]; 

    self.area4.backgroundColor = [UIColor colorWithRed: 1.0 green: 0.0 blue: 0.5 alpha:0.5]; 
    [self useMaskFor: self.area4]; 


} 

-(void) useMaskFor: (UIView*)colorArea { 

    CALayer *maskLayer = [CALayer layer]; 
    maskLayer.frame = colorArea.bounds; 
    UIImage *maskImage = [UIImage imageNamed:@"cirMask.png"]; 
    maskLayer.contents = (__bridge id)maskImage.CGImage; 
    colorArea.layer.mask = maskLayer; 
} 

@end 
+0

अच्छा समाधान जो निश्चित रूप से मेरे वोट का हकदार है! :-) –

13

एक तेज विस्तार के साथ मेरे योगदान:

extension UIView{ 
    func asCircle(){ 
     self.layer.cornerRadius = self.frame.width/2; 
     self.layer.masksToBounds = true 
    } 
} 

बस फोन myView.asCircle()

+0

'masksToBounds' को सत्य में सेट करना और' स्वयं 'का उपयोग करना इस उत्तर में सभी वैकल्पिक हैं, लेकिन यह अभी भी सबसे छोटा और सबसे अच्छा समाधान है –

1

स्विफ्ट 3 - Xcode 8,1

@IBOutlet weak var myView: UIView! 

    override func viewDidLoad() { 
      super.viewDidLoad() 

     let size:CGFloat = 35.0 
     myView.bounds = CGRect(x: 0, y: 0, width: size, height: size) 
     myView.layer.cornerRadius = size/2 
     myView.layer.borderWidth = 1 
     myView.layer.borderColor = UIColor.Gray.cgColor 

     } 
4

स्विफ्ट 3 वर्ग:

import UIKit 

class CircleView: UIView { 

    override func draw(_ rect: CGRect) { 
     guard let context = UIGraphicsGetCurrentContext() else {return} 

     context.addEllipse(in: rect) 
     context.setFillColor(.blue.cgColor) 
     context.fillPath() 
    } 


} 
5

स्विफ्ट 3 - कस्टम क्लास, पुन: उपयोग करने में आसान। यह यूआई बिल्डर

import UIKit 

@IBDesignable 
class CircleBackgroundView: UIView { 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     layer.cornerRadius = bounds.size.width/2 
     layer.masksToBounds = true 
    } 

} 
संबंधित मुद्दे