Щепотка Жест не работает с SKCameraNode
Я работаю со Swift 4, используя SpriteKit с SKTileMapNode и SKCameraNode. Я хочу иметь возможность панорамировать / сжимать / масштабировать узел карты тайлов с помощью камеры. У меня хорошо работает панорамирование, но у меня возникают проблемы с масштабированием.
Пока я могу заставить себя работать. Он сбрасывает размер каждый раз, когда происходит другое повышение. Так, например, я уменьшу его, затем снова ущипну, и как только я коснусь экрана, он увеличится в размере. Это позволяет мне ущипнуть снова, чтобы увеличить / уменьшить, но не в зависимости от размера, который я сделал в предыдущем пинче. Я думаю, что мне может понадобиться сохранить масштаб изменения размера и использовать его, но не знаю, как это сделать.
Мой масштабирование щепотка обратная. Когда я ущипну, чтобы увеличить изображение, оно уменьшится и наоборот.
Когда я достигаю предела шкалы мин / макс, он перестает идти дальше, но заикается, когда достигает предела.
Вот моя функция для обработки щепотка:
@objc func handlePinch(pinchGesture: UIPinchGestureRecognizer) {
if pinchGesture.state == .began || pinchGesture.state == .changed {
let currentScale: CGFloat = (camera?.xScale)!
let minScale: CGFloat = 0.5
let maxScale: CGFloat = 2.0
let zoomSpeed: CGFloat = 0.5
var deltaScale = pinchGesture.scale
deltaScale = ((deltaScale - 1) * zoomSpeed) + 1
deltaScale = min(deltaScale, maxScale / currentScale)
deltaScale = max(deltaScale, minScale / currentScale)
camera?.xScale = deltaScale
camera?.yScale = deltaScale
}
}
Дайте мне знать, если у вас есть какие-либо предложения, поскольку я осмотрел кучу, и я не могу найти примеров, когда люди используют SKCameraNode. Примеры, которые я нахожу, либо я не могу получить работу, пытаясь преобразовать из вида в камеру, либо они не дают щепотку пример. Любая помощь будет принята с благодарностью!
1 ответ
Пока я могу заставить себя работать. Он сбрасывает размер каждый раз, когда происходит другое повышение. Так, например, я уменьшу его, затем снова ущипну, и как только я коснусь экрана, он увеличится в размере. Это позволяет мне ущипнуть снова, чтобы увеличить / уменьшить, но не в зависимости от размера, который я сделал в предыдущем пинче. Я думаю, что мне может понадобиться сохранить масштаб изменения размера и использовать его, но не знаю, как это сделать.
Это потому, что распознаватель жестов сохраняет свои свойства между распознаваниями. Вы можете сбросить scale
когда жест заканчивается Например, вы можете начать свой метод с чего-то вроде:
guard pinchGesture.state != .ended else {
pinchGesture.scale = 0
return
}
Мой масштабирование щепотка обратная. Когда я ущипну, чтобы увеличить изображение, оно уменьшится и наоборот.
От SKCameraNode
документы:
Таким образом, положение камеры, масштаб и вращение всегда оказывают противоположное влияние на отображение сцены. Например, если камера смещена на 10 пикселей вправо, сцена отображается так, как будто все остальное сместилось на 10 пикселей влево. И аналогично, если узел камеры имеет
xScale
а такжеyScale
2,0, то сцена визуализируется так, как если бы каждое расстояние было вдвое меньше нормального размера, эффективно увеличивая видимую область области просмотра камеры.
Я не уверен, какой именно эффект вы ищете, но вы можете попробовать инвертировать шкалу распознавателя жестов, разделив одну на нее, например:
var deltaScale = pinchGesture.scale / 1
camera?.xScale = deltaScale
camera?.yScale = deltaScale
Когда я достигаю предела шкалы мин / макс, он перестает идти дальше, но заикается, когда достигает предела.
Не уверен, не видя определенных значений, но возможно это вызвано проблемами округления. Вы можете не касаться SKCameraNode
если вы вне диапазона. Вы можете попробовать такой подход:
var deltaScale = pinchGesture.scale / 1
guard deltaScale > minScale && deltaScale < maxScale else { return }
camera?.xScale = deltaScale
camera?.yScale = deltaScale