SwiftUI ScrollView 只向一个方向滚动
SwiftUI ScrollView only scroll in one direction
尝试使用视图作为列表行样式来制作自定义列表(以消除默认情况下列表中丑陋的分隔线)。
但是,一旦我将 ZStack 行放入滚动视图中,滚动视图就会向两个方向滚动,而不仅仅是垂直滚动。
这是内容视图:
NavigationView {
ScrollView{
VStack(alignment: .leading){
ForEach(friends) { friends in
NavigationButton(destination: MessageDetailView(friend: friends)) {
CustomListItem(friend: friends)
}
}
Spacer()
}
}
.foregroundColor(.black)
.navigationBarTitle(Text("Messages"))
}
这里是自定义列表项:
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])
}
有什么方法可以将滚动限制为垂直或强制在其上设置框架吗?
尝试使用 .frame(...) 修饰符无效,因为我已尝试过。这导致视图根本没有加载。
示例图片:
这可以通过 GeometryReader
来实现。将 ScrollView
包裹在一个中,然后设置 VStack
的宽度。
GeometryReader 是 SwiftUI 的一个超级简单且非常有用的技巧:)
以下是我如何使用您的代码:
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"))
}
}
从 Xcode 11 beta 3 (11M362v) 开始,在构造 ScrollView
时有一个 axes
参数,可以设置为 .horizontal
或 .vertical
ScrollView(.vertical, showsIndicators: true) { ... }
尝试像这样更具体地设置滚动方向
ScrollView(.vertical) {}
虽然在大多数情况下上述答案有效,但 none 对我有用!
在我的例子中,问题是 scrollView children 比 scrollView 宽!
给它们添加静态宽度就成功了。
使用iOS14,Swift5,SwiftUI2.0
这就是答案...您可以在一组中同时使用垂直和水平。
ScrollView([.vertical,.horizontal]) {
....
}
尝试使用视图作为列表行样式来制作自定义列表(以消除默认情况下列表中丑陋的分隔线)。
但是,一旦我将 ZStack 行放入滚动视图中,滚动视图就会向两个方向滚动,而不仅仅是垂直滚动。
这是内容视图:
NavigationView {
ScrollView{
VStack(alignment: .leading){
ForEach(friends) { friends in
NavigationButton(destination: MessageDetailView(friend: friends)) {
CustomListItem(friend: friends)
}
}
Spacer()
}
}
.foregroundColor(.black)
.navigationBarTitle(Text("Messages"))
}
这里是自定义列表项:
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])
}
有什么方法可以将滚动限制为垂直或强制在其上设置框架吗?
尝试使用 .frame(...) 修饰符无效,因为我已尝试过。这导致视图根本没有加载。
示例图片:
这可以通过 GeometryReader
来实现。将 ScrollView
包裹在一个中,然后设置 VStack
的宽度。
GeometryReader 是 SwiftUI 的一个超级简单且非常有用的技巧:)
以下是我如何使用您的代码:
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"))
}
}
从 Xcode 11 beta 3 (11M362v) 开始,在构造 ScrollView
时有一个 axes
参数,可以设置为 .horizontal
或 .vertical
ScrollView(.vertical, showsIndicators: true) { ... }
尝试像这样更具体地设置滚动方向
ScrollView(.vertical) {}
虽然在大多数情况下上述答案有效,但 none 对我有用!
在我的例子中,问题是 scrollView children 比 scrollView 宽!
给它们添加静态宽度就成功了。
使用iOS14,Swift5,SwiftUI2.0
这就是答案...您可以在一组中同时使用垂直和水平。
ScrollView([.vertical,.horizontal]) {
....
}