दिलचस्प पोस्ट
JSON.stringify सामान्य जावास्क्रिप्ट सरणी के साथ काम नहीं करता है एंड्रॉइड – वेबसर्वर से फाइल कैसे डाउनलोड करें Sqlite: CURRENT_TIMESTAMP जीएमटी में है, न कि मशीन का समय क्षेत्र जावास्क्रिप्ट: ऑपरेटर ओवरलोडिंग Fabric.js – कस्टम विशेषताओं के साथ सर्वर पर कैनवास कैसे सहेजना है Google एंड्रॉइड यूएसबी चालक और एडीबी एक पृष्ठ HTML में बाहरी पृष्ठ html डालें एंड्रॉइड में ओवरलैपिंग दृश्य पायथन में पूर्णांक में स्ट्रिंग कैसे विभाजित? JavaScript में Eval जैसे vb.net में गणित करना स्ट्रिंग से होस्टनाम नाम निकालें 6 जीटग्नॉर फाइल में Xcode को क्या शामिल करना चाहिए? चेतावनी: mysqli_real_escape_string () बिल्कुल 2 मापदंडों की उम्मीद है, 1 दिया … मैं क्या गलत करता हूँ? मैं किसी अन्य संरचना से प्राप्त संरचना को प्रारंभ क्यों नहीं कर सकता? क्या मैं किसी विधि में कोड का निरीक्षण करने के लिए प्रतिबिंब का उपयोग कर सकता हूं?

गोल कोनों और ड्रॉप छाया के साथ UIView?

मैंने सचमुच सब कुछ की कोशिश की है, लेकिन उनमें से कोई भी एक कस्टम UIView लिए काम नहीं करता है … मैं सिर्फ गोलाकार कोनों और एक हल्का बूंद छाया (कोई प्रकाश प्रभाव के बिना) के साथ एक खाली सफेद दृश्य चाहता था। मैं उनमें से हर एक के साथ एक कर सकता हूं, लेकिन सामान्य clipToBounds / maskToBounds सामना करना maskToBounds है।

वेब के समाधान से एकत्रित समाधान "गोल कोनों और ड्रॉप छाया के साथ UIView?"

निम्न कोड स्निपेट एक सीमा, सीमा त्रिज्या जोड़ता है, और एक UIView लिए छाया को छोड़ देता है:

 // border radius [v.layer setCornerRadius:30.0f]; // border [v.layer setBorderColor:[UIColor lightGrayColor].CGColor]; [v.layer setBorderWidth:1.5f]; // drop shadow [v.layer setShadowColor:[UIColor blackColor].CGColor]; [v.layer setShadowOpacity:0.8]; [v.layer setShadowRadius:3.0]; [v.layer setShadowOffset:CGSizeMake(2.0, 2.0)]; 

आप अपनी आवश्यकताओं के अनुसार सेटिंग्स समायोजित कर सकते हैं

साथ ही, अपनी परियोजना में क्वार्ट्ज़कोर फ्रेमवर्क जोड़ें और:

 #import <QuartzCore/QuartzCore.h> 

masksToBounds बारे में मेरे अन्य उत्तर देखें


ध्यान दें

यह सभी मामलों में काम नहीं करेगा। यदि आपको लगता है कि यह विधि अन्य ड्राइंग आपरेशनों में हस्तक्षेप करती है जो आप कर रहे हैं, तो कृपया इस उत्तर को देखें।

तीव्र

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

 // corner radius blueView.layer.cornerRadius = 10 // border blueView.layer.borderWidth = 1.0 blueView.layer.borderColor = UIColor.black.cgColor // shadow blueView.layer.shadowColor = UIColor.black.cgColor blueView.layer.shadowOffset = CGSize(width: 3, height: 3) blueView.layer.shadowOpacity = 0.7 blueView.layer.shadowRadius = 4.0 

विकल्पों की खोज

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

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

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

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

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

समस्या 1: छाया काटा गया

क्या होगा अगर कोई उपन्यास या उप-दृश्य (एक छवि की तरह) है, जिसका सामग्री हम अपने दृश्य की सीमा तक क्लिप करना चाहते हैं?

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

हम इसके साथ पूरा कर सकते हैं

 blueView.layer.masksToBounds = true 

(वैकल्पिक रूप से, blueView.clipsToBounds = true एक ही परिणाम देता है।)

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

