【问题标题】:How to create macOS Big Sur-style Search Box with exterior focus ring in SwiftUI?如何在 SwiftUI 中创建带有外部对焦环的 macOS Big Sur 风格的搜索框?
【发布时间】:2020-07-14 02:48:59
【问题描述】:

在 macOS Big Sur 中,所有内置搜索框控件的外部都会发光以显示焦点。如何在我的 SwiftUI 应用中实现这种效果?

我建立了一个看起来很相似的搜索栏,但它仍然有一个看起来很糟糕的矩形对焦环。我可以完全关闭对焦环,但这也不是我想要的。我想要外在的光芒。

这是我当前的 SwiftUI 代码。请注意 NSTextField focusRingType 覆盖。有了它,我可以关闭对焦环,但这不是我想要的。默认给了我矩形,不好的焦点。看起来外部将是票,但它产生与默认相同的结果。我想知道这是否只是当前 Big Sur/Xcode/SwiftUI 开发人员测试版中的一个错误。

import SwiftUI

struct SearchBarView: View {
    
    @Binding var searchText: String
    
    var body: some View {
        HStack {
            TextField("Search ...", text: self.$searchText)
                .textFieldStyle(PlainTextFieldStyle())
                .padding(7)
                .padding(.horizontal, 25)
                .background(Color("systemGray6"))
                .cornerRadius(8)
                .overlay(
                    HStack {
                        Image(systemName: "magnifyingglass")
                            .foregroundColor(.gray)
                            .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
                            .padding(.leading, 10)
                    }
                )
                .padding(.horizontal, 10)
        }
        .padding()
    }
}

struct SearchBarView_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            SearchBarView(searchText: .constant(""))
                .previewLayout(.fixed(width: 35, height: 50))
                .environment(\.colorScheme, .dark)
            
            SearchBarView(searchText: .constant(""))
                .previewLayout(.fixed(width: 35, height: 50))
                .environment(\.colorScheme, .light)
        }
    }
}

extension NSTextField {
    open override var focusRingType: NSFocusRingType {
        //get { .none }
        get { .default }
        // get { .exterior } // same as .default, could just be bug in Big Sur Dev Beta 1&2?
        set { }
    }
}

【问题讨论】:

  • 焦点环默认绘制正确,它只是围绕 TextField 绘制,而不是围绕带有填充、背景和覆盖的自定义视图。 IE。 .textFieldStyle 修饰符之后的所有内容都 not TextField 已经。您需要通过可表示使用 NSSearchField。
  • @Asperi 我明白为什么对焦环不是我想要的。我想知道如何才能做到这一点。我尝试通过 NSViewRepresentable 使用 NSSearchField,但它仍然看起来像一个常规的矩形文本字段(如我的示例),而不是在 Big Sur 上的 Finder 中看到的搜索字段。

标签: swift xcode macos swiftui macos-big-sur


【解决方案1】:

我能够解决这个问题!这种风格的搜索栏是由NSToolbar使用NSSearchToolbarItem提供的!

【讨论】:

  • 请分享您的解决方案的sn-p
猜你喜欢
  • 2021-02-25
  • 2021-04-08
  • 2022-01-09
  • 2021-11-30
  • 1970-01-01
  • 2021-04-23
  • 2021-04-10
  • 2022-10-02
  • 1970-01-01
相关资源
最近更新 更多