SwiftUI ScrollView仅向一个方向滚动

mg_*_*erk 2 scrollview swift swiftui

尝试使用视图作为列表行样式来创建自定义列表(默认情况下,要摆脱列表中的丑陋行)。

但是,一旦我将ZStack行放入滚动视图中,滚动视图就会在两个方向上滚动,而不仅仅是垂直滚动。

这是contentView:

NavigationView {
            ScrollView{
                VStack(alignment: .leading){
                    ForEach(friends) { friends in
                        NavigationButton(destination: MessageDetailView(friend: friends)) {
                            CustomListItem(friend: friends)
                        }
                    }
                    Spacer()
                }
            }
                .foregroundColor(.black)
                .navigationBarTitle(Text("Messages"))
        }
Run Code Online (Sandbox Code Playgroud)

这是customListItem:

Group{
            ZStack {
                RoundedRectangle(cornerRadius: 10)
                    .shadow(radius: 1, y:1)
                    .frame(width: UIScreen.main.bounds.width - 32, height: 75)
                    .foregroundColor(.gray)

                HStack {
                    Image(systemName: "person.crop.circle")
                        .resizable()
                        .frame(width: 50, height: 50)
                    VStack(alignment: .leading) {
                        HStack {
                            Text(friend.name)
                                .font(.headline)
                            Text("\(friend.date, formatter: dateFormatter)")
                        }
                        Text(friend.messagesReceived[0])
                            .font(.subheadline)
                        }       .lineLimit(nil)
                    Spacer()
                    Image(systemName: "chevron.right.circle")
                        .foregroundColor(.black)
                    }.padding(10)
                }.padding([.leading, .trailing])
        }
Run Code Online (Sandbox Code Playgroud)

有什么方法可以限制滚动到垂直方向或在此方向上强制画格吗?

尝试使用.frame(...)修饰符不起作用,因为我尝试过。这导致视图根本无法加载。

图片示例:

没有ScrollView

使用ScrollView包装VStack

pie*_*bie 8

这可以通过来实现GeometryReader。将您的包裹ScrollView成一个,然后设置宽度VStack

对于SwiftUI,GeometryReader是一个非常简单且非常有用的技巧:)

这是我如何与您的代码一起使用的:

NavigationView {
            GeometryReader { geometry in
                ScrollView {
                    VStack(alignment: .leading){
                        ForEach(self.friends) { friend in
                            NavigationButton(destination: MessageDetailView(friend: friend)) {
                                CustomListItem(friend: friend)
                            }
                        }
                        Spacer()
                    }.frame(width: geometry.size.width)
                }
                    .foregroundColor(.black)
                    .navigationBarTitle(Text("Messages"))
            }
        }
Run Code Online (Sandbox Code Playgroud)


Lia*_*iam 8

从Xcode 11 beta 3(11M362v)开始axes,构造a时有一个参数ScrollView可以设置为.horizontal.vertical

ScrollView(.vertical, showsIndicators: true) { ... }
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案!请注意,即使添加了如图所示的“.vertical”,如果 ScrollView 的内容比 ScrollView 的宽度宽,您仍然可以获得一些横向滚动。限制内容宽度可以解决这个问题。 (2认同)

use*_*232 5

使用 iOS 14、Swift 5、SwiftUI 2.0

这就是答案...您可以在一组中同时使用垂直和水平。

ScrollView([.vertical,.horizontal]) {
  ....
}
Run Code Online (Sandbox Code Playgroud)