2012-06-25 6 views
10
self.myPath=[UIBezierPath bezierPathWithArcCenter:center 
              radius:200 
             startAngle:0 
             endAngle:180 
             clockwise:YES]; 

की रिवर्स पथ (इतना मैं कुछ Googling की मदद से चल रहा है उठो करने में सक्षम था ..)कैसे एक UIBezierPath

मैं इस पथ प्राप्त करने के लिए। अब मैं इस पथ के विपरीत को भरना चाहता हूं, इसलिए इस हिस्से को छोड़कर और बाकी सब कुछ भरना। क्या कोई मुझे कोडिंग के साथ मदद कर सकता है। मुझे इस पर ज्यादा जानकारी नहीं है।

> समस्या

enter image description here

क्षेत्र में प्रयोग केमल उत्तर के बाद दिखाया जा रहा है कि पहले यह केवल लाल स्ट्रोक के साथ एक चक्र दिखाया।

> नया संपादित

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.backgroundColor = [UIColor whiteColor]; 
     self.punchedOutPath = 
     [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 400, 400)]; 
     self.fillColor = [UIColor redColor]; 
     self.alpha = 0.8; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    [[self fillColor] set]; 
    UIRectFill(rect); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut); 

    [[self punchedOutPath] fill]; 

    CGContextSetBlendMode(ctx, kCGBlendModeNormal); 
} 

enter image description here

+0

यह एक चक्र पूरा या एक खुला गोल आकार होगा? साथ ही, क्या आप अपनी अपेक्षा की एक छवि प्रदान कर सकते हैं? यह सुंदर होना जरूरी नहीं है लेकिन यह लोगों को यह समझने में बहुत मदद करेगा कि आप क्या करने की कोशिश कर रहे हैं ताकि वे आपकी मदद कर सकें। –

+0

किया गया ... यह केवल इसलिए प्रदान करने पर काम कर रहा है क्योंकि मैंने बक्षीस – Shubhank

उत्तर

2

मैं तुम्हारे लिए दो समाधान है।

  1. इस पथ को CALayer पर खींचे। और वास्तविक CALayer के लिए उस मास्क परत के रूप में CALayer का उपयोग करें।

  2. आर्क जोड़ने से पहले आपके फ्रेम के आकार के साथ एक आयताकार बनाएं।

    UIBezierPath *path = [UIBezierPath bezierPathWithRect:view.frame]; 
    [path addArcWithCenter:center 
           radius:200 
          startAngle:0 
           endAngle:2*M_PI 
          clockwise:YES]; 
    

मैं दूसरा समाधान का प्रयोग करेंगे। :)

+2

बनाया है दूसरा समाधान बेहतर है, आर्क को अनलॉक करने के लिए आवश्यक आर्क को छोड़कर, इसलिए जिस क्षेत्र को सीमित किया गया है उसे [nonzero घुमावदार संख्या नियम] (https: //developer.apple.com/library/ios/documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_paths/dq_paths.html#//apple_ref/doc/uid/TP30001066-CH211-TPXREF106) (आयताकार घड़ी की दिशा में जोड़ा जाता है) । –

+0

यह मेरे लिए काम नहीं कर रहा है, मुझे बहुत अजीब परिणाम मिल रहा है..मैंने इसे प्रश्न में जोड़ा है .. कृपया देखें .. धन्यवाद – Shubhank

+1

एंडएंगल को रेडियंस (डिग्री नहीं) होना चाहिए। आप एक 360 डिग्री सर्कल चाहते हैं, तो यह 2pi या 6.283 है। आप इसे '2 * M_PI' के रूप में लिख सकते हैं। –

12

यहां एक विकल्प है जिसके लिए पथ को उलट करने की आवश्यकता नहीं है।

clipped out

मान लीजिए कि आप सफेद क्षेत्र 75% अल्फा के साथ [UIColor whiteColor] होने के लिए चाहते हैं:

आप एक ऐसा दृश्य के एक हिस्से को आप अनिवार्य रूप से "बाहर क्लिप" करना चाहते हैं। यहां बताया गया है कि आप इसे जल्दी कैसे करते हैं:

  • आप एक नया UIView सबक्लास बनाते हैं।

    @property (retain) UIColor *fillColor; 
    @property (retain) UIBezierPath *punchedOutPath; 
    
  • आप यह करने के लिए अपने -drawRect: विधि ओवरराइड:

  • यह दृश्य दो गुण है

    - (void)drawRect:(CGRect)rect { 
        [[self fillColor] set]; 
        UIRectFill(rect); 
    
        CGContextRef ctx = UIGraphicsGetCurrentContext(); 
        CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut); 
    
        [[self punchedOutPath] fill]; 
    
        CGContextSetBlendMode(ctx, kCGBlendModeNormal); 
    } 
    

