Ios 如何在Swift中添加半径为2pt的模糊?

Ios 如何在Swift中添加半径为2pt的模糊?,ios,swift,uiblureffect,Ios,Swift,Uiblureffect,我想创造这样的东西: 我试过这个: var blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) var blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = view.bounds view.addSubview(blurEffectView) 但这会造成非常暗的模糊。但我需要精确的暗模糊(黑色),半径为2pt 我可以用Swif

我想创造这样的东西:

我试过这个:

var blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark)
var blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = view.bounds
view.addSubview(blurEffectView)
但这会造成非常暗的模糊。但我需要精确的暗模糊(黑色),半径为2pt


我可以用Swift实现吗?

您无法控制
UIVisualEffectView
的模糊半径。通过对要模糊的视图进行快照,并将CoreImage的“CIGaussianBlur”过滤器应用于该快照,然后在要模糊的视图正上方的
UIImageView
中显示模糊图像,可以实现所需的效果。使用
CIGaussianBlur
可以对任意长度应用模糊半径

您可以使用
ui视图
上的扩展名,使此操作更加方便:

extension UIView
{
    func snapshotView(scale scale: CGFloat = 0.0, isOpaque: Bool = true) -> UIImage
    {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, opaque, scale)
        self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }

    func blur(blurRadius blurRadius: CGFloat) -> UIImage?
    {
        guard let blur = CIFilter(name: "CIGaussianBlur") else { return nil }

        let image = self.snapshotView(scale: 1.0, isOpaque: true)
        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)

        return UIImage(CGImage: cgImage)
    }
}
然后可以添加半透明覆盖以确定模糊的暗度,例如:

let overlay = UIView()
overlay.frame = view.bounds
overlay.backgroundColor = UIColor(white: 0.0, alpha: 0.30)
viewIWantToBlur.addSubview(overlay)
let image = viewIWantToBlur.blur(blurRadius: 2.0)
imageView.image = image

有关此方法的更多信息和更健壮的工作示例,您可以看到,您应该意识到这是性能密集型的。

您无法控制
UIVisualEffectView
的模糊半径。通过对要模糊的视图进行快照,并将CoreImage的“CIGaussianBlur”过滤器应用于该快照,然后在要模糊的视图正上方的
UIImageView
中显示模糊图像,可以实现所需的效果。使用
CIGaussianBlur
可以对任意长度应用模糊半径

您可以使用
ui视图
上的扩展名,使此操作更加方便:

extension UIView
{
    func snapshotView(scale scale: CGFloat = 0.0, isOpaque: Bool = true) -> UIImage
    {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, opaque, scale)
        self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }

    func blur(blurRadius blurRadius: CGFloat) -> UIImage?
    {
        guard let blur = CIFilter(name: "CIGaussianBlur") else { return nil }

        let image = self.snapshotView(scale: 1.0, isOpaque: true)
        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)

        return UIImage(CGImage: cgImage)
    }
}
然后可以添加半透明覆盖以确定模糊的暗度,例如:

let overlay = UIView()
overlay.frame = view.bounds
overlay.backgroundColor = UIColor(white: 0.0, alpha: 0.30)
viewIWantToBlur.addSubview(overlay)
let image = viewIWantToBlur.blur(blurRadius: 2.0)
imageView.image = image

有关此方法的更多信息和更健壮的工作示例,您可以看到,您应该意识到这是性能密集型的。

如果您使用的是故事板,这里有一个简单的解决方法。 首先,您需要从图像、UIEW或uielement正上方的故事板添加一个“带模糊的视觉效果视图”。 现在绘制视觉效果视图的出口,如下所示:-

 @IBOutlet weak var blurredViewVisulaEffect: UIVisualEffectView!
并在viewDidLoad方法中添加这两行

let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light)
blurredViewVisulaEffect.effect = blurEffect
根据我们的要求操纵视图:- 现在,如果要自定义图像的模糊度,请从故事板更改UIVisualEffectView的alpha值。将alpha的值保持在0.5到0.8之间,以获得所需的模糊度。 如果您想更改视图的阴影/颜色,如您所述,介于明暗之间,则需要将UIVisualEffectView的背景色设置为黑色,并将其不透明度从100%更改为30%(或根据需要更改为40%)

