Я хочу одновременно масштабировать и переводить CALayer из одного CGrect (маленького, от кнопки) в другой (больший, отцентрированный, для представления). По сути, идея состоит в том, что пользователь прикасается к кнопке, и с нее CALayer открывает, переводит и масштабируется, чтобы в итоге оказаться в центре экрана. Затем CALayer (через другую кнопку) сжимается до положения и размера кнопки.
Я оживляю это с помощью матриц CATransform3D. Но CALayer на самом деле является поддерживающим слоем для UIView (потому что мне также нужны функции Responder). И хотя применение моих масштабных трансформаций или трансляций по отдельности работает нормально. Объединение обоих (перевод с последующим масштабированием) смещает положение слоя, так что он не выравнивается с кнопкой при его сжатии.
Я предполагаю, что это потому, что точка привязки CALayer по умолчанию находится в его центре. Преобразование сначала применяет перевод, перемещая «большой» CALayer для выравнивания с кнопкой в верхнем левом углу их фреймов. Затем, когда происходит масштабирование, поскольку точка привязки CALayer находится в центре, все направления масштабируются вниз к ней. На данный момент мой слой - это размер кнопки (то, что я хочу), но позиция смещена (потому что все точки сжимаются к центру слоя).
Имеет смысл?
Итак, я пытаюсь выяснить, нужно ли вместо объединения перевода + масштаба:
перевести
измените точку привязки на верхний левый угол.
масштаб.
Или, если я смогу придумать какой-то коэффициент или константу для включения в значения матрицы трансляции, чтобы она транслировалась в смещение позиции на то, что, в свою очередь, смещается при последующем масштабировании, и тогда конечная позиция будет правильно.
Есть предположения?