यहाँ एक चेतावनी है: fillColor देखने के नहीं करना चाहिए अल्फा घटक शामिल हैं। तो आपके मामले में, आप चाहते हैं कि यह सिर्फ [UIColor whiteColor] हो। फिर आप [myView setAlpha:0.75] पर कॉल करके अल्फा बिट स्वयं लागू करें।

यहां क्या हो रहा है: यह "गंतव्य आउट" नामक मिश्रण मोड का उपयोग कर रहा है। गणितीय रूप से इसे R = D*(1 - Sa) के रूप में परिभाषित किया गया है, लेकिन आम आदमी के शब्दों में इसका अर्थ है "गंतव्य छवि जहां गंतव्य छवि अपारदर्शी है, लेकिन गंतव्य छवि पारदर्शी है, और कहीं और पारदर्शी है।"

तो यह जहां बेज़ियर पथ अपारदर्शी होगा जहाँ भी नई सामान पारदर्शी (बेज़ियर पथ की यानी बाहर) है गंतव्य (यानी, किस संदर्भ में पहले से ही है) का उपयोग करने जा रहा है, और फिर, कि सामान है पारदर्शी बनने जा रहा है। हालांकि, गंतव्य सामग्री पहले से ही अपारदर्शी होनी चाहिए। यदि यह अपारदर्शी नहीं है, तो मिश्रण जो आप चाहते हैं वह नहीं करता है। यही कारण है कि आपको एक अपारदर्शी UIColor प्रदान करना होगा और फिर सीधे दृश्य के साथ इच्छित पारदर्शिता करना होगा।


मैं इस अपने आप को भाग गया, इन परिस्थितियों के साथ:

  • खिड़की एक [UIColor greenColor] पृष्ठभूमि
  • fillColor सफेद है
  • punchedOutPath एक अंडाकार किनारों से इनसेट 10 अंक है कि है दृश्य का

    enter image description here

    आंतरिक शुद्ध हरे रंग की है, और बाहर अर्द्ध पारदर्शी ओवरले है:

  • दृश्य एक 0.75
ऊपर कोड के साथ

की alpha है, मैं इस मिलता है।


अद्यतन

अपने कवर एक छवि है, तो आप एक नई छवि बनाने की आवश्यकता होगी। लेकिन सिद्धांत एक ही है:

UIImage* ImageByPunchingPathOutOfImage(UIImage *image, UIBezierPath *path) { 
    UIGraphicsBeginImageContextWithOptions([image size], YES, [image scale]); 

    [image drawAtPoint:CGPointZero]; 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut); 
    [path fill]; 


    UIImage *final = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return final; 
} 

फिर आप इस फ़ंक्शन के परिणाम लेने के लिए और यह एक UIImageView में डाल दिया जाएगा।

+0

क्या आप मुझे अपनी परियोजना के साथ प्रदान करने में सक्षम होंगे .. ?? कृप्या..! यह बेहतर होगा क्योंकि मेरे पास एक कामकाजी कोड होगा ... अन्यथा मुझे आपके साथ प्रश्न साफ़ करना होगा..और यह आपके लिए परेशान हो सकता है! – Shubhank

