如何防止 SwiftUI SegmentedControl 中的文本“弹跳”

Posted

技术标签:

【中文标题】如何防止 SwiftUI SegmentedControl 中的文本“弹跳”【英文标题】:How do I prevent Text "bounce" in SwiftUI SegmentedControl 【发布时间】:2020-06-10 23:00:30 【问题描述】:

当我点击各个片段时,SwiftUI SegmentedPicker 中的文本出现弹跳问题。

这是超级基本的,所以我不确定有哪些选项可以调整它:

struct ContentView : View 
    @State private var selectorIndex = 0
    @State private var numbers = ["One","Two","Three"]

    var body: some View 
        VStack 
            Picker("Numbers", selection: $selectorIndex) 
                ForEach(0 ..< numbers.count)  index in
                    Text(self.numbers[index]).tag(index)
                
            
            .pickerStyle(SegmentedPickerStyle())


            Text("Selected value is: \(numbers[selectorIndex])").padding()
        
    

【问题讨论】:

这是当前版本的 SwiftUI Picker 的“功能”。有些人编写了自己的选择器作为解决方法。 我认为您可能需要创建自定义选择器 【参考方案1】:

尝试将此添加到文本中,尤其是对齐方式:

.frame(width: 222, height: 55, alignment: .leading)

编辑:

我正在使用以下代码在真实设备和各种模拟器上测试文本弹跳:

struct ContentView: View 

@State private var selectorIndex = 0
@State private var numbers = ["One","Two","Three"]

var body: some View 
    VStack 
        Picker("Numbers", selection: $selectorIndex) 
            ForEach(0 ..< numbers.count)  index in
                Text(self.numbers[index]).tag(index)
            
        
        .pickerStyle(SegmentedPickerStyle())
        Text("Selected value is: \(numbers[selectorIndex])")
            .frame(width: 222, height: 55, alignment: .leading)
    

    

【讨论】:

它确实减少了“反弹”,尤其是在中间部分,但仍然很明显。 我的设置没有任何“反弹”; Mac 10.15.5 使用 xcode 11.6 beta(和 11.5),ios 13.5 iphone 和 iPad,mac 催化剂。你用的是什么系统? 我已经编辑了答案以显示我正在使用的代码。这样我就看不到任何文本反弹 唉,我想我们指的是不同的文本。您更新的代码修改了“选定的值是:一个”文本。虽然我指的是每个段内的文本。这些是我看到移动的文本项。 那怎么样,相信我会选错文字。在这种情况下,我敢打赌这就是 Apple 希望 Pickers 的行为方式,以显示选择的变化。

以上是关于如何防止 SwiftUI SegmentedControl 中的文本“弹跳”的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI如何防止视图重新加载整个身体

如何防止键盘在 SwiftUI 中向上推视图? [复制]

如何防止 SwiftUI SegmentedControl 中的文本“弹跳”

SwiftUI - 如何防止工作表中的键盘向上推我的主 UI

SwiftUI 2 - 如何防止顶部部分在 macOS 和 iPadOS 的列表中关闭

如何防止 SwiftUI clipShape 影响子视图