Какое ограничение размера изображения для ScrollView в SwiftUI? - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь создать прокручиваемое изображение для больших изображений размером 30 000 на 1800. Когда я добавляю изображение в Assets и ссылаюсь на него в 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 Ответ

0 голосов
/ 16 апреля 2020

попробуйте добавить к изображению:

.renderingMode(.original)

непосредственно перед

.resizable()
...