2016-09-21 12 views
17

पूर्व तेज 3 मैं जोड़ने था छाया का उपयोग कर मेरी UIView में इस तरह UIView पर छाया जोड़ें:तेज 3

//toolbar is an UIToolbar (UIView) 
toolbar.layer.masksToBounds = false 
toolbar.layer.shadowOffset = CGSize(width: -1, height: 1) 
toolbar.layer.shadowRadius = 1 
toolbar.layer.shadowOpacity = 0.5 

लेकिन इसके बाद के संस्करण कोड तेजी से 3 में काम नहीं कर रहा, छाया के बजाय मेरे पूरे दृश्य का रंग बदल गया है बदसूरत ग्रे

कोई भी जानता है कि हम तेजी से छाया कैसे जोड़ सकते हैं?

उत्तर

73

कोड स्निपेट:

extension UIView { 

    // OUTPUT 1 
    func dropShadow(scale: Bool = true) { 
    layer.masksToBounds = false 
    layer.shadowColor = UIColor.black.cgColor 
    layer.shadowOpacity = 0.5 
    layer.shadowOffset = CGSize(width: -1, height: 1) 
    layer.shadowRadius = 1 

    layer.shadowPath = UIBezierPath(rect: bounds).cgPath 
    layer.shouldRasterize = true 
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1 
    } 

    // OUTPUT 2 
    func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) { 
    layer.masksToBounds = false 
    layer.shadowColor = color.cgColor 
    layer.shadowOpacity = opacity 
    layer.shadowOffset = offSet 
    layer.shadowRadius = radius 

    layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath 
    layer.shouldRasterize = true 
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1 
    } 
} 

नोट: आप कि समारोह के लिए किसी भी पैरामीटर उत्तीर्ण नहीं होते हैं, तो पैमाने तर्क डिफ़ॉल्ट रूप से सच हो जाएगा। आप पैरामीटर के प्रकार के बाद पैरामीटर को मान निर्दिष्ट करके फ़ंक्शन में किसी भी पैरामीटर के लिए डिफ़ॉल्ट मान परिभाषित कर सकते हैं। यदि कोई डिफ़ॉल्ट मान परिभाषित किया गया है, तो फ़ंक्शन को कॉल करते समय आप उस पैरामीटर को छोड़ सकते हैं।

आउटपुट 1:

shadowView.dropShadow() 

enter image description here

आउटपुट 2:

shadowView.dropShadow(color: .red, opacity: 1, offSet: CGSize(width: -1, height: 1), radius: 3, scale: true) 

enter image description here

+0

अगर मैं इस छाया निकालना चाहते हैं, कैसे मीटर मैं कि क्या करना चाहिए? –

+0

@SuhasPatil \t यदि आप छाया को हटाना चाहते हैं, तो आप इसे पहली जगह क्यों जोड़ रहे हैं? क्या आप कृपया अपने परिदृश्य को विस्तारित कर सकते हैं ताकि मैं आपको समाधान दे सकूं? –

+0

असल में सेल चयन के लिए छाया और अपहरण कोई छाया नहीं होगी –

24

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

extension UIView { 

    func dropShadow() { 

     self.layer.masksToBounds = false 
     self.layer.shadowColor = UIColor.black.cgColor 
     self.layer.shadowOpacity = 0.5 
     self.layer.shadowOffset = CGSize(width: -1, height: 1) 
     self.layer.shadowRadius = 1 

     self.layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath 
     self.layer.shouldRasterize = true 

     self.layer.rasterizationScale = UIScreen.main.scale 

    } 
} 
1

हालांकि accepted answer महान है और यह काम करता एकदम सही ढंग से, मैं इसे संशोधित किया offsetX: CGFloat और offsetY: CGFloat को offSet: CGSize विभाजित करने के लिए। कोड की

extension UIView { 
    func dropShadow(offsetX: CGFloat, offsetY: CGFloat, color: UIColor, opacity: Float, radius: CGFloat, scale: Bool = true) { 
    layer.masksToBounds = false 
    layer.shadowOffset = CGSize(width: offsetX, height: offsetY) 
    layer.shadowColor = color.cgColor 
    layer.shadowOpacity = opacity 
    layer.shadowRadius = radius 
    layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath 
    layer.shouldRasterize = true 
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1 
    } 
} 
0

बहुत ही सरल और कुछ पंक्तियां: तरह

let viewShadow = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200)) 
viewShadow.center = self.view.center 
viewShadow.backgroundColor = UIColor.yellow 
viewShadow.layer.shadowColor = UIColor.red.cgColor 
viewShadow.layer.shadowOpacity = 1 
viewShadow.layer.shadowOffset = CGSize.zero 
viewShadow.layer.shadowRadius = 5 
self.view.addSubview(viewShadow) 

देखो: enter image description here