Swift - Как ограничить панорамирование изображения до границ изображения - PullRequest
2 голосов
/ 13 апреля 2020

У меня есть изображение внутри 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)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...