लेकिन, ओह नहीं! छाया भी बंद काट दिया गया था क्योंकि यह सीमा से बाहर है! क्या करें? क्या करें?

उपाय

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

 // add the shadow to the base view baseView.backgroundColor = UIColor.clear baseView.layer.shadowColor = UIColor.black.cgColor baseView.layer.shadowOffset = CGSize(width: 3, height: 3) baseView.layer.shadowOpacity = 0.7 baseView.layer.shadowRadius = 4.0 // add the border to subview let borderView = UIView() borderView.frame = baseView.bounds borderView.layer.cornerRadius = 10 borderView.layer.borderColor = UIColor.black.cgColor borderView.layer.borderWidth = 1.0 borderView.layer.masksToBounds = true baseView.addSubview(borderView) // add any other subcontent that you want clipped let otherSubContent = UIImageView() otherSubContent.image = UIImage(named: "lion") otherSubContent.frame = borderView.bounds borderView.addSubview(otherSubContent) 

यह निम्न परिणाम देता है:

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

समस्या 2: खराब प्रदर्शन

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

 baseView.layer.shadowPath = UIBezierPath(roundedRect: baseView.bounds, cornerRadius: 10).cgPath baseView.layer.shouldRasterize = true baseView.layer.rasterizationScale = UIScreen.main.scale 

अधिक जानकारी के लिए इस पोस्ट देखें। यहां और यहां भी देखें

ऐसा करने का एक तरीका ड्रॉप छाया के साथ एक दृश्य में गोलाकार कोनों को देखने देना है

 UIView* roundedView = [[UIView alloc] initWithFrame: frame]; roundedView.layer.cornerRadius = 5.0; roundedView.layer.masksToBounds = YES; UIView* shadowView = [[UIView alloc] initWithFrame: frame]; shadowView.layer.shadowColor = [UIColor blackColor].CGColor; shadowView.layer.shadowRadius = 5.0; shadowView.layer.shadowOffset = CGSizeMake(3.0, 3.0); shadowView.layer.shadowOpacity = 1.0; [shadowView addSubview: roundedView]; 

फिर आप जहां भी चाहें वहां shadowView जोड़ सकते हैं

यह मेरे लिए काम किया चाल मुख्य परत से पृष्ठभूमि रंग को ले जाने के लिए था

 CALayer *layer = view.layer; layer.cornerRadius = 15.0f; layer.masksToBounds = NO; layer.shadowOffset = CGSizeMake(0, 3); layer.shadowColor = [[UIColor blackColor] CGColor]; layer.shadowRadius = 2.0f; layer.shadowOpacity = 0.35f; layer.shadowPath = [[UIBezierPath bezierPathWithRoundedRect:layer.bounds cornerRadius:layer.cornerRadius] CGPath]; CGColorRef bColor = view.backgroundColor.CGColor; view.backgroundColor = nil; layer.backgroundColor = bColor ; 

कंटेनर दृश्य के लिए छाया पथ निर्दिष्ट करते समय मैंने निम्नलिखित चाल का उपयोग करते हुए समस्या का समाधान किया:

  [UIBezierPath bezierPathWithRoundedRect:cell.bounds cornerRadius:12] 

ध्यान दें कि छाया को दी गई पथ एक गोलाकार आयताकार है जिसकी एक ही कोने के त्रिज्या के साथ पृष्ठभूमि में सेल शामिल है:

  //this is the border for the UIView that is added to a cell cell.backgroundView.layer.cornerRadius = 12; cell.backgroundView.layer.masksToBounds = YES; cell.backgroundView.layer.borderColor =[UIColor darkGrayColor].CGColor; cell.backgroundView.layer.borderWidth = 1; //this is the shadow around the cell itself (cannot have round corners with borders and shadow, need to use two views cell.layer.shadowRadius = 2; cell.layer.cornerRadius = 12; cell.layer.masksToBounds = NO; [[cell layer] setShadowColor:[[UIColor darkGrayColor] CGColor]]; [[cell layer] setShadowOffset:CGSizeMake(0,0)]; [[cell layer] setShadowOpacity:1]; UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:cell.bounds cornerRadius:12]; [[cell layer] setShadowPath:[path CGPath]]; 

