Swift: Как установить максимальное / минимальное значение для панорамирования? - PullRequest
0 голосов
/ 20 марта 2019

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

Мне нужно установить ограничение экрана для UIView, которое я могу перетащить вокруг своего основного вида (чтобы я не мог перетащить его за пределы вида). Кроме того, я хотел бы знать, как настроить ограничение экрана для разных устройств.

@IBAction func handlePan(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)
}
recognizer.setTranslation(CGPoint.zero, in: self.view)
}

1 Ответ

0 голосов
/ 23 марта 2019

Ниже показано, как панорамировать элемент управления UILabel на главном виде контроллера представления (UIViewController) и как ограничить его перемещение в пределах видимых границ последнего.Обратите внимание, что строка состояния считается видимой.Поэтому верхняя граница определяется высотой строки состояния.

import UIKit

class ViewController: UIViewController {
    // MARK: - Variables

    // MARK: - IBOutlet
    @IBOutlet weak var label: UILabel!

    // MARK: - IBAction

    // MARK: - Life cycle
    override func viewDidLoad() {
        super.viewDidLoad()

        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
        label.isUserInteractionEnabled = true
        label.addGestureRecognizer(panGesture)
    }

    @objc func handlePan(_ sender: UIPanGestureRecognizer) {
        let translation = sender.translation(in: self.view)
        let statusFrame = UIApplication.shared.statusBarFrame

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

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