【问题标题】:Set segment equal width for SwiftUI Picker with SegmentedPickerStyle使用 SegmentedPickerStyle 为 SwiftUI Picker 设置段等宽
【发布时间】:2020-05-16 06:52:25
【问题描述】:

使用SegmentedPickerStyle 样式Picker 可以使控件看起来像UISegmentedControl。但我想知道如何调整选择器中的段宽度。例如,图像中的选择器具有不同的文本宽度。

有没有办法让 SwiftUI 中的段宽度相同?

    Picker(selection: $store.utility.saliencyType, label: EmptyView()) {
        ForEach(Store.Utility.SaliencyType.allCases, id: \.self) { saliencyType in
            Text(saliencyType.text)
                .tag(saliencyType)
        }
    }.pickerStyle(SegmentedPickerStyle())

【问题讨论】:

  • 它是 macOS - 仅在 iOS 上所有段都是平等的。

标签: swift macos swiftui picker


【解决方案1】:

这是默认的 macOS NSSegmetedControl 行为

@property NSSegmentDistribution segmentDistribution API_AVAILABLE(macos(10.13)); 
// Defaults to NSSegmentDistributionFill on 10.13, older systems will continue to behave similarly to NSSegmentDistributionFit

更新:这是基于在运行时视图层次结构中找到 NSSegmentedControl 的解决方法。

免责声明:实际上它是安全的,即。运行时没有崩溃,但可以在将来恢复默认行为时停止工作。

因此,我们的想法是通过可表示将NSView 注入到上面的视图层次结构中(!!)Picker,如

Picker(selection: $store.utility.saliencyType, label: EmptyView()) {
        ForEach(Store.Utility.SaliencyType.allCases, id: \.self) { saliencyType in
            Text(saliencyType.text)
                .tag(saliencyType)
        }
    }
    .overlay(NSPickerConfigurator {                // << here !!
        $0.segmentDistribution = .fillEqually // change style !!
    })
    .pickerStyle(SegmentedPickerStyle())

和配置器本身

struct NSPickerConfigurator: NSViewRepresentable {
    var configure: (NSSegmentedControl) -> Void

    func makeNSView(context: Context) -> NSView {
        let view = NSView()
        DispatchQueue.main.async {
            if let holder = view.superview?.superview {
                let subviews = holder.subviews
                if let nsSegmented = subviews.first?.subviews.first as? NSSegmentedControl {
                    self.configure(nsSegmented)
                }
            }
        }
        return view
    }

    func updateNSView(_ nsView: NSView, context: Context) {
    }
}

【讨论】:

  • 哇。我是 Cocoa 平台的新手。第一次知道这种行为。而且我认为覆盖NSSegmetedControl 的全局外观可能是一个好主意。但是,UIAppearance 是 UIKit 独有的。
  • 有趣。您可以找到一种挂钩底层 UI 组件的方法。很高兴知道这个技巧。
猜你喜欢
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 2019-12-22
  • 1970-01-01
相关资源
最近更新 更多