swift - SwiftUI 的 ".disabled"修饰符的变化可以动画吗?

标签 swift swiftui

我认为View.disabled(_:)修饰符更改 .foregroundColorView (除了启用/禁用与它的交互)。颜色变化可以动画吗?

我知道动画很容易说 .opacity隐式动画的变化(例如: .animation(.default) )。然而,同样不适用于 .disabled .

请考虑以下代码:

import SwiftUI

struct SomeButton: View {

    @State var isDisabled = false
    @State var isHidden = false

    var body: some View {
        VStack(spacing: 30) {
            Spacer()
            Button(action: {}) {
                Image(systemName: "pencil.circle.fill")
                    .resizable()
            }
            .frame(width: 80, height: 80)

            .disabled(isDisabled)       // 👈🏻 Will not animate at all.
            .opacity(isHidden ? 0 : 1)  // 👈🏻 Will animate just fine.
            .animation(.default)        // 👈🏻 Set to use implicit animations.

            VStack(spacing: 10) {
                Button(action: {
                    self.isHidden.toggle()
                }) {
                    Text("Hide")
                }
                Button(action: {
                    self.isDisabled.toggle()
                }) {
                    Text("Disable")
                }
            }
            Spacer()
        }
    }
}

// MARK: - Preview

#if DEBUG
struct SomeButton_Previews: PreviewProvider {
    static var previews: some View {
        SomeButton()
    }
}
#endif

这会产生以下结果,呈现平滑的不透明度过渡:

animationSample

...另一方面,启用/禁用的颜色转换是二进制的。它看起来不太好。

我当前的解决方法是根据其启用/禁用状态更改 View 的不透明度。
例如,如果 View 被禁用,则不透明度为 0.6。如果启用,不透明度将恢复为 1.0。

但是感觉不对。必须有另一种方式。

最佳答案

可能的解决方案是结合 .colorMultipy ,当然禁用的颜色应该在实验上适合,但这会产生常见的动画效果

demo

.disabled(isDisabled)
.colorMultiply(isDisabled ? Color.gray /* to be selected to fit*/ : .white) // 👈🏻 animatable
.animation(.default)

关于swift - SwiftUI 的 ".disabled"修饰符的变化可以动画吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62191681/

相关文章:

ios - 如何在 Swift 中弹出特定的 View Controller

ios - 嵌入另一个 View 时,SwiftUI 动画不起作用

webview - 在 SwiftUI 中加载网站时加载事件指示器

ios - SwiftUI:如何动态设置自定义 View 大小

alamofire - SwiftUI 无法在设备上运行 (Alamofire)

swift - UIViewController 子类似乎加载了不需要的 Nib

swift - 我们如何获得NSLocalizedString的注释?

swift - 在Swift中使用partition将一些预定义的元素移到Array的末尾

ios - "Unexpectedly found nil while unwrapping an Optional value"添加UINavigation时

ios - 当 ForEach 中发生 onDelete 时如何更新其他 CoreData?