【发布时间】:2021-03-30 15:58:21
【问题描述】:
我有一个 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
}
}
【问题讨论】:
-
这无法测试,您能提供最小的可重现示例吗?
-
@Asperi - 我更改了代码以使其独立。您对如何让 ScrollView 正常工作有什么建议吗?
标签: swift swiftui scrollview