如何在SwiftUI中为不对称过渡添加模糊入/出?

tkqqtvp1  于 4个月前  发布在  Swift
关注(0)|答案(2)|浏览(92)

我正在研究一个幻灯片在/出效果与不透明度的变化是通过以下SwiftUI过渡实现的

VStack {

}
.transition(
  .asymmetric(
    insertion: .opacity
      .combined(with: .offset(x: 50)),
    removal: .opacity
      .combined(with: .offset(x: -50))
  )
)

字符串
除了不透明度改变和偏移,我想在插入时“模糊”视图,在移除步骤中“模糊”视图。不幸的是,SwiftUI似乎没有提供.blur过渡到合并,所以我想问是否有可能以某种方式添加这些类型的自定义过渡,并与它们合并组合?

pengsaosao

pengsaosao1#

💡我使用一个简单的动画,因为它是相同的一个你已经提供

方法一:对条件视图应用修饰符

将条件视图 Package 在一个组中,并根据以下条件应用模糊:

Group { // 👈 Wrap the condition
    if showDetails {
        Text("This is the label")
            .transition(.opacity.combined(with: .offset(x: -50)))
    }
}
.blur(radius: showDetails ? 0 : 10) // 👈 Use the modifier on the group

字符串

Demo

x1c 0d1x的数据

方法二:自定义转场

您可以使用自定义AnimatableModifier创建自定义过渡。
@Baffo rasta在我有时间完成我的回答之前提到了this method,应该有功劳,但这里是我的,这是他的某种重构版本:

struct Blur: AnimatableModifier {
    init(radius: Double = 0) { animatableData = radius }
    var animatableData: Double

    func body(content: Content) -> some View {
        content.blur(radius: animatableData)
    }
}

extension AnyTransition {
    static var blur: AnyTransition {
        AnyTransition.modifier(active: Blur(radius: 10.0), identity: .init())
    }
}

用法:

.opacity
    .combined(with: .offset(x: -50))
    .combined(with: .blur) // 👈 Combine with other transitions

hxzsmxv2

hxzsmxv22#

import SwiftUI

struct BlurAnimationModifier: AnimatableModifier {
    
    var blur: Double

    var animatableData: Double {
        get { blur }
        set { blur = newValue }
    }
    
    func body(content: Content) -> some View {
        content
            .blur(radius: self.animatableData)
    }
}


extension AnyTransition {
    static var blur: AnyTransition {
        get {
            AnyTransition.modifier(
                active: BlurAnimationModifier(blur: 5.0),
                identity: BlurAnimationModifier(blur: 0.0)
            )
        }
    }
}

字符串
然后使用它如下:

.transition(
    .asymmetric(
        insertion: .opacity
            .combined(with: .offset(x: 50)),
        removal: .opacity
            .combined(with: .offset(x: -50))
    ).combined(with: .blur)
)

相关问题