При разработке с SwiftUI я использую Image () и хотел бы иметь возможность не только увеличивать его, что я сейчас делаю, но хотел бы увеличивать его различные области и перемещаться по ним. в разные районы. Кажется, я могу увеличить его только из одной области в качестве источника увеличения (в центре), но хотел бы увеличить масштаб с того места, с которого начался жест, так сказать. Вот код на данный момент:
ScrollView([.horizontal, .vertical]) {
Image(uiImage: UIImage(data: self.document.image)!)
.resizable()
.scaledToFit()
.padding()
.cornerRadius(8)
.scaleEffect(self.scale, anchor: .center)
.frame(width: geo.size.width, height: geo.size.height, alignment: .center)
.gesture(MagnificationGesture()
.onChanged { val in
let delta = (val / self.lastScale)
self.lastScale = val
self.scale = (self.scale * delta)
}
.onEnded { val in
self.lastScale = 1.0
}
)
.onTapGesture(count: 2) {
self.scale = 1.0
self.lastScale = 1.0
}
}
.frame(width: geo.size.width - 50, height: geo.size.height - 90, alignment: .center)
.clipped()
Любая помощь по этому вопросу будет принята с благодарностью.
ОБНОВЛЕНО Код, кажется, помогает мне:
Image(uiImage: UIImage(data: self.document.image)!)
.resizable()
.scaledToFill()
.padding()
.cornerRadius(10)
.scaleEffect(self.finalAmount + self.currentAmount)
.offset(x: self.currentPosition.width, y: self.currentPosition.height)
.frame(width: geo.size.width, height: geo.size.height, alignment: .center)
.clipped()
.scaleEffect(1.15)
.sheet(isPresented: self.$isSheetActive) {
ShareSheet(activityItems: [self.MakeImageFileToShare(uiimage: UIImage(data: self.document.image)!)])
}
.gesture(MagnificationGesture()
.onChanged { value in
if self.finalAmount + value - 1 >= 1 {
self.currentAmount = value - 1
}
}
.onEnded { amount in
self.finalAmount += self.currentAmount
self.currentAmount = 0
}
.simultaneously(with: DragGesture()
.onChanged({ value in
self.currentPosition = CGSize(width: value.translation.width + self.newPosition.width, height: value.translation.height + self.newPosition.height)
})
.onEnded ({ value in
self.currentPosition = CGSize(width: value.translation.width + self.newPosition.width, height: value.translation.height + self.newPosition.height)
self.newPosition = self.currentPosition
})))