SwiftUI 中 TextEditor 的透明背景

Posted

技术标签:

【中文标题】SwiftUI 中 TextEditor 的透明背景【英文标题】:Transparent Background for TextEditor in SwiftUI 【发布时间】:2021-01-23 22:36:21 【问题描述】:

我正在使用 SwiftUI 为 ios、iPadOS 和 macOS 构建应用程序,我需要一个具有透明背景的 TextEditor。

之前有人问过这个问题,我找到了适用于 iOS/iPadOS (Change background color of TextEditor in SwiftUI) 的好答案,但没有找到适用于 macOS 的答案。

这是我基于上面链接的代码,非常适用于 iOS 和 iPadOS:

TextEditor(text: $text)
  .foregroundColor(.black)
  .onAppear 
      #if os(macOS)
      // ??
      #else
      UITextView.appearance().backgroundColor = .clear
      #endif
  

NSTextView 似乎与UITextView.appearance() 没有等效项,所以我不完全确定在那里做什么。

使用.background(Color.clear) 也不起作用:

TextEditor(text: $text)
  .foregroundColor(.black)
  .background(Color.clear)
  .onAppear 
      #if os(macOS)
      // ??
      #else
      UITextView.appearance().backgroundColor = .clear
      #endif
  

有人知道在 macOS 上为 TextEditor 获取透明背景的方法吗?

此外,已经在此处专门针对 macOS 提出了这个问题:Changing TextEditor background color in SwiftUI for macOS,但没有给出有效的答案。

【问题讨论】:

【参考方案1】:

这是一个可能的解决方法。该扩展将所有 TextViews 背景设置为 .clear,然后您可以使用 .background() 修饰符更改背景颜色。

import SwiftUI

extension NSTextView 
    open override var frame: CGRect 
        didSet 
            backgroundColor = .clear //<<here clear
            drawsBackground = true
        

    


struct ContentView: View 
    
    @State var string: String = ""
    
    var body: some View 
        TextEditor(text: $string)
            .textFieldStyle(PlainTextFieldStyle())
            .background(Color.red) //<< here red
    

【讨论】:

以上是关于SwiftUI 中 TextEditor 的透明背景的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI TextEditor 中获取用户选择的文本

在 SwiftUI 中,为啥 Spacer 会将文本推送到 TextEditor 框架之外?

SwiftUI - 有没有办法创建一个只读的 TextEditor?

为啥我在 SwiftUI 中的 TextEditor 会忽略我的 .keyboardType?

如何防止 TextEditor 在 SwiftUI 中滚动?

如何根据 TextEditor 的文本更改为 SwiftUI 视图设置动画?