Mac 上的 SwiftUI:帮助文本即使在不透明度为零的视图中也始终可见

Posted

技术标签:

【中文标题】Mac 上的 SwiftUI:帮助文本即使在不透明度为零的视图中也始终可见【英文标题】:SwiftUI on Mac: Help Text Always Visible Even within View with Zero Opacity 【发布时间】:2022-01-09 05:36:18 【问题描述】:

我在 macOS 应用程序中使用 SwiftUI 时遇到了一些意外行为。我向 Apple 提交了反馈,以防它是一个错误,但它实际上可能被设计为以这种方式工作,所以我正在寻找一种解决方法。

我非常依赖.opacity() 的使用来显示和隐藏我的应用程序的不同部分和标签。我不使用if 子句,因为每次用户更改选项卡时,您都必须等待整个视图重建,这非常慢。

这是一个演示问题的基本示例:

struct ContentView: View 
  @State var viewAVisible = false
  
  var body: some View 
    VStack
      ZStack
    
        Text("View A Visible")
          .frame(width: 500, height: 500)
          .background(Color.blue)
          .help("This is View A's help text. It should be invisible when View A is invisible.")
          .opacity(viewAVisible ? 1 : 0)
        
        Text("View B Visible")
          .frame(width: 500, height: 500)
          .background(Color.gray)
          .opacity(viewAVisible ? 0 : 1)
      
    
      Button("Toggle")
        viewAVisible.toggle()
      
     
    .padding()
  

默认应用状态是隐藏“视图 A”Text(),只显示“视图 B”Text()。但是如果你将鼠标悬停在视图 B 上,你仍然会看到视图 A 的 .help 文字:

在我看来,如果一个视图有.opacity(0),那么它的帮助文本不应该出现。但无论如何,我需要想办法解决这个问题。

我想过做这样的事情:

.help(viewAVisible ? "This is View A's help text..." : "")

...但这并不能扩展到我的应用程序中的数十个视图 - 特别是在不知道其父视图是否显示或隐藏的子视图中。当我将鼠标悬停在我的应用程序上时,我会在各处看到大量视图的帮助文本,即使它们是不可见的。 ????

有没有人遇到过这种情况或对如何处理有任何建议?

【问题讨论】:

【参考方案1】:

看起来像一个错误(他们不删除跟踪矩形),这是一个解决方法的演示 - 将帮助标签移动到后台并手动删除它(使用 macOS 12.0.1 测试)

Text("View A Visible")
    .frame(width: 500, height: 500)
    .background(Group 
        if viewAVisible 
            Color.blue.help("This is View A's help text. It should be invisible when View A is invisible.")
         else 
            Color.clear
        
    )
    .opacity(viewAVisible ? 1 : 0)

【讨论】:

是的,我在我的问题中提到了这一点。我担心的是,当您在条件渲染后再次显示视图时,它必须从头开始重建整个视图层次结构,这让我的应用程序感觉很慢。 查看经过测试的解决方法更新。

以上是关于Mac 上的 SwiftUI:帮助文本即使在不透明度为零的视图中也始终可见的主要内容,如果未能解决你的问题,请参考以下文章

带有常规文本的 SwiftUI 低不透明度按钮

SwiftUI - Catalyst 半透明侧边栏

CSS更改选项卡背景的不透明度而不影响选项卡上的文本[重复]

在不使用十六进制代码的情况下在 gnuplot 中设置线条不透明度

Mac 上的 SwiftUI - 如何将按钮指定为主按钮?

swiftui 文本字段和按钮内的按钮