模态选择器没有向右滚动SwiftUI

Posted

技术标签:

【中文标题】模态选择器没有向右滚动SwiftUI【英文标题】:Modal picker not scrolling right SwiftUI 【发布时间】:2020-05-20 22:19:53 【问题描述】:

我创建了一个模式,但它似乎在选择上有一个错误。当向左滚动时,它向右滚动,我必须走到左边才能滚动,这就是它的样子:

import SwiftUI

struct ContentView: View 

@State var showingModal = false
@State var hours: Int = 0
@State var minutes: Int = 0

var body: some View 

    ZStack 
        VStack 
            Button("Show me")
                self.showingModal = true
            

            if $showingModal.wrappedValue 
                VStack(alignment: .center) 
                    ZStack
                        Color.black.opacity(0.4)
                            .edgesIgnoringSafeArea(.vertical)
                        // this one is it
                        VStack(spacing: 20) 
                            Text("Time between meals")
                                .bold().padding()
                                .frame(maxWidth: .infinity)
                                .background(Color.yellow)
                                .foregroundColor(Color.white)

                            HStack 
                                Spacer()
                                VStack 
                                    Picker("", selection: $hours)
                                        ForEach(0..<4, id: \.self)  i in
                                            Text("\(i) hours").tag(i)
                                        
                                    
                                    .frame(width: 150, height: 120)
                                    .clipped()
                                

                                VStack 
                                    Picker("", selection: $minutes)
                                        ForEach(0..<60, id: \.self)  i in
                                            Text("\(i) min").tag(i)
                                        
                                    
                                    .frame(width: 150, height: 120)
                                    .clipped()
                                
                            

                            Spacer()

                            Button(action: 
                                self.showingModal = false
                            )
                                Text("Close")
                             .padding()
                        
                        .frame(width:300, height: 300)
                        .background(Color.white)
                        .cornerRadius(20).shadow(radius: 20)
                       
                
            
        
    


我该如何修复这个小错误?我尝试使用布局但没有用...任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

如果我告诉你你的 Picker 不工作的原因是这条线怎么办?

.cornerRadius(20).shadow(radius: 20)

不幸的是,SwiftUI 仍然有很多错误,有时它并没有做它应该做的事情,尤其是 Pickers 并不那么可靠。我想我们需要等待,看看 SwiftUI 的下一次迭代,但现在你可以用下面的代码替换那行:

.mask(RoundedRectangle(cornerRadius: 20))
.shadow(radius: 20)

【讨论】:

【参考方案2】:

只有影响所有视图层次结构(即所有子视图)的修饰符可以改变结果布局/呈现/行为。而.cornerRadius.shadow 就是这样的类型修饰符。

解决方案是(按预期)将这些修饰符仅应用于整个构造视图,这里是

.compositingGroup()  // <<< fix !!
.cornerRadius(20).shadow(radius: 20)

其中.compositionGroup 旨在使上方视图层次结构平面渲染 以及仅应用于该平面视图的所有下方修饰符。

【讨论】:

很好的答案@Asperi!我试图记住那个修饰符,但想不起来。尽管如此,将cornerRadius应用于所有内部视图(在本例中为Picker)并不能解释它会改变其框架,因此我认为这种行为是一个错误。

以上是关于模态选择器没有向右滚动SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

设置连续轮选择器 - SwiftUI

无法在 swift ui 中单击分段选择器

SwiftUI 选择器值

SwiftUI Picker Help -- 根据另一个选择器的选择填充选择器

具有动态数组的 SwiftUI 多个选择器,索引超出范围错误

一个好的 WPF 滚动时间线控件? (花哨的日期时间选择器)