Как: вывести взгляд вперед на кран;установить максимальную / минимальную шкалу жестов;установить ограничение экрана для панорамирования - PullRequest
0 голосов
/ 18 февраля 2019

Примечание: все, что я нашел, слишком старое или слишком сильно отличается от того, что мне действительно нужно, также я перепробовал почти все, что нашел, и ничего не получилось.

Я создал 3 UIViews, я могу перетащить ихвокруг и увеличить их.Теперь мне нужно:

  1. Вывести некоторые из них на передний план: я хочу добавить к каждому из них UITapGesture, который позволяет мне выводить повернутый UIView на передний план, передавая другие UIViews наназад;
  2. Установите максимальную / минимальную шкалу для UIPinchGestureRecognizer, чтобы у меня не было сверхбольших UIiews или крошечных UIViews;
  3. Установите своего рода ограничение экрана для UIPanGestureRecognizer, чтобы я могперетащите мои UIViews за пределы основного вида.

Вот мой код:

https://github.com/marybnq/Views

1 Ответ

0 голосов
/ 20 февраля 2019

Я решил свою проблему!

  1. Я понял, как установить максимальную / минимальную шкалу для UIPinchGestureRecognizer, вот что я сделал.
    var recognizerScale:CGFloat = 1.0
    var maxScale:CGFloat = 1.5
    var minScale:CGFloat = 0.8

    @IBAction func handlePinch(_ pinchGesture: UIPinchGestureRecognizer) {
        guard pinchGesture.view != nil else {return}

        if pinchGesture.state == .began || pinchGesture.state == .changed{
            if (recognizerScale < maxScale && pinchGesture.scale > 1.0) {
                pinchGesture.view?.transform = (pinchGesture.view?.transform)!.scaledBy(x: pinchGesture.scale, y: pinchGesture.scale)
                recognizerScale *= pinchGesture.scale
                pinchGesture.scale = 1.0
            }
            if (recognizerScale > minScale && pinchGesture.scale < 1.0) {
                pinchGesture.view?.transform = (pinchGesture.view?.transform)!.scaledBy(x: pinchGesture.scale, y: pinchGesture.scale)
                recognizerScale *= pinchGesture.scale
                pinchGesture.scale = 1.0
            }
        }
    }
Чтобы вывести виды на передний план, я создал несколько UIPanGestureRecognizer и добавил, чтобы привестиSubviewToFront:
     @IBAction func handlePan1(recognizer:UIPanGestureRecognizer) {
        let translation = recognizer.translation(in: self.view)
        if let view = recognizer.view {
            view.center = CGPoint(x:view.center.x + translation.x,
                                  y:view.center.y + translation.y)
        }
        view.bringSubviewToFront(view1)
        recognizer.setTranslation(CGPoint.zero, in: self.view)
    }

     @IBAction func handlePan2(recognizer:UIPanGestureRecognizer) {
        let translation = recognizer.translation(in: self.view)
        if let view = recognizer.view {
            view.center = CGPoint(x:view.center.x + translation.x,
                                  y:view.center.y + translation.y)
        }
        view.bringSubviewToFront(view2)
        recognizer.setTranslation(CGPoint.zero, in: self.view)
    }

ecc ... НО вы не можете сделать это, еслиВы также хотите ограничить жест панорамирования, поэтому вместо этого вы можете добавить метку жеста-распознавателя:

Добавить жест-распознаватель в свое представление и установить делегата.

@IBAction func tappedView1(recognizer: UITapGestureRecognizer) {
        view.bringSubviewToFront(myView)
    }

По вашему мнению DidLoad:

 let tap = UITapGestureRecognizer(target: self, action: #selector(tappedView1))
        tap.cancelsTouchesInView = false
        self.view.addGestureRecognizer(tap)
Чтобы установить ограничение экрана / ограничение панорамирования, я нашел этот код:
@IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
        let translation = recognizer.translation(in: self.view)
        let statusFrame = UIApplication.shared.statusBarFrame


        if let recognizerView = recognizer.view {
            if recognizerView.frame.origin.x < 0.0 {
                recognizerView.frame.origin = CGPoint(x: 0.0, y: recognizerView.frame.origin.y)
            }
            if recognizerView.frame.origin.y < statusFrame.height {
                recognizerView.frame.origin = CGPoint(x: recognizerView.frame.origin.x, y: statusFrame.height)
            }
            if recognizerView.frame.origin.x + recognizerView.frame.size.width > view.frame.width {
                recognizerView.frame.origin = CGPoint(x: view.frame.width - recognizerView.frame.size.width, y: recognizerView.frame.origin.y)

            }
            if recognizerView.frame.origin.y + recognizerView.frame.size.height > view.frame.height {
                recognizerView.frame.origin = CGPoint(x: recognizerView.frame.origin.x, y: view.frame.height - recognizerView.frame.size.height)
            }
        }

        if let centerX = recognizer.view?.center.x, let centerY = recognizer.view?.center.y {
            recognizer.view?.center = CGPoint.init(x: centerX + translation.x , y: centerY + translation.y)
            recognizer.setTranslation(CGPoint.zero, in: self.view)
        }

        view.bringSubviewToFront(view1)
        recognizer.setTranslation(CGPoint.zero, in: self.view)
}
...