SwiftUI - 选择器重叠

3

我正在尝试创建一个组件,基本上是两个SwiftUI选择器并排放置,如下所示:enter image description here

现在它只是一个非常简单的实现:

@State var hourSelection = 0
@State var daySelection = 0

var days = [Int](0 ..< 30)
var hours = [Int](0 ..< 30)

...

GeometryReader { proxy in
  HStack(spacing: 0) {
    Picker(selection: self.$daySelection, label: Text("")) {
      ForEach(0 ..< self.days.count) { index in
        Text("\(self.days[index]) d").tag(index)
      }
    }
    .pickerStyle(.wheel)
    .frame(width: proxy.size.width / 2, height: proxy.size.height, alignment: .leading)

    Picker(selection: self.$hourSelection, label: Text("")) {
      ForEach(0 ..< self.hours.count) { index in
        Text("\(self.hours[index]) h").tag(index)
      }
    }
    .pickerStyle(.wheel)
    .frame(width: proxy.size.width / 2, height: proxy.size.height, alignment: .trailing)
  }
}
尝试在左侧使用选择器会简单地使用右侧的选择器。 换句话说,它们重叠在一起。 我该如何使用SwiftUI修复此问题? Stack Overflow上没有其他解决方案适用于我。
我已经查看了选择器在iOS 15中重叠,导致某些选择器无法滚动,但是被接受的解决方案对我不起作用。
我尝试在.frame()之后使用.compositingGroup(),然后使用.clipped(),但这没有起作用,将.mask(Rectangle())应用于父容器也是如此。
更新:即使进行了iOS 16更新和新的XCode Beta,问题仍然存在。

这个回答解决了你的问题吗?在iOS 15中,选择器重叠导致其中一些无法滚动 - Yrb
不好意思,我不相信那个解决方案仍然有效。 - Nicolas Gimelli
3个回答

2
另一种可能的变体 - 只需使底层的UIPickerView(因为它负责该问题)可压缩:
测试使用 Xcode 13.4 / iOS 15.5。

demo

extension UIPickerView {
    override open func didMoveToSuperview() {
        super.didMoveToSuperview()
        self.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
    }
}

在GitHub上的测试模块


不幸的是,我正在寻找与问题中图片美学相似的东西,其中灰色高亮显示跨越不同的轮子。 - Nicolas Gimelli
那么你需要这种方法 https://dev59.com/0r3pa4cB1Zd3GeqPb1Kz#63970044。 - Asperi
谢谢,我今天稍后会试一下。 - Nicolas Gimelli

0
这对我有用:
extension UIPickerView {
    open override var intrinsicContentSize: CGSize {
        return CGSize(width: UIView.noIntrinsicMetric, height: super.intrinsicContentSize.height)
    }
}

0

你可以尝试在每个.frame(width: proxy...)后面添加.clipped()。在我的macOS 12.5上,使用Xcode 13.3,目标为ios-15 macCatalyst 12.3,在真实设备上测试通过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接