Swift-如何将图像平移限制为图像边界

Swift-如何将图像平移限制为图像边界,swift,swiftui,uipangesturerecognizer,Swift,Swiftui,Uipangesturerecognizer,我在HStack中有一个图像,我使用放大手势缩放它(这正在工作)。我还创建了在HStack中平移图像的代码(这也是可行的)。我的问题是: 我想限制pan不超过图像边界(即图像周围不显示任何空白)。即使在缩放图像时,平移也应限制为图像边界 这是我的工作代码: import SwiftUI struct PanMove: View { @State private var scale : CGFloat = 1.0 @State private var lastScaleValue

我在HStack中有一个图像,我使用放大手势缩放它(这正在工作)。我还创建了在HStack中平移图像的代码(这也是可行的)。我的问题是:

我想限制pan不超过图像边界(即图像周围不显示任何空白)。即使在缩放图像时,平移也应限制为图像边界

这是我的工作代码:

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)
        }
    }
}
导入快捷界面
结构PanMove:视图{
@国有-私有var标度:CGFloat=1.0
@国家私有变量lastScaleValue:CGFloat=1.0
@国有-私有var最小刻度:CGFloat=1.0
@国家私有var maxScale:CGFloat=3.0
var body:一些观点{
VStack{
HStack{
SFImageVR()
.scaleEffect(自缩放)
.手势(
(手势)
.onChanged({val in
设delta=val/self.lastScaleValue
self.lastScaleValue=val
让newScale=self.scale*delta
if(newScale>=self.minScale&&newScale-SFImageView{
var imageView=SFImageView(图像:UIImage(名称:“Image1”))
返回图像视图
}
func updateUIView(uiView:SFImageView,context:context){
}
}
类SFImageView:UIImageView、UIgestureRecognitizerDelegate{
重写初始化(映像:UIImage?){
super.init(image:image)
self.isUserInteractionEnabled=true
设置()
}
必需初始化?(编码器:NSCoder){
super.init(编码器:编码器)
}
函数设置(){
让手势=UIPANGestureRecognitor(目标:自我,动作:#选择器(onPan))
手势.minimumNumberOfTouchs=1
signature.delegate=self
self.addgesture识别器(手势)
}
@objc func onPan(发送方:UIPANGESTURE识别器){
guard sender.view!=nil else{return}
如果sender.state==.start | | sender.state==.changed{
让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)
}
}
}