然后在viewDidLoad()中将视图的边框设置为2 px,如下所示


如果您使用的是故事板,这里有一个简单的解决方法。 首先,您需要从图像、UIEW或uielement正上方的故事板添加一个“带模糊的视觉效果视图”。 现在绘制视觉效果视图的出口,如下所示:-

 @IBOutlet weak var blurredViewVisulaEffect: UIVisualEffectView!
并在viewDidLoad方法中添加这两行

let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light)
blurredViewVisulaEffect.effect = blurEffect
根据我们的要求操纵视图:- 现在,如果您想自定义图像的模糊性,那么从故事板中更改ui visualeffectView的alpha值。将alpha的值保持在0.5到0.8之间,以获得所需的模糊度。 如果您想更改视图的阴影/颜色,如您所述,介于明暗之间,则需要将UIVisualEffectView的背景色设置为黑色,并将其不透明度从100%更改为30%(或根据需要更改为40%)

然后在viewDidLoad()中将视图的边框设置为2 px,如下所示


要为UIVisualEffectView创建半径,请尝试以下操作:

然后指定半径:


要创建UIVisualEffectView的半径,请尝试以下操作:

然后指定半径:


可以使用ios专用API更改模糊半径。我为您提供了一个解决方案:

用法:

import CustomBlurEffectView

let customBlurEffectView = CustomBlurEffectView(
    radius: 20, // Set blur radius value. Defaults to `10` (CGFloat)
    color: .cyan, // Set tint color value. Defaults to `nil` (UIColor?)
    colorAlpha: 0.4 // Set tint color alpha value. Defaults to `0.8` (CGFloat)
)
customBlurEffectView.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
addSubview(customBlurEffectView)

可以使用ios专用API更改模糊半径。我为您提供了一个解决方案:

用法:

import CustomBlurEffectView

let customBlurEffectView = CustomBlurEffectView(
    radius: 20, // Set blur radius value. Defaults to `10` (CGFloat)
    color: .cyan, // Set tint color value. Defaults to `nil` (UIColor?)
    colorAlpha: 0.4 // Set tint color alpha value. Defaults to `0.8` (CGFloat)
)
customBlurEffectView.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
addSubview(customBlurEffectView)

你喜欢什么样的风格?光线?@Joakim但这是白色模糊。我需要一个黑色的,正好显示你需要的。@DharmeshKheni我添加了截图。在.Dark blur的例子中,我得到了这个:,但我想要更浅的黑色,带有2吨RadiusiblueEffectStyle.Light?@Joakim,但这是白色blur。我需要一个黑色的,正好显示你需要的。@DharmeshKheni我添加了截图。在.Dark blur的例子中,我得到了这个:,但我想要更浅的黑色,带有2吨半径苹果非常明确地建议不要更改
UIVisualEffectView
@chicobermuda的alpha-苹果给出了这个建议,因为较小的alpha“…会导致许多效果看起来不正确或根本不显示。”请注意,他们并没有说所有的效果都有这样的alpha问题——也许这不是UIBlurEffect的问题?苹果非常明确地建议不要更改
UIVisualEffectView
@chicobermuda的alpha——苹果给出了这个建议,因为较小的alpha“…会导致许多效果看起来不正确或根本不显示。”请注意,他们并没有说所有的效果都有这样的阿尔法问题-也许这不是UIBlurEffect的问题?欢迎使用stackoverflow。您正在演示如何设置“角半径”。这与当前的问题无关,即如何控制模糊效果的“半径”——即模糊扩散的(与设备无关)像素数。注意:在您的答案中,左下角附近应该是删除它的选项。既然你的答案与这个问题无关,你可以考虑删除它,以消除负面的投票。(无论如何,不要亲自投反对票——这只是为了把这个答案推到其他答案的下面,而其他答案可能是错误的。)