Ограничить максимальный масштаб для масштабирования изображения с жестом повышения в IOS - PullRequest
4 голосов
/ 13 апреля 2011

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

Я использовал образец SimpleGestureRecognizers от Apple, которая устанавливает масштаб на 1 и позволяет очень легко масштабировать изображение, но когда я его удаляю, оно скачет внезапно, что нехорошо.Но тогда трудно отследить масштаб, поскольку он всегда установлен в 1.

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 13 апреля 2011

UIKit будет многократно вызывать ваш метод выбора для одного пользовательского жеста (пинч.) Каждый вызов будет представлять небольшое увеличение (или уменьшение) в масштабе.Если вы обрабатываете каждый вызов метода и соответственно масштабируете свое изображение для каждого небольшого приращения, вы получите плавную анимацию.

Вы используете свойство масштаба распознавателя для изменения изображения.Затем вы сбрасываете свойство в 1.0, чтобы при следующем вызове метода селектора свойство scale представляло только новый небольшой шаг с момента последнего.Вы снова масштабируете свое изображение с новым небольшим приращением и сбрасываете до 1,0.Если вы не сбросите масштаб распознавателя и будете использовать его для изменения масштаба изображения, вы будете масштабировать свое изображение путем накопительного изменения, что приведет к скачкообразному поведению (и неправильному масштабированию.)

Итак, убедитесь, чточтобы сбросить масштаб распознавателя жестов на 1. Чтобы отследить общее изменение масштаба, вы можете создать переменную экземпляра, возможно, также называемую «масштаб», для вашего UIImageView или вашего ViewController.(На самом деле, если вы использовали эту новую переменную масштаба в drawRect для рисования вашего изображения, вам нужно будет только добавить вызов setNeedsDisplay в сеттере. И вам не нужно будет писать код для перерисовки изображения при изменении масштаба.)

В любом случае следующий код (включающий проверку предела Равина, но с новой переменной масштаба) должен работать для вашего метода выбора:

- (void)pinch:(UIPinchGestureRecognizer *)recognizer
{
    if (recognizer.state == UIGestureRecognizerStateChanged ||
        recognizer.state == UIGestureRecognizerStateEnded) {
        if (imageView.scale < yourScaleLimit) {
            imageView.scale *= recognizer.scale;
            //any other code to scale up the image if
            //just changing imageView.Scale is not enough
        }
        recognizer.scale = 1.0;
    }
}

Надеюсь, это полезно.

1 голос
/ 10 июля 2018

Если вы делаете это только в одном месте и не хотите использовать подкласс UIView или UIImageView, вы можете создать несколько локальных переменных для достижения того же результата.

Swift

// Variables to keep track of the scale
var imageViewScale: CGFloat = 1.0
let maxScale: CGFloat = 4.0
let minScale: CGFloat = 0.5

@objc func handlePinchGesture(recognizer: UIPinchGestureRecognizer) {

    if recognizer.state == .began || recognizer.state == .changed {
        let pinchScale: CGFloat = recognizer.scale

        if imageViewScale * pinchScale < maxScale && imageViewScale * pinchScale > minScale {
            imageViewScale *= pinchScale
            imageView.transform = (imageView.transform.scaledBy(x: pinchScale, y: pinchScale))
        }
        recognizer.scale = 1.0
    }
}

Жесты жесткости обработки документации Apple

0 голосов
/ 13 апреля 2011

В методе выбора gestureRecognizer проверьте scale свойство sender (UIPinchGestureRecognizer), если оно меньше, чем вы хотите масштабировать, примените масштабирование к изображению, иначе не используйте. Например, следующий метод: selector для pinchGesture затем.

-(void)pinchAction:(UIPinchGestureRecognizer *)sender
{
   if(sender.scale<yourScaleLimit)
   {
     //scale up the image
   }

}

Спасибо

...