तो जैसा:मैं एक घुमावदार छाया कैसे आकर्षित कर सकता हूं?
मुझे पता है कि यह, NSShadow
साथ काम नहीं करेंगे drawRect:
में यह ड्राइंग ठीक काम करेंगे।
तो जैसा:मैं एक घुमावदार छाया कैसे आकर्षित कर सकता हूं?
मुझे पता है कि यह, NSShadow
साथ काम नहीं करेंगे drawRect:
में यह ड्राइंग ठीक काम करेंगे।
आप कोर एनिमेशन परतों और shadowPath
संपत्ति का उपयोग करके यह और कई अन्य प्रकार की छायाएं कर सकते हैं। जिस छाया का आप वर्णन कर रहे हैं उसे अंडाकार छाया पथ के साथ बनाया जा सकता है।
इस छाया का उत्पादन करने के कोड के नीचे है। छाया के राउंडर आकार के लिए आप अंडाकार के आकार को ट्विक कर सकते हैं। आप परत पर छाया गुणों का उपयोग कर स्थिति, अस्पष्टता, रंग और धुंध त्रिज्या को भी ट्विक कर सकते हैं।
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);
बस अन्य छाया से एक ही तकनीक का उपयोग कर बनाया जा सकता है के कुछ उदाहरण दिखाने के लिए; इस
की तरह एक पथ इस
मैं यह बता सकता हूं कि कोड में ऐसा कैसे करें, या यह बताएं कि आपके लिए यह कोड जेनरेट करने वाले टूल का उपयोग कैसे करें। मैं बाद वाला चुनता हूं।
PaintCode (मुक्त डेमो उपलब्ध, प्रति सत्र 1 घंटे सीमा) का उपयोग करना।
ढाल समायोजित जब तक आप संतुष्ट हैं।
इतने सारे स्तर पर दिलचस्प। –
मैं आपके प्रयास की सराहना करता हूं, लेकिन यह मेरी जरूरत से बहुत दूर है। जिस छाया की मुझे आवश्यकता है वह न केवल बाएं से दाएं प्रगति करता है, बल्कि ऊपर से नीचे तक भी फीका होता है। 'एनएसजीडियंट' के साथ यह संभव नहीं है, इसलिए मैं एक अलग दृष्टिकोण की तलाश में हूं। मैंने कुछ समय पहले पेंटकोड खरीदा था, यह किसी भी अन्य समान सुविधा की पेशकश नहीं करता है। – NSAddict
यह बिल्कुल सही नहीं है लेकिन मुझे लगता है कि यह उस तरह की छाया खींचता है जिसे आप ढूंढ रहे हैं। ध्यान रखें कि मैंने कुल काला से स्पष्ट रंग तक एक सादा रैखिक ढाल छोड़ा है। इतने अंधेरे होने के कारण, यह आपको एक सुपर-यथार्थवादी छाया नहीं देगा जबतक कि आप मूल्यों को थोड़ा सा नहीं बदल देते। आप जो भी कदम उठाते हैं, उसे पाने के लिए आप अलग-अलग अल्फा मूल्यों के साथ अधिक स्थानों को जोड़कर ढाल के साथ खेलना चाह सकते हैं। कुछ प्रयोग संभवतः आवश्यक हैं लेकिन मूल्यों के साथ खेलने के लिए सभी हैं।
आपके सुझाव के अनुसार यह 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);
}
यह है कि यह कैसे मेरी स्क्रीन पर की तरह लग रहा है ...
मैं बस सिर्फ छाया से अधिक लेकिन आप कर सकते हैं एक छवि रखा यदि आप UIImageView को उपclass करते हैं और इसकी drawRect विधि को ओवरराइड करते हैं तो आसानी से छाया को एक छवि के साथ विलय करें।
जैसा कि आप देख सकते हैं, मैंने बस एक परिपत्र ढाल स्थापित करने के लिए क्या किया था, लेकिन मैंने इसे संदर्भ में खींचने से पहले इसे स्केल करने के लिए स्केलिंग मैट्रिक्स लोड किया था। यदि आप उस विधि में कुछ और करने की योजना बना रहे हैं, तो याद रखें कि आपके पास मैट्रिक्स है और आपके द्वारा किए गए सभी कार्यों को इसके द्वारा विकृत किया जाएगा।आप मैट्रिक्स को लोड करने से पहले CGContextSaveGState()
के साथ सीटीएम को सहेजना चाहेंगे और फिर मूल स्थिति को CGContextRestoreGState()
आशा करें कि यह वही था जो आप खोज रहे थे।
चीयर्स।
आह मैं इसका उल्लेख करना भूल गया था, क्योंकि मेरे उदाहरण में मैं 0.1 एफ इंडेक्स के साथ सबकुछ छीन रहा हूं, इसका मतलब है कि आपको एक छाया मिलेगी जो दृश्य की ऊंचाई का दसवां हिस्सा है। यदि आप इसे सेट अप करते हैं, तो छाया देखने के लिए अपना दृश्य काफी लंबा बनाएं। वास्तव में आप इस तरह के कोड को कहां रखना चाहते हैं, इस पर निर्भर करते हुए, आपको वास्तविक गुण आकार के समान छाया के समान कुछ गुणक रखना होगा। सादगी के लिए मैंने इस भाग को छोड़ दिया। –
यदि आप यहां शीर्ष मार्जिन से इसे खींचने की योजना बनाते हैं तो आपको ढाल को क्लिप करने की भी आवश्यकता होगी। –
यह उपयोगी हो सकता है, धन्यवाद! जब मैं कुछ समय लेता हूं तो मैं इसे आज़माउंगा और मैं आपको वापस ले जाऊंगा – NSAddict
- (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;
}
आशा यह आप में मदद मिलेगी की तरह एक छाया का उत्पादन करेगा।
क्या आपने 'ओएसएक्स' टैग देखा था? मैं यह नहीं कह रहा हूं कि आईओएस कोड का अनुवाद ओएसएक्स में नहीं किया जा सकता है, लेकिन आपको वह काम करना चाहिए। –
आप छाया को किस पर लागू कर रहे हैं? –
@ पेटूर कुछ भी नहीं, मैं इसे 'एनएसजीडियंट' या कुछ इसी तरह का उपयोग करके आकर्षित करना चाहता हूं। क्या आप मेरा मतलब समझ सकते हैं? – NSAddict
क्या आप किसी प्रकार की बूंद छाया का लक्ष्य रखते हैं? –