Ограничить максимальный масштаб для масштабирования изображения с помощью жеста сжатия в IOS

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

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

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


person Sola    schedule 13.04.2011    source источник


Ответы (3)


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

Вы используете свойство масштаба распознавателя, чтобы изменить свое изображение. Затем вы сбрасываете свойство на 1,0, чтобы при следующем вызове метода селектора свойство масштаба представляло только новое небольшое приращение с момента последнего. Вы снова масштабируете изображение с новым небольшим приращением и сбрасываете значение до 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;
    }
}

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

person salo.dm    schedule 13.04.2011
comment
Здесь imageView не поддерживает свойство .scale. Любая альтернатива этой ошибке? - person Hemang; 01.10.2012
comment
@Hemang: обратите внимание на третий абзац выше. imageView.scale относится к переменной экземпляра, которую вы создаете в подклассе UIImageView для отслеживания совокупного изменения масштаба. В качестве альтернативы вы можете создать такую ​​переменную экземпляра в своем контроллере представления, а затем ссылаться на нее как self.imageViewScale. В любом случае вам нужна новая переменная, чтобы отслеживать кумулятивное изменение масштаба. - person salo.dm; 03.10.2012
comment
Спасибо за вашу помощь. Я пропустил, чтобы прочитать эту часть 3-го абзаца. Так что я сделал ошибку. Спасибо. Код работает нормально. - person Hemang; 06.10.2012

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

Свифт

// 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 по обработке жестов щипком

person DoesData    schedule 09.07.2018

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

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

}

Спасибо,

person Ravin    schedule 13.04.2011
comment
масштаб является относительным значением между двумя вызовами pinchAction и устанавливается в 1 после каждого вызова pinchAction. Так что это не абсолютное соотношение между вашим исходным размером представления и вашим текущим размером представления. - person Seega; 13.04.2011