Держите масштаб по центру в центре UIView (в отличие от масштабирования из левого верхнего угла)
Я реализую масштабирование на основе пинча, и масштабирование происходит в верхнем левом углу вида, а не в масштабе от центра. После нескольких попыток (это похоже на проблему происхождения cs и т. П.) Не удалось найти хорошего решения для этого, но должен быть какой-то (возможно, очевидный) способ масштабирования от центра представления. Если на этот вопрос уже был дан ответ, был бы признателен указатель на ответ (не найден после продолжительного поиска). Если нет, будем признательны за информацию о правильном подходе.
Отредактируйте следующие ответы (спасибо): Вот код, который я изначально использовал:
func pinchDetected (pinchGestureRecognizer: UIPinchGestureRecognizer) {
let scale = pinchGestureRecognizer.scale
view.transform = CGAffineTransformScale(view.transform, scale, scale)
pinchGestureRecognizer.scale = 1.0
}
При сжатии содержимое внутри представления будет расширяться вправо и вниз, в отличие от того же + влево и вверх (отсюда предположение, что оно не масштабируется "от центра"). Надеюсь, это прояснит ситуацию.
3 ответа
Трудно понять, что происходит, не видя ваш код. По умолчанию преобразования действуют в центре просмотра, что, по-видимому, является тем, что вам нужно. Вы можете заставить преобразования действовать в другой точке, изменив свойство anchorPoint на слое представлений.
Или вы можете создать преобразование в произвольной точке, переведя начало координат в эту точку, выполнив преобразование и вернув обратно. например:
func *(left: CGAffineTransform, right: CGAffineTransform) -> CGAffineTransform {
return left.concatenating(right)
}
public extension CGAffineTransform {
static func scale(_ scale:CGFloat, aboutPoint point:CGPoint) -> CGAffineTransform {
let Tminus = CGAffineTransform(translationX: -point.x, y: -point.y)
let S = CGAffineTransform(scaleX: scale, y: scale)
let Tplus = CGAffineTransform(translationX: point.x, y: point.y)
return Tminus * S * Tplus
}
}
view.transform = CGAffineTransform.scale(2.0, aboutPoint:point)
где точка относительно начала координат, которая по умолчанию является центром.
Вы должны иметь возможность просто использовать код в этом вопросе, чтобы увеличить его из центра. Если вы хотите, чтобы он увеличивал изображение с пальцев, посмотрите ответ на этот вопрос.
Это код, который вы ищете
view.transform = CGAffineTransformScale(view.transform, 1.1, 1.1);
или в Свифте
view.transform = view.transform.scaledBy(x: 1.1, y: 1.1)
Это увеличит высоту и ширину видов на предоставленный масштаб. Теперь вы можете контролировать сумму с помощью распознавателя жестов.