2015-03-13 15 views
20

हाय आई सोच रहा है कि क्या UIVisualEffectView पर कोने त्रिज्या सेट करना संभव है?UIVisualEffectView पर कॉर्नर त्रिज्या

@IBOutlet var blurView: UIVisualEffectView! 

var blurLayer : CALayer{ 
    return blurView.layer 
} 
override func viewDidLoad() { 
    super.viewDidLoad() 
    setUpLayer() 
    // Do any additional setup after loading the view. 
} 

func setUpLayer(){ 
    blurLayer.cornerRadius = 50 
} 

और

उनमें से
@IBOutlet var blurView: UIVisualEffectView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    blurView.layer.cornerRadius = 50 
    // Do any additional setup after loading the view. 
} 

गैर काम करता है: यहाँ कोड है कि मैं कोशिश की है है।

+10

तुम कोशिश 'blurView.clipsToBounds = सच' था? –

+0

धन्यवाद एक आकर्षण की तरह काम किया! –

+1

@ माइकएम शायद आपको इसे उत्तर में रखना चाहिए? – Oxcug

उत्तर

3

उपवर्ग UIVisualEffectView

class PSORoundedVisualEffectView : UIVisualEffectView{ 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     updateMaskLayer() 
    } 

    func updateMaskLayer(){ 
     let shapeLayer = CAShapeLayer() 
     shapeLayer.path = UIBezierPath(roundedRect: self.bounds, cornerRadius: 10).CGPath 
     self.layer.mask = shapeLayer 
    } 
} 

जो कुछ भी आकार आप चाहते हैं के साथ UIBezierPath बदलें।

+0

धन्यवाद! यह वास्तव में अच्छी तरह से काम करता है। लेकिन सिर्फ एक विस्तार करना आसान होगा। –

27

@theMonster सुझाव के बाद, मैं एक टिप्पणी क्या पोस्ट कर रहा हूं पोस्ट कर रहा हूं।

override func viewDidLoad() { 
    super.viewDidLoad() 
    blurView.layer.cornerRadius = 50 
    blurView.clipsToBounds = true 
} 
3

सभी अस्तित्व समाधान सही नहीं हैं।

UIVisualEffectView के बाद से दो subviews सामग्री संयोजन द्वारा अपने दृश्य प्रभाव लागू करता है - एक एक पृष्ठभूमि के दृश्य और दूसरा एक फिल्टर देखने के लिए, जब आप पूरे UIVisualEffectView मास्किंग करके अपने कोने की त्रिज्या को लागू करने, वहाँ चारों कोनों कुछ गंदा रंग होगा ।

Dirty Colors Around Corners

इन गंदे रंग से छुटकारा पाने के लिए, आप केवल UIVisualEffects के फ़िल्टर दृश्य मुखौटा की जरूरत है।

private typealias ObjcRawUIVisualEffectViewSelCGRect = 
    @convention(c) (UIVisualEffectView, Selector, CGRect) -> Void 

private var cornerRadiusKey = 
"com.WeZZard.Waxing.UIVisualEffectView-CornerRadius.cornerRadius" 

private var needsUpdateMaskLayerKey = 
"com.WeZZard.Waxing.UIVisualEffectView-CornerRadius.needsUpdateMaskLayer" 

extension UIVisualEffectView { 
    public var cornerRadius: CGFloat { 
     get { 
      if let storedValue = objc_getAssociatedObject(self, 
       &cornerRadiusKey) 
       as? CGFloat 
      { 
       return storedValue 
      } 
      return 0 
     } 
     set { 
      if cornerRadius != newValue { 
       objc_setAssociatedObject(self, 
        &cornerRadiusKey, 
        newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
       setNeedsUpdateMaskLayer() 
      } 
     } 
    } 

    private var needsUpdateMaskLayer: Bool { 
     get { 
      if let storedValue = objc_getAssociatedObject(self, 
       &needsUpdateMaskLayerKey) 
       as? Bool 
      { 
       return storedValue 
      } 
      return false 
     } 
     set { 
      objc_setAssociatedObject(self, 
       &needsUpdateMaskLayerKey, 
       newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 


    public override class func initialize() { 
     swizzle_setBounds() 
    } 

    private class func swizzle_setBounds() { 
     struct Static { 
      static var token: dispatch_once_t = 0 
     } 

     dispatch_once(&Static.token) { 
      let selector: Selector = "setBounds:" 

      let method = class_getInstanceMethod(self, selector) 

      let imp_original = method_getImplementation(method) 

      before_setBounds = unsafeBitCast(imp_original, 
       ObjcRawUIVisualEffectViewSelCGRect.self) 

      class_replaceMethod(self, 
       selector, 
       unsafeBitCast(after_setBounds, IMP.self), 
       "@:{_struct=CGRect}") 
     } 
    } 

    private func setNeedsUpdateMaskLayer() { 
     needsUpdateMaskLayer = true 
     NSOperationQueue.mainQueue().addOperationWithBlock { [weak self] _ in 
      self?.updateMaskLayerIfNeeded() 
     } 
    } 

    private func updateMaskLayerIfNeeded() { 
     if needsUpdateMaskLayer { 
      updateMaskLayer() 
      needsUpdateMaskLayer = false 
     } 
    } 

    private func updateMaskLayer(){ 
     var filterViewFound = false 
     for each in subviews { 
      if each.dynamicType.description() 
       .containsString("Filter") 
      { 
       filterViewFound = true 
       let newPath = UIBezierPath(roundedRect: each.bounds, 
        cornerRadius: self.cornerRadius) 
        .CGPath 
       if let existedMask = each.layer.mask 
        as? CAShapeLayer 
       { 
        existedMask.path = newPath 
       } else { 
        let shapeLayer = CAShapeLayer() 
        shapeLayer.path = newPath 
        each.layer.mask = shapeLayer 
       } 
      } else { 
       setNeedsUpdateMaskLayer() 
      } 
     } 
     assert(filterViewFound == true, "Filter view was not found! Check your hacking!") 
    } 
} 

private var before_setBounds: ObjcRawUIVisualEffectViewSelCGRect = { _ in 
    fatalError("No implementation found") 
} 

private let after_setBounds: ObjcRawUIVisualEffectViewSelCGRect = { 
    (aSelf, selector, bounds) -> Void in 

    let oldBounds = aSelf.bounds 

    before_setBounds(aSelf, selector, bounds) 

    if oldBounds.size != bounds.size { 
     aSelf.setNeedsUpdateMaskLayer() 
    } 
} 

और सभी चीजें हुईं!

Without Dirty Colors

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