2016-06-29 46 views
4

enter image description here 我想模糊像第一個圖像。如何使精確模糊

enter image description here

我也做了一些代碼,並使它像第二圖像。

我的代碼對於模糊像

let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) 
    blurEffectView = UIVisualEffectView(effect: blurEffect) 
    blurEffectView.layer.opacity = 0.8 
    blurEffectView.alpha = 0.6 
    blurEffectView.frame = CGRectMake(0, 42, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height - 42) 
    sourceView.addSubview(blurEffectView) 

Sourceview是我的背景圖。我想讓模糊。任何建議?

+0

嘗試在他GitHub的項目找到更多的細節。也嘗試使用不同的UIBlurEffectStyle –

+0

@Lalit庫馬爾第一我試過這個沒有不透明度和alpha,但不能看到背景視圖。然後我做到了。還嘗試了額外的光線和光線模糊效果。 – Jecky

+0

我不認爲你除了設置模糊效果視圖框架之外沒有任何錯誤。你應該使用'blueEffectView.frame = sourceView.frame'。也嘗試使用活力 –

回答

1

阿爾法和layer.opacity修正是沒有必要的,你可以用一個擴展做到這一點也:

extension UIImageView{ 
     func makeBlurImage(imageView:UIImageView?) 
     { 
      let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) 
      let blurEffectView = UIVisualEffectView(effect: blurEffect) 
      blurEffectView.frame = imageView!.bounds 
      blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] // to support device rotation 
      imageView?.addSubview(blurEffectView) 
     } 
    } 

使用

let imageView = UIImageView(frame: CGRectMake(0, 100, 300, 400)) 
    let image:UIImage = UIImage(named: "photo.png")! 
    imageView.image = image 
    //Apply blur effect 
    imageView.makeBlurImage(imageView) 
    self.view.addSubview(imageView) 

但是,如果你想申請的您可以使用此代碼:

protocol Blurable 
{ 
    var layer: CALayer { get } 
    var subviews: [UIView] { get } 
    var frame: CGRect { get } 
    var superview: UIView? { get } 

    func addSubview(view: UIView) 
    func removeFromSuperview() 

    func blur(blurRadius blurRadius: CGFloat) 
    func unBlur() 

    var isBlurred: Bool { get } 
} 

extension Blurable 
{ 
    func blur(blurRadius blurRadius: CGFloat) 
    { 
     if self.superview == nil 
     { 
      return 
     } 

     UIGraphicsBeginImageContextWithOptions(CGSize(width: frame.width, height: frame.height), false, 1) 

     layer.renderInContext(UIGraphicsGetCurrentContext()!) 

     let image = UIGraphicsGetImageFromCurrentImageContext() 

     UIGraphicsEndImageContext(); 

     guard let blur = CIFilter(name: "CIGaussianBlur"), 
      this = self as? UIView else 
     { 
      return 
     } 

     blur.setValue(CIImage(image: image), forKey: kCIInputImageKey) 
     blur.setValue(blurRadius, forKey: kCIInputRadiusKey) 

     let ciContext = CIContext(options: nil) 

     let result = blur.valueForKey(kCIOutputImageKey) as! CIImage! 

     let boundingRect = CGRect(x:0, 
      y: 0, 
      width: frame.width, 
      height: frame.height) 

     let cgImage = ciContext.createCGImage(result, fromRect: boundingRect) 

     let filteredImage = UIImage(CGImage: cgImage) 

     let blurOverlay = BlurOverlay() 
     blurOverlay.frame = boundingRect 

     blurOverlay.image = filteredImage 
     blurOverlay.contentMode = UIViewContentMode.Left 

     if let superview = superview as? UIStackView, 
      index = (superview as UIStackView).arrangedSubviews.indexOf(this) 
     { 
      removeFromSuperview() 
      superview.insertArrangedSubview(blurOverlay, atIndex: index) 
     } 
     else 
     { 
      blurOverlay.frame.origin = frame.origin 

      UIView.transitionFromView(this, 
       toView: blurOverlay, 
       duration: 0.2, 
       options: UIViewAnimationOptions.CurveEaseIn, 
       completion: nil) 
     } 

     objc_setAssociatedObject(this, 
      &BlurableKey.blurable, 
      blurOverlay, 
      objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
    } 

    func unBlur() 
    { 
     guard let this = self as? UIView, 
      blurOverlay = objc_getAssociatedObject(self as? UIView, &BlurableKey.blurable) as? BlurOverlay else 
     { 
      return 
     } 

     if let superview = blurOverlay.superview as? UIStackView, 
      index = (blurOverlay.superview as! UIStackView).arrangedSubviews.indexOf(blurOverlay) 
     { 
      blurOverlay.removeFromSuperview() 
      superview.insertArrangedSubview(this, atIndex: index) 
     } 
     else 
     { 
      this.frame.origin = blurOverlay.frame.origin 

      UIView.transitionFromView(blurOverlay, 
       toView: this, 
       duration: 0.2, 
       options: UIViewAnimationOptions.CurveEaseIn, 
       completion: nil) 
     } 

     objc_setAssociatedObject(this, 
      &BlurableKey.blurable, 
      nil, 
      objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
    } 

    var isBlurred: Bool 
    { 
     return objc_getAssociatedObject(self as? UIView, &BlurableKey.blurable) is BlurOverlay 
    } 
} 

extension UIView: Blurable 
{ 
} 

class BlurOverlay: UIImageView 
{ 
} 

struct BlurableKey 
{ 
    static var blurable = "blurable" 
} 

用法是例如:

segmentedControl.unBlur() 
segmentedControl.blur(blurRadius: 2) 

這是項目Blurable的來源。

可以消除不透明度和Alpha值後here