使用Swift语言在iPhone上实现模糊效果

4

我一直在尝试使用UIImageView在xcode 6(swift语言)中实现模糊效果,我想实现的是使ImageView下面的所有内容都变模糊。

但我无法让它生效,所以我向stackoverflow上的大家求助,请帮帮我。

应该如何实现呢?

到目前为止,我写的代码是:


class blurImage: UIImageView {

    init(frame: CGRect) {
        super.init(frame: frame)

        var blur:UIBlurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light)
        var effectView:UIVisualEffectView = UIVisualEffectView (effect: blur)

    }

}


你有可用的Objective C代码吗?如果有,具体是哪个过渡部分引起了问题?如果没有,那么这可能是一个相当广泛的问题。 - A-Live
我没有任何可用的代码... 我试图直接在Swift中完成它。 - Vladimir
1
我建议您先寻找使用Objective C的解决方案,因为这个主题已经被讨论过了,然后再尝试用Swift编写相同的内容。例如,您可以使用UIInterpolatingMotionEffectUiView -addMotionEffect:(在iOs7+上可用)。 - A-Live
我会做的!谢谢。 - Vladimir
@A-Live,据我所知,UIInterpolatingMotionEffect不是用于模糊效果的目标。它的目标是视差效果。 - Kuroro
是的,在新的WWDC视频中,您可以找到有关iOs 8可用模糊选项的一些信息。 - A-Live
3个回答

9
你需要给模糊视图指定一个框架,并将其添加为子视图。

class blurImage: UIImageView {

init(frame: CGRect) {
    super.init(frame: frame)

    var blur:UIBlurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light)
    var effectView:UIVisualEffectView = UIVisualEffectView (effect: blur)
    effectView.frame = frame
    addSubview(effectView)
}
 }

我该如何在Storyboards中使用这个类? - fabian

2
我修改了@Kuroros的类,使其与Storyboards兼容。
class BlurImage: UIImageView {

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    init(coder aDecoder: NSCoder!)
    {
        super.init(coder: aDecoder)

        let blur:UIBlurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light)
        var effectView:UIVisualEffectView = UIVisualEffectView (effect: blur)
        effectView.frame = frame
        addSubview(effectView)
    }

}

2
我可能错了,但是模糊应该是一个let而不是var,因为它不会被修改,你觉得呢? - Carl Goldsmith

0

我修改了@fabian的实现,因为如果使用自动布局,frame大小计算存在问题。当您尝试在init()中读取frame数据时,它尚未正确计算,并且对于我而言大小为(1000,1000),而应该是(420,420)。因此,您需要稍后读取和设置。我使用了layoutSubviews来解决这个问题。另外,设置frame = frame也不起作用,因为它返回绝对容器位置,但我们需要盒子大小。

class BluredImage: UIImageView {

    var effectView:UIVisualEffectView!

    required init(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)!

        let blur:UIBlurEffect = UIBlurEffect(style: .light)
        effectView = UIVisualEffectView (effect: blur)

        addSubview(effectView)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        effectView.frame = bounds
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接