材质背景上的 SwiftUI contextMenu 在激活时会使内容变暗

Posted

技术标签:

【中文标题】材质背景上的 SwiftUI contextMenu 在激活时会使内容变暗【英文标题】:SwiftUI contextMenu on material background darkens the content when activated 【发布时间】:2021-11-14 00:55:44 【问题描述】:

我正在使用material background in SwiftUI(在 ios 15 中引入)。在显示上下文菜单时应用于也具有contextMenu 修饰符的视图时,它会使整个内容变暗。为了确保它与我的项目无关,我创建了一个示例项目,它也有同样的问题。

代码:

struct ContentView: View 
    var body: some View 
        ZStack 
            Color(.systemBlue).ignoresSafeArea()
            Text("Press for Context Menu")
                .padding()
                .background(.regularMaterial)
                .contextMenu 
                    Button("Option 1", action: )
                    Button("Option 2", action: )
                    Button("Option 3", action: )
                
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
//            .preferredColorScheme(.dark)
    

结果如下:

有趣的是,它在暗模式下可以正常工作:

【问题讨论】:

【参考方案1】:

修饰符的顺序很重要。为避免这种变暗,只需交换修饰符,以便在 .background 之前应用 .contextMenu

                Text("Press for Context Menu")
                    .padding()
                    .contextMenu 
                        Button("Option 1", action: )
                        Button("Option 2", action: )
                        Button("Option 3", action: )
                    
                    .background(.regularMaterial)

应该是这样的:

【讨论】:

…我们这里有一个竞争条件! :P【参考方案2】:

在contextMenu 修饰符 之后添加带有材质的背景。但是,当您打开上下文菜单时,您仍然会看到奇怪的外观,因为在它上面应用了另一种材质。

【讨论】:

谢谢!这并不理想,但比我在发布原始问题后尝试通过 ***.com/a/59111191/1659311 的 UIViewRepresentable 使用自定义 VisualEffectView 更好。这是现在的样子:imgur.com/a/5Fm7GaO 你就不能模仿 regularMaterial 的外观,对Text 应用一些视图修饰符吗?我还注意到,如果 Text 应用了 fixedSize,上下文菜单中的模糊可能会略有变化。 看起来是 Apple 的问题 - 我会报告的。目前解决方法已经足够好了。

以上是关于材质背景上的 SwiftUI contextMenu 在激活时会使内容变暗的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:菜单打开时如何忽略背景上的点击?

检测 GeometryReader SwiftUI 背景上的点击手势

AngularJS材质暗模式开关不会改变背景

用于删除 Angular 材质 v5 模态背景的 CSS 代码

更改 ScrollView SwiftUI 的背景颜色

更改 ScrollView SwiftUI 的背景颜色