如何解决SwiftUI Horizontal ScrollView 不滚动
我有一个 ScrollView,我在其中放置了许多不同的视图。虽然滚动视图不滚动 - 它从内容视图的极端反弹。我手动放置视图的脸是问题吗?有没有办法像在 UIKit 中一样设置滚动视图内容视图宽度?
我已将此处的代码更新为独立版本。放置视图的功能与以前相同。滚动视图的行为也相同...
import SwiftUI
struct ContentView: View {
var circleArray: [CircleView] = [CircleView(id:1),CircleView(id:2),CircleView(id:3),CircleView(id:4),CircleView(id:5),CircleView(id:6),CircleView(id:7),CircleView(id:8),CircleView(id:9),CircleView(id:10),CircleView(id:11),CircleView(id:12),CircleView(id:13),CircleView(id:14),CircleView(id:15),CircleView(id:16),CircleView(id:17),CircleView(id:18),CircleView(id:19),CircleView(id:20),CircleView(id:21),CircleView(id:22),CircleView(id:23),CircleView(id:24),CircleView(id:25)]
var body: some View
{
ScrollView(.horizontal,showsIndicators: false)
{
GeometryReader
{
scrollViewGeometry in
ForEach(circleArray)
{ circle in
let circleFrame = getFrameFor(circle: circle,minWidth: 75)
ZStack()
{
Circle().fill(Color.red)
}
.position(x: circleFrame.origin.x,y: scrollViewGeometry.size.height - (circleFrame.size.height/2) - circleFrame.origin.y)
.frame(width: circleFrame.size.width,height: circleFrame.size.height,alignment:.center)
}
}
}.padding()
}
func getFrameFor(circle: CircleView,minWidth:CGFloat) -> CGRect
{
var thisFrame = CGRect()
var frameWidth = minWidth
let numberOfHexagonsWide = sqrt(Double(25)) + floor(Double(sqrt(Double(25))/2))
let widthOfHexagonViews = (Double(frameWidth) * 0.8) * numberOfHexagonsWide
let xMargin = (Double(frameWidth) - widthOfHexagonViews) / 12
var xStartingPosition = 0
var xPosition = 0
var yStartingPosition = 1
var yPosition = 1
var yEndPosition = 1
if minWidth < 75
{
frameWidth = 75
}
for index in 0...24
{
let actualXPosition = Double(xPosition) * (0.5 * Double(frameWidth))
let actualYPosition = Double(yPosition) * (0.8 * Double(frameWidth)) + (0.2 * Double(frameWidth))
thisFrame = CGRect(x: actualXPosition + xMargin,y: actualYPosition,width: Double(frameWidth),height: Double(frameWidth))
if yPosition == yEndPosition
{
if Double(yStartingPosition) < sqrt(Double(25))
{
yStartingPosition += 1
xStartingPosition += 1
}
else
{
yEndPosition += 1
xStartingPosition += 2
}
yPosition = yStartingPosition
xPosition = xStartingPosition
}
else
{
xPosition += 1
yPosition -= 1
}
if circle.id - 1 == index
{
return thisFrame
}
}
return thisFrame
}
struct CircleView: Identifiable
{
var id: Int
}
}
解决方法
通过将视图包装在 ScrollView 内的 HStack 中并设置宽度来解决。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。