Держите масштаб по центру в центре 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)

Это увеличит высоту и ширину видов на предоставленный масштаб. Теперь вы можете контролировать сумму с помощью распознавателя жестов.

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