2013-09-07 5 views
5

तो जैसा:मैं एक घुमावदार छाया कैसे आकर्षित कर सकता हूं?

enter image description here

मुझे पता है कि यह, NSShadow साथ काम नहीं करेंगे drawRect: में यह ड्राइंग ठीक काम करेंगे।

+0

आप छाया को किस पर लागू कर रहे हैं? –

+0

@ पेटूर कुछ भी नहीं, मैं इसे 'एनएसजीडियंट' या कुछ इसी तरह का उपयोग करके आकर्षित करना चाहता हूं। क्या आप मेरा मतलब समझ सकते हैं? – NSAddict

+0

क्या आप किसी प्रकार की बूंद छाया का लक्ष्य रखते हैं? –

उत्तर

5

आप कोर एनिमेशन परतों और shadowPath संपत्ति का उपयोग करके यह और कई अन्य प्रकार की छायाएं कर सकते हैं। जिस छाया का आप वर्णन कर रहे हैं उसे अंडाकार छाया पथ के साथ बनाया जा सकता है।

enter image description here

इस छाया का उत्पादन करने के कोड के नीचे है। छाया के राउंडर आकार के लिए आप अंडाकार के आकार को ट्विक कर सकते हैं। आप परत पर छाया गुणों का उपयोग कर स्थिति, अस्पष्टता, रंग और धुंध त्रिज्या को भी ट्विक कर सकते हैं।

self.wantsLayer = YES; 

NSView *viewWithRoundShadow = [[NSView alloc] initWithFrame:NSMakeRect(30, 30, 200, 100)]; 
[self addSubview:viewWithRoundShadow]; 

CALayer *backingLayer = viewWithRoundShadow.layer; 
backingLayer.backgroundColor = [NSColor orangeColor].CGColor; 

// Configure shadow 
backingLayer.shadowColor = [NSColor blackColor].CGColor; 
backingLayer.shadowOffset = CGSizeMake(0, -1.); 
backingLayer.shadowRadius = 5.0; 
backingLayer.shadowOpacity = 0.75; 

CGRect shadowRect = backingLayer.bounds; 
CGFloat shadowRectHeight = 25.; 
shadowRect.size.height = shadowRectHeight; 
// make narrow 
shadowRect = CGRectInset(shadowRect, 5, 0); 

backingLayer.shadowPath = CGPathCreateWithEllipseInRect(shadowRect, NULL); 

बस अन्य छाया से एक ही तकनीक का उपयोग कर बनाया जा सकता है के कुछ उदाहरण दिखाने के लिए; इस

enter image description here

की तरह एक पथ इस

enter image description here

+0

यह एक अच्छा है! मुझे आज रात बाहर आज़माएं और मैं आपको वापस मिलूंगा – NSAddict

+0

पूरी तरह से काम करता है, धन्यवाद एक गुच्छा! – NSAddict

1

मैं यह बता सकता हूं कि कोड में ऐसा कैसे करें, या यह बताएं कि आपके लिए यह कोड जेनरेट करने वाले टूल का उपयोग कैसे करें। मैं बाद वाला चुनता हूं।

Image

PaintCode (मुक्त डेमो उपलब्ध, प्रति सत्र 1 घंटे सीमा) का उपयोग करना।

  1. ड्रा एक अंडाकार
  2. एक आयत जो अंडाकार के नीचे के साथ काटती है ड्रा।
  3. सीएमडी ऊपरी बाएं कोने में "ऑब्जेक्ट्स" सूची में आयताकार और अंडाकार दोनों पर क्लिक करें।
  4. टूलबार में इंटरसेक्ट बटन दबाएं।
  5. ऑब्जेक्ट्स सूची से बेजियर का चयन करें।
  6. "नहीं स्ट्रोक"
  7. करने के लिए अपने स्ट्रोक सेट ढाल बटन (बाईं ओर स्थित है, चुनाव इंस्पेक्टर नीचे)
  8. प्रेस "+" बटन
  9. बदलें हल्के भूरे रंग के लिए ढाल रंग क्लिक करें।
  10. चयन निरीक्षक से, भरण शैली को "ढाल"
  11. ढाल का चयन बदलने के लिए: रैखिक

ढाल समायोजित जब तक आप संतुष्ट हैं।

+0

इतने सारे स्तर पर दिलचस्प। –

+0

मैं आपके प्रयास की सराहना करता हूं, लेकिन यह मेरी जरूरत से बहुत दूर है। जिस छाया की मुझे आवश्यकता है वह न केवल बाएं से दाएं प्रगति करता है, बल्कि ऊपर से नीचे तक भी फीका होता है। 'एनएसजीडियंट' के साथ यह संभव नहीं है, इसलिए मैं एक अलग दृष्टिकोण की तलाश में हूं। मैंने कुछ समय पहले पेंटकोड खरीदा था, यह किसी भी अन्य समान सुविधा की पेशकश नहीं करता है। – NSAddict

2

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

आपके सुझाव के अनुसार यह drawRect:(CGRect)rect चीज़ है। बस एक कस्टम दृश्य बना सकते हैं और केवल इसे ओवरराइड:

