【问题标题】:SwiftUI Horizontal ScrollView does not scrollSwiftUI Horizo​​ntal ScrollView 不滚动
【发布时间】: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


【解决方案1】:

通过将视图包装在 ScrollView 内的 HStack 中并设置宽度来解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2022-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    相关资源
    最近更新 更多