32

タイトルはほとんどそれをすべて尋ねます...

私は iOS8 で遊んでいますVisual Effect View with Blur。これでUIImageView、ユーザーが選択できる背景写真が表示されます。contentView 自体に配置されたビューは、私自身のカスタム ビューであり、一種のグラフ/カレンダーを表示します。上記のカレンダーグラフのほとんどは透過的です。後ろの写真に適用されるぼかしは本当に重いです。詳細をもっと漏れさせてほしい。しかし、Apple は 3 つの定型値しか提供していないようです。

typedef enum {
    UIBlurEffectStyleExtraLight,
    UIBlurEffectStyleLight,
    UIBlurEffectStyleDark 
} UIBlurEffectStyle;

さまざまなアルファと背景色を試してみましたがUIVisualEffectView(ドキュメントでは警告されていますが)、それは何もしませんが、悪化させます.

4

11 に答える 11

48

Apple がぼかし効果のオプションを提供していないのは残念です。しかし、この回避策はうまくいきました-ぼかし効果をアニメーション化し、完了する前に一時停止しました。

func blurEffectView(enable enable: Bool) {
    let enabled = self.blurView.effect != nil
    guard enable != enabled else { return }

    switch enable {
    case true:
        let blurEffect = UIBlurEffect(style: .ExtraLight)
        UIView.animateWithDuration(1.5) {
            self.blurView.effect = blurEffect
        }

        self.blurView.pauseAnimation(delay: 0.3)
    case false:
        self.blurView.resumeAnimation()

        UIView.animateWithDuration(0.1) {
            self.blurView.effect = nil
        }
    }
}

ビューのアニメーションを一時停止 (遅延あり) および再開するための UIView 拡張機能

extension UIView {

    public func pauseAnimation(delay delay: Double) {
        let time = delay + CFAbsoluteTimeGetCurrent()
        let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, time, 0, 0, 0, { timer in
            let layer = self.layer
            let pausedTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
            layer.speed = 0.0
            layer.timeOffset = pausedTime
        })
        CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
    }

    public func resumeAnimation() {
        let pausedTime  = layer.timeOffset

        layer.speed = 1.0
        layer.timeOffset = 0.0
        layer.beginTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime
    }
}
于 2016-05-31T22:12:03.007 に答える
39

ぼかしが大きくなる理由は、適用されるぼかしの量ではなく、ぼかし効果のスタイルが画像の明るさのレベルに影響するためです。

ここに画像の説明を入力

残念ながら、Apple には明らかにプログラムで適用されるぼかしの量を制御する機能がありますが (Launchpad でゆっくりとドラッグして、Spotlight のぼかしの遷移を確認してみてください)、ぼかしの量を に渡すパブリック API は見当たりませんUIBlurEffect

この投稿では、背景色のアルファを調整するとぼかしの量が増えると主張しています。試してみる価値はありますが、それが文書化されている場所がわかりません: UIVisualEffectViewおよび/またはUIBlurEffectをフェードインおよびアウトする方法は?

于 2015-04-07T18:58:10.870 に答える
7

これは私にとってはうまくいきます。

ビューに追加する前に入れUIVisualEffectViewました。UIView

この機能を使いやすくしました。この関数を使用して、ビュー内の任意の領域をぼかすことができます。

func addBlurArea(area: CGRect, style: UIBlurEffectStyle) {
    let effect = UIBlurEffect(style: style)
    let blurView = UIVisualEffectView(effect: effect)

    let container = UIView(frame: area)
    blurView.frame = CGRect(x: 0, y: 0, width: area.width, height: area.height)
    container.addSubview(blurView)
    container.alpha = 0.8
    self.view.insertSubview(container, atIndex: 1)
}

たとえば、次のように呼び出して、ビュー全体をぼかすことができます。

addBlurArea(self.view.frame, style: UIBlurEffectStyle.Dark)

Dark希望のぼかしスタイルと0.8希望のアルファ値に変更できます

于 2015-10-29T23:17:51.500 に答える
4

@ mitja13 のソリューションに似ていますがUIViewPropertyAnimator、もう少し簡潔なを使用します。

var animator: UIViewPropertyAnimator!

viewDidLoad() {
   super.viewDidLoad()

   let blurEffectView = UIVisualEffectView()
   yourViewToBeBlurred.addSubview(blurEffectView)
   blurEffectView.fillSuperview() // This my custom method that anchors to the superview using auto layout. Write your own

   animator = UIViewPropertyAnimator(duration: 1, curve: .linear, animations: {
       blurEffectView.effect = UIBlurEffect(style: .regular)
   })

   animator.fractionComplete = 0.6 // Adjust to the level of blur you want
 
}
于 2020-07-03T03:13:14.753 に答える