У меня есть изображение внутри HStack, которое я масштабирую, используя MagnificationGesture (это работает). Я также создал код для панорамирования изображения в HStack (это также работает). У меня проблема:
Я бы хотел ограничить панорамирование, чтобы оно не превышало границы изображения (ie не отображает пустое пространство вокруг изображения). Даже когда я масштабирую изображение, панорамирование должно быть ограничено границами изображения.
Вот мой рабочий код:
import SwiftUI
struct PanMove: View {
@State private var scale : CGFloat = 1.0
@State private var lastScaleValue : CGFloat = 1.0
@State private var minScale : CGFloat = 1.0
@State private var maxScale : CGFloat = 3.0
var body: some View {
VStack {
HStack {
SFImageVR()
.scaleEffect(self.scale)
.gesture(
MagnificationGesture()
.onChanged({ val in
let delta = val/self.lastScaleValue
self.lastScaleValue = val
let newScale = self.scale * delta
if (newScale >= self.minScale && newScale <= self.maxScale) {
self.scale = newScale
}
})
.onEnded({ scale in
self.lastScaleValue = 1.0
})
)
}
.frame(width: 300, height: 450, alignment: .center)
.border(Color.black, width: 1)
.clipped()
}
}
}
struct SFImageVR: UIViewRepresentable {
typealias UIViewType = SFImageView
func makeUIView(context: Context) -> SFImageView {
var imageView = SFImageView(image: UIImage(named: "Image1"))
return imageView
}
func updateUIView(_ uiView: SFImageView, context: Context) {
}
}
class SFImageView: UIImageView, UIGestureRecognizerDelegate {
override init(image: UIImage?) {
super.init(image: image)
self.isUserInteractionEnabled = true
setup()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
func setup(){
let gesture = UIPanGestureRecognizer(target: self, action: #selector(onPan))
gesture.minimumNumberOfTouches = 1
gesture.delegate = self
self.addGestureRecognizer(gesture)
}
@objc func onPan(sender: UIPanGestureRecognizer) {
guard sender.view != nil else { return }
if sender.state == .began || sender.state == .changed {
let translation = sender.translation(in: self)
sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
sender.setTranslation(CGPoint.zero, in: self)
}
}
}