Определение направления UIPinchGestureRecognizer (без наклона)

Я использую UIPinchGestureRecognizer, чтобы изменить размеры фреймов в моем приложении. Я бы хотел изменить размеры по высоте и ширине независимо (виды представляют собой прямоугольники в привязке к сетке), и поэтому мне нужно определить, предназначен ли пинч для изменения высоты или ширины.

Первоначально я попытался использовать наклон между двумя точками, как предполагают многие сообщения SO. Что-то вроде этого:

enum ScalingType {
    case widthOnly, heightOnly, widthAndHeight
}

private func determineScaling(loc1: CGPoint, loc2: CGPoint) -> ScalingType {
    let dx = abs(loc1.x - loc2.x)
    let dy = abs(loc1.y - loc2.y)

    if dx > dy {
        return .widthOnly
    } else {
        return .heightOnly
    }
}

Хотя это работает для большинства фигур, оно не работает, когда форма становится очень узкой в ​​любом измерении. Например, если я хочу изменить высоту прямоугольника с небольшой высотой и длинной шириной, пальцы будут двигаться вертикально, но пальцы, вероятно, будут иметь большее горизонтальное расстояние, чем вертикальное.

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

Спасибо

2 ответа

Я предполагаю, что вы сталкиваетесь со сценарием, в котором узкая ширина или высота меньше 44 (44 - рекомендуемое руководство Apple, так как, по-видимому, именно столько пикселей покрывает касание пальцем). Я бы порекомендовал полностью отказаться от UIPinchGesture и использовать вместо него UIPanGesture. Имейте в виду, что это изменит функциональность. Вместо масштабирования вы можете перетаскивать отдельные стороны в масштабе (что-то вроде того, что происходит, когда вы обрезаете изображение в фото-библиотеке iPhone). Используя этот подход, если есть узкая ширина или высота, вам не нужно беспокоиться о том, что два пальца находятся слишком близко (для увеличения) и портят математику

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

Когда он более горизонтален, коэффициент ширины увеличивается или уменьшается.

Когда он более вертикальный, коэффициент высоты увеличивается или уменьшается.

Дайте приведенное ниже объявление func

        @objc func handlePinch(pinch: UIPinchGestureRecognizer)

Затем в теле этой функции убедитесь, что существуют 2 точки касания для защемления, чтобы избежать сбоя.

Затем проверьте величину дельты по осям X и Y.

Это действительно хорошо работает, когда пальцы далеко друг от друга.

                              
      if pinch.numberOfTouches < 2 {
        print("don't crash")
        return
      }

      var touchPoint1 = pinch.location(ofTouch: 0, in: self.view)
      var touchPoint2 = pinch.location(ofTouch: 1, in: self.view)

      let deltaX = abs(touchPoint1.x - touchPoint2.x)
      let deltaY = abs(touchPoint1.y - touchPoint2.y)

      if deltaX > deltaY
      {
        dropRectangleCurrentWidth *= pinch.scale
      }
      else
      {
        dropRectangleCurrentHeight *= pinch.scale
      }

      pinch.scale = 1


Другие вопросы по тегам