微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在工作表视图上使用不透明的背景色?

如何解决如何在工作表视图上使用不透明的背景色?

我目前正在使用SwiftUI开发应用程序。

我正在寻找某种方法来使“工作表”视图上的背景颜色不透明。

有什么办法吗?


我尝试使用下面的代码执行此操作,我可以使用opacity属性更改颜色,但是在工作表视图下看不到文本(Sheet)...

 I  STORAGE  [initandlisten] exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: ./database/data,terminating
2020-09-04T16:40:42.946+0000 I  NETWORK  [initandlisten] shutdown: going to close listening sockets...
2020-09-04T16:40:42.946+0000 I  -        [initandlisten] Stopping further Flow Control ticket acquisitions.
2020-09-04T16:40:42.946+0000 I  CONTROL  [initandlisten] Now exiting
2020-09-04T16:40:42.946+0000 I  CONTROL  [initandlisten] shutting down with code:100

Xcode:版本11.7

Swift:Swift 5

解决方法

使用我一整天都在寻找的来自@Asperi 的很棒的答案,我构建了一个简单的视图修改器,现在可以应用到 .sheet 或 .fullScreenCover 模态视图中并提供透明背景。然后,您可以根据需要为内容设置框架修饰符以适合屏幕,而用户不必知道模态不是自定义大小。

import SwiftUI

struct ClearBackgroundView: UIViewRepresentable {
    func makeUIView(context: Context) -> some UIView {
        let view = UIView()
        DispatchQueue.main.async {
            view.superview?.superview?.backgroundColor = .clear
        }
        return view
    }
    func updateUIView(_ uiView: UIViewType,context: Context) {
    }
}

struct ClearBackgroundViewModifier: ViewModifier {
    
    func body(content: Content) -> some View {
        content
            .background(ClearBackgroundView())
    }
}

extension View {
    func clearModalBackground()->some View {
        self.modifier(ClearBackgroundViewModifier())
    }
}

用法:

.sheet(isPresented: $isPresented) {
            ContentToDisplay()
            .frame(width: 300,height: 400)
            .clearModalBackground()
    }
,

您不能使用标准工作表官方API来执行此操作(因为默认情况下每个主机控制器视图都是不透明的),因此您可以创建自定义工作表视图(具有所需的任何功能)或使用运行时解决方法来查找该视图并设置背景清晰。如下所示(仅用于演示

demo

struct DemoView: View {

    @State var isSheet = false

    var body: some View {

        Button(action: {self.isSheet.toggle()}) {
            Text("Sheet")
        }.sheet(isPresented: $isSheet){
            Color.yellow.opacity(0.5)
                .background(BackgroundClearView())
        }
    }
}

struct BackgroundClearView: UIViewRepresentable {
    func makeUIView(context: Context) -> UIView {
        let view = UIView()
        DispatchQueue.main.async {
            view.superview?.superview?.backgroundColor = .clear
        }
        return view
    }

    func updateUIView(_ uiView: UIView,context: Context) {}
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。