- (void)drawRect:(CGRect)rect { 
    // Get the context 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Setup the gradient locations. We just want 0 and 1 as in the start and end of the gradient. 
    CGFloat locations[2] = { 0.0, 1.0 }; 

    // Setup the two colors for the locations. A plain black and a plain black with alpha 0.0 ;-) 
    CGFloat colors[8] = { 0.0f, 0.0f, 0.0f, 1.0f, // Start color 
          0.0f, 0.0f, 0.0f, 0.0f }; // End color 

    // Build the gradient 
    CGGradientRef gradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), 
                   colors, 
                   locations, 
                   2); 

    // Load a transformation matrix that will squash the gradient in the current context 
    CGContextScaleCTM(context,1.0f,0.1f); 

    // Draw the gradient 
    CGContextDrawRadialGradient(context,         // The context 
           gradient,         // The gradient 
           CGPointMake(self.bounds.size.width/2,0.0f), // Starting point 
           0.0f,          // Starting redius 
           CGPointMake(self.bounds.size.width/2,0.0f), // Ending point 
           self.bounds.size.width/2,     // Ending radius 
           kCGGradientDrawsBeforeStartLocation);  // Options 

    // Release it an pray that everything was well written 
    CGGradientRelease(gradient); 
} 

यह है कि यह कैसे मेरी स्क्रीन पर की तरह लग रहा है ...

Resulting shadow

मैं बस सिर्फ छाया से अधिक लेकिन आप कर सकते हैं एक छवि रखा यदि आप UIImageView को उपclass करते हैं और इसकी drawRect विधि को ओवरराइड करते हैं तो आसानी से छाया को एक छवि के साथ विलय करें।

जैसा कि आप देख सकते हैं, मैंने बस एक परिपत्र ढाल स्थापित करने के लिए क्या किया था, लेकिन मैंने इसे संदर्भ में खींचने से पहले इसे स्केल करने के लिए स्केलिंग मैट्रिक्स लोड किया था। यदि आप उस विधि में कुछ और करने की योजना बना रहे हैं, तो याद रखें कि आपके पास मैट्रिक्स है और आपके द्वारा किए गए सभी कार्यों को इसके द्वारा विकृत किया जाएगा।आप मैट्रिक्स को लोड करने से पहले CGContextSaveGState() के साथ सीटीएम को सहेजना चाहेंगे और फिर मूल स्थिति को CGContextRestoreGState()

आशा करें कि यह वही था जो आप खोज रहे थे।

चीयर्स।

+0

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

+0

यदि आप यहां शीर्ष मार्जिन से इसे खींचने की योजना बनाते हैं तो आपको ढाल को क्लिप करने की भी आवश्यकता होगी। –

+0

यह उपयोगी हो सकता है, धन्यवाद! जब मैं कुछ समय लेता हूं तो मैं इसे आज़माउंगा और मैं आपको वापस ले जाऊंगा – NSAddict

1
- (void)viewDidLoad 
{ 
UIImage *natureImage = [UIImage imageNamed:@"nature.jpg"]; 
CALayer *layer = [CALayer layer]; 
layer.bounds = CGRectMake(0, 0, 200, 200); 
layer.position = CGPointMake(380, 200); 
layer.contents = (id)natureImage.CGImage; 

layer.shadowOffset = CGSizeMake(0,2); 
layer.shadowOpacity = 0.70; 
layer.shadowPath = (layer.shadowPath) ? nil : [self bezierPathWithCurvedShadowForRect:layer.bounds].CGPath; 
[self.view.layer addSublayer:layer]; 
} 

- (UIBezierPath*)bezierPathWithCurvedShadowForRect:(CGRect)rect { 

    UIBezierPath *path = [UIBezierPath bezierPath]; 

    CGPoint topLeft  = rect.origin; 
    CGPoint bottomLeft = CGPointMake(0.0, CGRectGetHeight(rect) + offset); 
    CGPoint bottomMiddle = CGPointMake(CGRectGetWidth(rect)/2, CGRectGetHeight(rect) - curve); 
    CGPoint bottomRight = CGPointMake(CGRectGetWidth(rect), CGRectGetHeight(rect) + offset); 
    CGPoint topRight  = CGPointMake(CGRectGetWidth(rect), 0.0); 

    [path moveToPoint:topLeft]; 
    [path addLineToPoint:bottomLeft]; 
    [path addQuadCurveToPoint:bottomRight controlPoint:bottomMiddle]; 
    [path addLineToPoint:topRight]; 
    [path addLineToPoint:topLeft]; 
    [path closePath]; 

    return path; 
} 

आशा यह आप में मदद मिलेगी की तरह एक छाया का उत्पादन करेगा।

+0

क्या आपने 'ओएसएक्स' टैग देखा था? मैं यह नहीं कह रहा हूं कि आईओएस कोड का अनुवाद ओएसएक्स में नहीं किया जा सकता है, लेकिन आपको वह काम करना चाहिए। –

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