SwiftUI 中 ScrollView 的图像大小限制是多少?

Posted

技术标签:

【中文标题】SwiftUI 中 ScrollView 的图像大小限制是多少?【英文标题】:What is the image size limitation for ScrollView in SwiftUI? 【发布时间】:2020-04-16 02:09:01 【问题描述】:

我正在尝试为大小为 30,000 x 1800 的大图像创建可滚动的图像。当我将图像添加到资产并在 ContentView 中引用它时,什么都没有显示。较小的图像 (640 x 480) 显示并可滚动。

代码如下:

struct ContentView: View 
    @State var scale: CGFloat = 1.0
    @State var isTapped: Bool = false
    @State var pointTapped: CGPoint = CGPoint.zero
    @State var draggedSize: CGSize = CGSize.zero
    @State var previousDragged: CGSize = CGSize.zero
    var body: some View 
        GeometryReader reader in
            Image("scroll")
                .resizable()
                .scaledToFit()
                .animation(.default)
                .offset(x: self.draggedSize.width, y: 0)
                .scaleEffect(self.scale)
                .scaleEffect(self.isTapped ? 2 : 1, anchor: UnitPoint(x: self.pointTapped.x / reader.frame(in: .global).maxX, y: self.pointTapped.y / reader.frame(in: .global).maxY))
                .gesture(TapGesture(count: 2)
                    .onEnded(
            self.isTapped = !self.isTapped
        ).simultaneously(with: DragGesture(minimumDistance: 0, coordinateSpace: .global).onChanged( (value) in
            self.pointTapped = value.startLocation
            self.draggedSize = CGSize(width: value.translation.width + self.previousDragged.width, height: value.translation.height + self.previousDragged.height)
//            print(value.startLocation)
        ).onEnded( (value) in
//            print(value.location)
            let offsetWidth = (reader.frame(in: .global).maxX * self.scale - reader.frame(in: .global).maxX) / 2
            let newDraggedWidth = self.draggedSize.width * self.scale
            if (newDraggedWidth > offsetWidth) 
                self.draggedSize = CGSize(width: offsetWidth / self.scale, height: value.translation.height + self.previousDragged.height)
             else if (newDraggedWidth < -offsetWidth) 
                self.draggedSize = CGSize(width: -offsetWidth / self.scale, height: value.translation.height + self.previousDragged.height)
             else 
                self.draggedSize = CGSize(width: value.translation.width + self.previousDragged.width, height: value.translation.height + self.previousDragged.height)
            
            self.previousDragged = self.draggedSize
            ))).gesture(MagnificationGesture().onChanged( (scale) in
            self.scale = scale.magnitude
        ).onEnded( (scaleFinal) in
            self.scale = scaleFinal.magnitude
        ))
        
    

【问题讨论】:

【参考方案1】:

尝试添加到图像:

.renderingMode(.original)

就在之前

.resizable()

【讨论】:

它仍然是空白的并且没有控制台错误。 尝试删除“.resizable()” 更新。删除“.resizable()”允许我在 macos(催化剂)中显示我的大图像。但是在我的 iPhone 10 上它崩溃了。也许这对小东西来说太过分了。 我可以在 Swift 中很好地显示它,但是使用 SwiftUI,我仍然会得到一个白屏,不管有没有 .resizable()。谢谢。

以上是关于SwiftUI 中 ScrollView 的图像大小限制是多少?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中 ScrollView 的图像大小限制是多少?

远程图像使用 List 正确加载,但在使用带有嵌入式 VStack 的 ScrollView 和 SwiftUI 时不加载

在 SwiftUI 中,如何通过动态变化的滚动区域来缩放 scrollView 内的内容?

SwiftUI 的问题:带有按钮的垂直滚动视图

SwiftUI:奇怪的行为 ScrollView

SwiftUI:调整 ScrollView 的边界