+0

@shubhank उत्तर में कोड आपको –

+0

हाय की सभी चीजों का वर्णन करता है .. क्या आप ques पर अपना नया संपादन जांच सकते हैं..मैंने आपकी विधि की कोशिश की..मैं अपने दृश्य की पृष्ठभूमि को सफेद रंग के रूप में सेट करता हूं .. ओवल है काला रंग है..क्या आप इसके साथ मेरी मदद कर सकते हैं..यह सफेद होना चाहिए था ... धन्यवाद – Shubhank

14

bezierPathByReversingPath का उपयोग करें। दस्तावेज़ों से (केवल आईओएस 6.0+):

वर्तमान पथ की उलटा सामग्री के साथ एक नया बेजियर पथ ऑब्जेक्ट बनाता है और देता है।

तो अपने पथ को उल्टा करने, तुम बस चाहते हैं:

UIBezierPath* aPath = [UIBezierPath bezierPathWithArcCenter:center 
                radius:200 
               startAngle:0 
                endAngle:180 
                clockwise:YES]; 
self.myPath = [aPath bezierPathByReversingPath]; 
2

आप दृश्य नियंत्रक में एक ही स्क्रीन एप्लिकेशन में डाल सकते हैं: यह एक पीले रंग की पृष्ठभूमि देख सकते हैं और पर एक नीले परत कर देगा इसके शीर्ष पर एक अंडाकार क्षेत्र एक मुखौटा द्वारा काटा जाता है।

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    // create a yellow background 
    UIView *bg = [[UIView alloc] initWithFrame:self.view.bounds]; 
    bg.backgroundColor = [UIColor yellowColor]; 
    [self.view addSubview:bg];  

    // create the mask that will be applied to the layer on top of the 
    // yellow background 
    CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
    maskLayer.fillRule = kCAFillRuleEvenOdd; 
    maskLayer.frame = self.view.frame; 

    // create the paths that define the mask 
    UIBezierPath *maskLayerPath = [UIBezierPath bezierPath]; 
    [maskLayerPath appendPath:[UIBezierPath bezierPathWithRect:CGRectInset(self.view.bounds, 20, 20)]]; 
    // here you can play around with paths :) 
// [maskLayerPath appendPath:[UIBezierPath bezierPathWithOvalInRect:(CGRect){{80, 80}, {140, 190}}]]; 
    [maskLayerPath appendPath:[UIBezierPath bezierPathWithOvalInRect:(CGRect){{100, 100}, {100, 150}}]]; 
    maskLayer.path = maskLayerPath.CGPath; 

    // create the layer on top of the yellow background 
    CALayer *imageLayer = [CALayer layer]; 
    imageLayer.frame = self.view.layer.bounds; 
    imageLayer.backgroundColor = [[UIColor blueColor] CGColor]; 

    // apply the mask to the layer 
    imageLayer.mask = maskLayer; 
    [self.view.layer addSublayer:imageLayer]; 

} 

इस रूप में अच्छी तरह इस सवाल का जवाब दे सकता है: UIBezierPath Subtract Path

+0

आप आप क्या कर रहे हैं और क्यों समझा सकते हैं? बस इतना ही व्यक्ति जिसने पूछा और अन्य लोग उत्तर की तलाश में हैं, उसे समझें कि आपने इसका उत्तर क्या दिया है। एक अंडाकार आकर्षित: – Manuel

+0

"अंडाकार क्षेत्र" मेरे लिए वर्ग ... – zakdances

+0

अजीब, क्यों नहीं [UIBezierPath bezierPathWithOvalInRect] होता दिखाई? आप की नकल की और एक खाली ही स्क्रीन परियोजना में वास्तव में है कि कोड चिपकाया है? – user511