Ограничить движение панорамирования от перемещения за пределы левой и правой сторон рамки экрана - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть изображение, которое появляется в центре экрана. Вы можете ущипнуть, чтобы увеличить или уменьшить изображение, а также переместить его по горизонтали. Все эти действия работают отлично. Однако я хочу ограничить движения панорамирования, чтобы пользователи не могли проводить пальцем за левый или правый край изображения. Ниже я разместил скриншоты вместе с объяснениями, чтобы показать, что я имею в виду

Исходный вид

Original view

Изображение смещено вправо. В данный момент вы можете видеть, что можете переместить его за левый край изображения, и оно показывает черное пространство черным. Если ширина изображения равна ширине экрана, то я, очевидно, хочу, чтобы жест панорамирования был отключен

enter image description here

Изображение увеличено в

enter image description here

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

enter image description here

Я пытался осмотреться, но не могу найти ничего, что могло бы помочь с моей конкретной проблемой. Я разместил мой код ниже. Любая помощь приветствуется! Заранее спасибо

func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
    guard let zoomView = gestureRecognizer.view else{return}

    if gestureRecognizer.state == UIGestureRecognizerState.began || gestureRecognizer.state == UIGestureRecognizerState.changed {
        let translation = gestureRecognizer.translation(in: self.view)
        if(gestureRecognizer.view!.center.x < 300) {
             gestureRecognizer.view!.center = CGPoint(x:gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y)

        }else{

        gestureRecognizer.view!.center = CGPoint(x:299, y: gestureRecognizer.view!.center.y)

        }
        gestureRecognizer.setTranslation(CGPoint.zero, in: zoomView) 
    }
}

1 Ответ

0 голосов
/ 27 апреля 2018

Я последовал этому видео на YouTube , чтобы сделать это.

Я не могу помочь вам с масштабированием, но я могу помочь вам предотвратить перемещение imageView за пределы левой и правой сторон, когда НЕ масштабировать.

Вы не дали никакого контекста относительно того, был ли ваш imageView создан в раскадровке или программно. Тот, что в моем примере, является программным и называется orangeImageView.

Создайте новый проект, затем просто скопируйте и вставьте этот код в View Controller. Когда вы запустите проект, вы увидите оранжевое изображение, которое вы можете перемещать, но оно не выходит за пределы левой или правой части экрана. Я не беспокоился о верхней или нижней части, потому что это не было частью вашего вопроса.

Выполните шаги 1 - 8 внутри @objc func panGestureHandler(_ gestureRecognizer: UIPanGestureRecognizer) для объяснения того, что делает каждый шаг и как он работает.

Замените orangeImageView на imageView, который вы используете:

class ViewController: UIViewController {

// create frame in viewDidLoad
let orangeImageView: UIImageView = {
    let imageView = UIImageView()
    imageView.isUserInteractionEnabled = true
    imageView.backgroundColor = .orange
    return imageView
}()

var panGesture: UIPanGestureRecognizer!

override func viewDidLoad() {
    super.viewDidLoad()

    // create a frame for the orangeImageView and add it as a subview
    orangeImageView.frame = CGRect(x: 50, y: 50, width: 100, height: 100)
    view.addSubview(orangeImageView)

    // initialize the pangesture and add it to the orangeImageView
    panGesture = UIPanGestureRecognizer(target: self, action: #selector(panGestureHandler(_:)))
    orangeImageView.addGestureRecognizer(panGesture)
}

@objc func panGestureHandler(_ gestureRecognizer: UIPanGestureRecognizer){

    // 1. use these values to restrict the left and right sides so the orangeImageView won't go beyond these points
    let leftSideRestrction = self.view.frame.minX
    let rightSideRestriction = self.view.frame.maxX

    // 2. use these values to redraw the orangeImageView's correct size in either Step 6 or Step 8 below
    let imageViewHeight = self.orangeImageView.frame.size.height
    let imageViewWidth = self.orangeImageView.frame.size.width

    if gestureRecognizer.state == .changed || gestureRecognizer.state == .began {

        let translation: CGPoint = gestureRecognizer.translation(in: self.view)
        gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x  + translation.x, y: gestureRecognizer.view!.center.y + translation.y)
        gestureRecognizer.setTranslation(CGPoint.zero, in: self.view)

        /*
         3.
         -get the the upper left hand corner of the imageView's X and Y origin to get the current location of the imageView as it's dragged across the screen.
         -you need the orangeImageView.frame.origin.x value to make sure it doesn't go beyond the left or right edges
         -you need the orangeImageView.frame.origin.y value to redraw it in Steps 6 and 8 at whatever Y position it's in when it hits either the left or right sides
        */
        let imageViewCurrentOrginXValue = self.orangeImageView.frame.origin.x
        let imageViewCurrentOrginYValue = self.orangeImageView.frame.origin.y

        // 4. get the right side of the orangeImageView. It's computed using the orangeImageView.frame.origin.x + orangeImageView.frame.size.width
        let imageViewRightEdgePosition = imageViewCurrentOrginXValue + imageViewWidth

        // 5. if the the orangeImageView.frame.origin.x touches the left edge of the screen or beyond it proceed to Step 6
        if imageViewCurrentOrginXValue <= leftSideRestrction {

            // 6. redraw the orangeImageView's frame with x: being the far left side of the screen and Y being where ever the current orangeImageView.frame.origin.y is currently positioned at
            orangeImageView.frame = CGRect(x: leftSideRestrction, y: imageViewCurrentOrginYValue, width: imageViewWidth, height: imageViewHeight)
        }

        // 7. if the the orangeImageView.frame.origin.x touches the right edge of the screen or beyond it proceed to Step 8
        if imageViewRightEdgePosition >= rightSideRestriction{

            // 8. redraw the orangeImageView's frame with x: being the rightSide of the screen - the orangeImageView's width and y: being where ever the current orangeImageView.frame.origin.y is currently positioned at
            orangeImageView.frame = CGRect(x: rightSideRestriction - imageViewWidth, y: imageViewCurrentOrginYValue, width: imageViewWidth, height: imageViewHeight)
        }
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...