यदि आप गोलाकार corners बनाम बनाम masksToBounds बनाम masksToBounds की वजह से संघर्ष कर रहे हैं, तो मेरे फ़ंक्शन का उपयोग करने का प्रयास करें:

 - (UIView*)putView:(UIView*)view insideShadowWithColor:(UIColor*)color andRadius:(CGFloat)shadowRadius andOffset:(CGSize)shadowOffset andOpacity:(CGFloat)shadowOpacity { CGRect shadowFrame; // Modify this if needed shadowFrame.size.width = 0.f; shadowFrame.size.height = 0.f; shadowFrame.origin.x = 0.f; shadowFrame.origin.y = 0.f; UIView * shadow = [[UIView alloc] initWithFrame:shadowFrame]; shadow.userInteractionEnabled = NO; // Modify this if needed shadow.layer.shadowColor = color.CGColor; shadow.layer.shadowOffset = shadowOffset; shadow.layer.shadowRadius = shadowRadius; shadow.layer.masksToBounds = NO; shadow.clipsToBounds = NO; shadow.layer.shadowOpacity = shadowOpacity; [view.superview insertSubview:shadow belowSubview:view]; [shadow addSubview:view]; return shadow; } 

इसे अपने विचार पर कॉल करें चाहे आपके विचार के किनारों को गोल हो जाए, चाहे उसका आकार, इसका आकार, इसका आकार – एक अच्छी छाया तैयार की जाएगी।

फ़ंक्शन का रिटर्न वैल्यू अभी रखिए, जब आप तालिका को निकालना चाहते हैं (या उदाहरण के लिए insertSubview:aboveView: करें insertSubview:aboveView:

एडीई के उत्तर के आधार पर सरल स्विफ्ट 3.2 / 4 समाधान, बिना किसी अतिरिक्त उप-दृश्य, उप-क्लासिंग या अतिरिक्त नगण्य:

 extension UIView { func addShadow(offset: CGSize, color: UIColor, radius: CGFloat, opacity: Float) { let layer = self.layer layer.masksToBounds = false layer.shadowOffset = offset layer.shadowColor = color.cgColor layer.shadowRadius = radius layer.shadowOpacity = opacity let backgroundCGColor = self.backgroundColor?.cgColor self.backgroundColor = nil layer.backgroundColor = backgroundCGColor } } 

नोट करें कि आपको addShadow कॉल करने से पहले कोने के त्रिज्या और अन्य गुणों के साथ अपना दृश्य सेट करना चाहिए।

इसे सीधे viewDidLoad से इस तरह कॉल करें:

 btnBottom.addShadow(offset: CGSize.init(width: 0, height: 3), color: UIColor.black, radius: 2.0, opacity: 0.35) 

अंतिम परिणाम:

परिणाम

सुपर आसान और सरल!

मैंने UIView पर सहायक बनाया है

 @interface UIView (Helper) - (void)roundCornerswithRadius:(float)cornerRadius andShadowOffset:(float)shadowOffset; @end 

आप इसे इस तरह से कॉल कर सकते हैं

 [self.view roundCornerswithRadius:5 andShadowOffset:5]; 

यहाँ कार्यान्वयन है

 - (void)roundCornerswithRadius:(float)cornerRadius andShadowOffset:(float)shadowOffset { const float CORNER_RADIUS = cornerRadius; const float SHADOW_OFFSET = shadowOffset; const float SHADOW_OPACITY = 0.5; const float SHADOW_RADIUS = 3.0; UIView *superView = self.superview; CGRect oldBackgroundFrame = self.frame; [self removeFromSuperview]; CGRect frameForShadowView = CGRectMake(0, 0, oldBackgroundFrame.size.width, oldBackgroundFrame.size.height); UIView *shadowView = [[UIView alloc] initWithFrame:frameForShadowView]; [shadowView.layer setShadowOpacity:SHADOW_OPACITY]; [shadowView.layer setShadowRadius:SHADOW_RADIUS]; [shadowView.layer setShadowOffset:CGSizeMake(SHADOW_OFFSET, SHADOW_OFFSET)]; [self.layer setCornerRadius:CORNER_RADIUS]; [self.layer setMasksToBounds:YES]; [shadowView addSubview:self]; [superView addSubview:shadowView]; } 

छाया के साथ गोल कोने वाले दृश्य के एक पूरे दिन के शोध के बाद, मुझे यहां अपने कस्टम यूविव क्लास पोस्ट करने में खुशी हो रही है, इस प्रश्न को समाप्त करने की आशा है:

RoundCornerShadowView.h

 #import <UIKit/UIKit.h> @interface RoundCornerShadowView : UIView @end 

RoundCornerShadowView.m

 #import "RoundCornerShadowView.h" @implementation RoundCornerShadowView // *** must override this method, not the other method *** // otherwise, the background corner doesn't disappear.... // @2015/05/29 -(void) layoutSubviews { [super layoutSubviews];//is must to ensure rightly layout children view //1. first, create Inner layer with content CALayer *innerView = [CALayer layer]; innerView.frame = CGRectMake(0,0,self.bounds.size.width,self.bounds.size.height); //instead of: innerView.frame = self.frame; innerView.borderWidth = 1.0f; innerView.cornerRadius = 6.0f; innerView.masksToBounds = YES; innerView.borderColor = [[UIColor lightGrayColor] CGColor]; innerView.backgroundColor = [[UIColor whiteColor] CGColor]; //put the layer to the BOTTOM of layers is also a MUST step... //otherwise this layer will overlay the sub uiviews in current uiview... [self.layer insertSublayer:innerView atIndex:0]; //2. then, create shadow with self layer self.layer.masksToBounds = NO; self.layer.shadowColor = [[UIColor darkGrayColor] CGColor]; self.layer.shadowOpacity = 0.4f; //shadow length self.layer.shadowRadius = 2.0f; //no offset self.layer.shadowOffset = CGSizeMake(0, 0); //right down shadow //[self.layer setShadowOffset: CGSizeMake(1.0f, 1.0f)]; //3. last but important, MUST clear current view background color, or the color will show in the corner! self.backgroundColor = [UIColor clearColor]; } @end 

इसलिए, किसी दृश्य को देखने या नीचे में उपदृश्य जोड़ने की आवश्यकता नहीं है, बस वर्तमान दृश्य में एक परत जोड़ें और इसे पूरा करने के लिए 3 कदम करें!

कोड में टिप्पणियों पर एक करीब से देखो, यह घटक को समझने के लिए उपयोगी है!

छाया + सीमा + कोने त्रिज्या यहां छवि विवरण दर्ज करें

  scrollview.backgroundColor = [UIColor whiteColor]; CALayer *ScrlViewLayer = [scrollview layer]; [ScrlViewLayer setMasksToBounds:NO ]; [ScrlViewLayer setShadowColor:[[UIColor lightGrayColor] CGColor]]; [ScrlViewLayer setShadowOpacity:1.0 ]; [ScrlViewLayer setShadowRadius:6.0 ]; [ScrlViewLayer setShadowOffset:CGSizeMake( 0 , 0 )]; [ScrlViewLayer setShouldRasterize:YES]; [ScrlViewLayer setCornerRadius:5.0]; [ScrlViewLayer setBorderColor:[UIColor lightGrayColor].CGColor]; [ScrlViewLayer setBorderWidth:1.0]; [ScrlViewLayer setShadowPath:[UIBezierPath bezierPathWithRect:scrollview.bounds].CGPath]; 

स्विफ्ट 3 और IBInspectable समाधान:
एडी के समाधान से प्रेरित

सबसे पहले, एक UIView एक्सटेंशन बनाएं:

 // // UIView-Extension.swift // import Foundation import UIKit @IBDesignable extension UIView { // Shadow @IBInspectable var shadow: Bool { get { return layer.shadowOpacity > 0.0 } set { if newValue == true { self.addShadow() } } } fileprivate func addShadow(shadowColor: CGColor = UIColor.black.cgColor, shadowOffset: CGSize = CGSize(width: 3.0, height: 3.0), shadowOpacity: Float = 0.35, shadowRadius: CGFloat = 5.0) { let layer = self.layer layer.masksToBounds = false layer.shadowColor = shadowColor layer.shadowOffset = shadowOffset layer.shadowRadius = shadowRadius layer.shadowOpacity = shadowOpacity layer.shadowPath = UIBezierPath(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath let backgroundColor = self.backgroundColor?.cgColor self.backgroundColor = nil layer.backgroundColor = backgroundColor } // Corner radius @IBInspectable var circle: Bool { get { return layer.cornerRadius == self.bounds.width*0.5 } set { if newValue == true { self.cornerRadius = self.bounds.width*0.5 } } } @IBInspectable var cornerRadius: CGFloat { get { return self.layer.cornerRadius } set { self.layer.cornerRadius = newValue } } // Borders // Border width @IBInspectable public var borderWidth: CGFloat { set { layer.borderWidth = newValue } get { return layer.borderWidth } } // Border color @IBInspectable public var borderColor: UIColor? { set { layer.borderColor = newValue?.cgColor } get { if let borderColor = layer.borderColor { return UIColor(cgColor: borderColor) } return nil } } } 

उसके बाद, बस UIView का चयन करें इंटरफ़ेस बिल्डर सेटिंग छाया और कोने त्रिज्या में , नीचे की तरह:

अपने UIView का चयन

छाया पर और कोने त्रिज्या सेट करना

परिणाम!

परिणाम

ठीक है, अगर आप अपने निबों को बदलना और पदानुक्रम को देखने के लिए नहीं चाहते हैं जैसे डेविड सी। यह तरीका आपके लिए यह करेगा। अपने UIImageView को गोलाकार कोनों और छाया जोड़ने के लिए बस इस विधि का उपयोग करें, उदाहरण के लिए:

 [Utils roundCornersForImageView:myImageView withCornerRadius:6.0 andShadowOffset:2.0]; 

(!) निष्पादन के कारणों से मुझे नहीं लगता कि यह कोड यूआईटेबल वीव जैसे कुछ में उपयोग करने का अच्छा विचार है, क्योंकि यह कोड परिवर्तन पदानुक्रम बदलता है। इसलिए मैं अपने निब को बदलने और छाया प्रभाव के लिए एक कंटेनर दृश्य जोड़ने और Davic सी कोड का उपयोग करने का सुझाव देगा।

 + (void)roundCornersForImageView:(UIImageView *)imageView withCornerRadius:(float)cornerRadius andShadowOffset:(float)shadowOffset { const float CORNER_RADIUS = cornerRadius; const float BORDER_WIDTH = 1.0; const float SHADOW_OFFSET = shadowOffset; const float SHADOW_OPACITY = 0.8; const float SHADOW_RADIUS = 3.0; //Our old image now is just background image view with shadow UIImageView *backgroundImageView = imageView; UIView *superView = backgroundImageView.superview; //Make wider actual visible rect taking into account shadow //offset CGRect oldBackgroundFrame = backgroundImageView.frame; CGRect newBackgroundFrame = CGRectMake(oldBackgroundFrame.origin.x, oldBackgroundFrame.origin.y, oldBackgroundFrame.size.width + SHADOW_OFFSET, oldBackgroundFrame.size.height + SHADOW_OFFSET); [backgroundImageView removeFromSuperview]; backgroundImageView.frame = newBackgroundFrame; //Make new UIImageView with rounded corners and put our old image CGRect frameForRoundedImageView = CGRectMake(0, 0, oldBackgroundFrame.size.width, oldBackgroundFrame.size.height); UIImageView *roundedImageView = [[UIImageView alloc]initWithFrame:frameForRoundedImageView]; roundedImageView.image = imageView.image; [roundedImageView.layer setCornerRadius:CORNER_RADIUS]; [roundedImageView.layer setBorderColor:[UIColor lightGrayColor].CGColor]; [roundedImageView.layer setBorderWidth:BORDER_WIDTH]; [roundedImageView.layer setMasksToBounds:YES]; //Set shadow preferences [backgroundImageView setImage:nil]; [backgroundImageView.layer setShadowColor:[UIColor blackColor].CGColor]; [backgroundImageView.layer setShadowOpacity:SHADOW_OPACITY]; [backgroundImageView.layer setShadowRadius:SHADOW_RADIUS]; [backgroundImageView.layer setShadowOffset:CGSizeMake(SHADOW_OFFSET, SHADOW_OFFSET)]; //Add out two image views back to the view hierarchy. [backgroundImageView addSubview:roundedImageView]; [superView addSubview:backgroundImageView]; } 

पुराना धागा अभी भी चालू है …

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

 + (UIView*)putView:(UIView*)view insideShadowWithColor:(CGColorRef)color andRadius:(CGFloat)shadowRadius andOffset:(CGSize)shadowOffset andOpacity:(CGFloat)shadowOpacity { // Must have same position like "view" UIView *shadow = [[UIView alloc] initWithFrame:view.frame]; shadow.layer.contentsScale = [UIScreen mainScreen].scale; shadow.userInteractionEnabled = YES; // Modify this if needed shadow.layer.shadowColor = color; shadow.layer.shadowOffset = shadowOffset; shadow.layer.shadowRadius = shadowRadius; shadow.layer.masksToBounds = NO; shadow.clipsToBounds = NO; shadow.layer.shadowOpacity = shadowOpacity; shadow.layer.rasterizationScale = [UIScreen mainScreen].scale; shadow.layer.shouldRasterize = YES; [view.superview insertSubview:shadow belowSubview:view]; [shadow addSubview:view]; // Move view to the top left corner inside the shadowview // ---> Buttons etc are working again :) view.frame = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height); return shadow; } 

यहां मुखौटे के समाधान के लिए संघर्ष समस्या है, यह मेरे लिए काम करता है

आपके द्वारा सीरस त्रिज्या / सीमा रंग / छाया और इतने पर सेट करने के बाद, सेट मास्क टोबाउंड नहीं:

 v.layer.masksToBounds = NO; 

निम्नलिखित मेरे लिए सर्वोत्तम काम किया है (यह कोड UIView एक्सटेंशन में है, इसलिए स्वयं कुछ UIView को दर्शाता है जिसके लिए हमें एक छाया और गोल कोने जोड़ना होगा)

 - (void)addShadowViewWithCornerRadius:(CGFloat)radius { UIView *container = self.superview; if (!container) { return; } UIView *shadowView = [[UIView alloc] init]; shadowView.translatesAutoresizingMaskIntoConstraints = NO; shadowView.backgroundColor = [UIColor lightGrayColor]; shadowView.layer.cornerRadius = radius; shadowView.layer.masksToBounds = YES; [container addSubview:shadowView]; [container bringSubviewToFront:shadowView]; [container addConstraint:[NSLayoutConstraint constraintWithItem:shadowView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]]; [container addConstraint:[NSLayoutConstraint constraintWithItem:shadowView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0 constant:2.0]]; [container addConstraint:[NSLayoutConstraint constraintWithItem:shadowView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0]]; [container addConstraint:[NSLayoutConstraint constraintWithItem:shadowView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:2.0]]; [container sendSubviewToBack:shadowView]; } 

इस और अन्य कोड के नमूने के बीच मुख्य अंतर यह है कि यह छाया व्यू को एक भाई दृश्य के रूप में दिखाता है (मौजूदा दृश्य को छाया दृश्य के रूप में देखने के बजाय), जिससे किसी भी तरह से मौजूदा दृश्य पदानुक्रम को संशोधित करने की आवश्यकता को नष्ट कर दिया जा सकता है।

ऊपर daniel.gindi के जवाब मेरे लिए चाल किया! (+1 डैनियल) हालांकि, मुझे मामूली समायोजन करना पड़ा – छाया फ्रेम आकार को देखने के फ्रेम आकार के समान होना चाहिए और उपयोगकर्ता इंटरैक्शन को सक्षम करना होगा। यहां अद्यतन कोड है:

 + (UIView*)putView:(UIView*)view insideShadowWithColor:(UIColor*)color andRadius:(CGFloat)shadowRadius andOffset:(CGSize)shadowOffset andOpacity:(CGFloat)shadowOpacity { CGRect shadowFrame; // Modify this if needed // Modified this line shadowFrame.size = CGSizeMake(view.frame.size.width, view.frame.size.height); shadowFrame.origin.x = 0.f; shadowFrame.origin.y = 0.f; UIView * shadow = [[UIView alloc] initWithFrame:shadowFrame]; // Modified this line shadow.userInteractionEnabled = YES; shadow.layer.shadowColor = color.CGColor; shadow.layer.shadowOffset = shadowOffset; shadow.layer.shadowRadius = shadowRadius; shadow.layer.masksToBounds = NO; shadow.clipsToBounds = NO; shadow.layer.shadowOpacity = shadowOpacity; [shadow addSubview:view]; return shadow; } 

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

 UIView *shadow = [self putView:vc.view insideShadowWithColor:[UIColor blackColor] andRadius:5.0 andOffset:CGSizeMake(0.0, 0.0) andOpacity:1.0]; vc.view = shadow; vc.view.layer.cornerRadius = 5.0; vc.view.layer.masksToBounds = YES; 

मैं daniel.gindi के कोड में कुछ बदलाव करता हूं

यह आपको काम करने की आवश्यकता है।

 + (void)putView:(UIView*)view insideShadowWithColor:(UIColor*)color andBlur: (CGFloat)blur andOffset:(CGSize)shadowOffset andOpacity:(CGFloat)shadowOpacity { CGRect shadowFrame = view.frame; UIView * shadow = [[UIView alloc] initWithFrame:shadowFrame]; shadow.backgroundColor = [UIColor redColor]; shadow.userInteractionEnabled = YES; // Modify this if needed shadow.layer.shadowColor = color.CGColor; shadow.layer.shadowOffset = shadowOffset; shadow.layer.shadowRadius = blur; shadow.layer.cornerRadius = view.layer.cornerRadius; shadow.layer.masksToBounds = NO; shadow.clipsToBounds = NO; shadow.layer.shadowOpacity = shadowOpacity; [view.superview insertSubview:shadow belowSubview:view]; } 

यहां एक UIView के लिए स्विफ्ट 3 में मेरा संस्करण है

 let corners:UIRectCorner = [.bottomLeft, .topRight] let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.cgPath mask.fillColor = UIColor.white.cgColor let shadowLayer = CAShapeLayer() shadowLayer.shadowColor = UIColor.black.cgColor shadowLayer.shadowOffset = CGSize(width: 0.0, height: 4.0) shadowLayer.shadowRadius = 6.0 shadowLayer.shadowOpacity = 0.25 shadowLayer.shadowPath = mask.path self.layer.insertSublayer(shadowLayer, at: 0) self.layer.insertSublayer(mask, at: 1) 

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

 - (void)addShadowWithRadius:(CGFloat)shadowRadius withOpacity:(CGFloat)shadowOpacity withOffset:(CGSize)shadowOffset withColor:(UIColor *)shadowColor withCornerradius:(CGFloat)cornerRadius { UIView *viewShadow = [[UIView alloc]initWithFrame:self.frame]; viewShadow.backgroundColor = [UIColor whiteColor]; viewShadow.layer.shadowColor = shadowColor.CGColor; viewShadow.layer.shadowOffset = shadowOffset; viewShadow.layer.shadowRadius = shadowRadius; viewShadow.layer.shadowOpacity = shadowOpacity; viewShadow.layer.cornerRadius = cornerRadius; viewShadow.layer.masksToBounds = NO; [self.superview insertSubview:viewShadow belowSubview:self]; [viewShadow setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:viewShadow attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0]]; [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:viewShadow attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0]]; [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:viewShadow attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:viewShadow attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]]; [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:viewShadow attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:viewShadow attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]]; [self layoutIfNeeded]; self.layer.cornerRadius = cornerRadius; self.layer.masksToBounds = YES; } 

इवान मुलोवस्की द्वारा दिए गए उत्तर पूरी तरह से काम करेंगे। पकड़ यह है कि आपको दृश्य के लिए पृष्ठभूमि का रंग सेट करना होगा और मास्क टू-बॉट्स संपत्ति को NO के लिए सेट करना होगा।

आप दृश्य के लिए जो भी रंग चाहते हैं उसे सेट कर सकते हैं, इसे सेट करें

 v.layer.backgroundColor = your color; 

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

आपको इसे प्राप्त करने के लिए दो UIViews का उपयोग करना होगा। एक UIView छाया की तरह काम करेगा और अन्य एक गोल सीमा के लिए काम करेंगे।

protocol की मदद से Class Method को कोड स्निपेट दिया गया है:

 @implementation UIMethods + (UIView *)genComposeButton:(UIViewController <UIComposeButtonDelegate> *)observer; { UIView *shadow = [[UIView alloc]init]; shadow.layer.cornerRadius = 5.0; shadow.layer.shadowColor = [[UIColor blackColor] CGColor]; shadow.layer.shadowOpacity = 1.0; shadow.layer.shadowRadius = 10.0; shadow.layer.shadowOffset = CGSizeMake(0.0f, -0.5f); UIButton *btnCompose = [[UIButton alloc]initWithFrame:CGRectMake(0, 0,60, 60)]; [btnCompose setUserInteractionEnabled:YES]; btnCompose.layer.cornerRadius = 30; btnCompose.layer.masksToBounds = YES; [btnCompose setImage:[UIImage imageNamed:@"60x60"] forState:UIControlStateNormal]; [btnCompose addTarget:observer action:@selector(btnCompose_click:) forControlEvents:UIControlEventTouchUpInside]; [shadow addSubview:btnCompose]; return shadow; } 

btnCompose_click: ऊपर कोड में btnCompose_click: एक @required प्रतिनिधि विधि बन जाएगी जो बटन क्लिक पर आग @required

और यहाँ मैंने इस तरह मेरे UIViewController को एक बटन जोड़ा:

 UIView *btnCompose = [UIMethods genComposeButton:self]; btnCompose.frame = CGRectMake(self.view.frame.size.width - 75, self.view.frame.size.height - 75, 60, 60); [self.view addSubview:btnCompose]; 

The result will look like this:

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

This is how you do it, with rounded corners and rounded shadows without bothering with paths.

 //Inner view with content [imageView.layer setBorderColor:[[UIColor lightGrayColor] CGColor]]; [imageView.layer setBorderWidth:1.0f]; [imageView.layer setCornerRadius:8.0f]; [imageView.layer setMasksToBounds:YES]; //Outer view with shadow UIView* shadowContainer = [[UIView alloc] initWithFrame:imageView.frame]; [shadowContainer.layer setMasksToBounds:NO]; [shadowContainer.layer setShadowColor:[[UIColor blackColor] CGColor]]; [shadowContainer.layer setShadowOpacity:0.6f]; [shadowContainer.layer setShadowRadius:2.0f]; [shadowContainer.layer setShadowOffset: CGSizeMake(0.0f, 2.0f)]; [shadowContainer addSubview:imageView]; 

The view with content, in my case a UIImageView, has a corner radius and therefore has to mask to bounds.

We create another equally sized view for the shadows, set it's maskToBounds to NO and then add the content view to the container view (eg shadowContainer).

I write this UIView category method to solve this problem, uses separate views for the shadow and the corner radius.

 -(UIView *)shadowedWrapViewWithBounds:(CGRect)bounds { UIView *baseView = [[UIView alloc] init]; baseView.bounds = bounds; baseView.backgroundColor = [UIColor clearColor]; baseView.layer.shadowColor = [UIColor blackColor].CGColor; baseView.layer.shadowOffset = CGSizeMake(0, 0); baseView.layer.shadowOpacity = 0.7; baseView.layer.shadowRadius = 4.0; // improve performance baseView.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:baseView.bounds cornerRadius:4].CGPath; baseView.layer.shouldRasterize = YES; baseView.layer.rasterizationScale = [UIScreen mainScreen].scale; [baseView addSubview:self]; //use Masonry autolayout, self can set corner radius [self makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(baseView); }]; return baseView; } 

You need to use use shadowView and roundView

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

shadowView

  • Must has background color
  • Should lay behind roundView
  • The trick is to layout shadowView a bit inside, and its shadow needs to glow out. Adjust the insets so that shadowView is completely invisible behind roundView

roundView

  • Must clips subviews

कोड

 addSubviews(shadowView, roundView) roundView.addSubviews(titleLabel, subtitleLabel, imageView) // need inset shadowView.pinEdges(view: self, inset: UIEdgeInsets(constraintInsets: 2)) roundView.pinEdges(view: self) do { shadowView.backgroundColor = .white // need background let layer = shadowView.layer layer.shadowColor = UIColor.black.cgColor layer.shadowRadius = 3 layer.shadowOffset = CGSize(width: 3, height: 3) layer.shadowOpacity = 0.7 layer.shouldRasterize = true } do { roundView.backgroundColor = .white let layer = roundView.layer layer.masksToBounds = true layer.cornerRadius = 5 } 

You need add masksToBounds = true for combined between corderRadius shadowRadius .

 button.layer.masksToBounds = false; 

Swift 4 : Create Subclass of UIView

 class ShadowView: UIView { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) // corner radius self.layer.cornerRadius = 10 // border self.layer.borderWidth = 1.0 self.layer.borderColor = UIColor.black.cgColor // shadow self.layer.shadowColor = UIColor.black.cgColor self.layer.shadowOffset = CGSize(width: 3, height: 3) self.layer.shadowOpacity = 0.7 self.layer.shadowRadius = 4.0 } } 

Using..

Use Class Shadow View