Как составить матрицы CATransform3D Core Animation для анимации синхронного перевода и масштабирования

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

Я оживляю это с помощью матриц CATransform3D. Но CALayer на самом деле является поддерживающим слоем для UIView (потому что мне также нужны функции Responder). И хотя применение моих масштабных трансформаций или трансляций по отдельности работает нормально. Объединение обоих (перевод с последующим масштабированием) смещает положение слоя, так что он не выравнивается с кнопкой при его сжатии.

Я предполагаю, что это потому, что точка привязки CALayer по умолчанию находится в его центре. Преобразование сначала применяет перевод, перемещая «большой» CALayer для выравнивания с кнопкой в ​​верхнем левом углу их фреймов. Затем, когда происходит масштабирование, поскольку точка привязки CALayer находится в центре, все направления масштабируются вниз к ней. На данный момент мой слой - это размер кнопки (то, что я хочу), но позиция смещена (потому что все точки сжимаются к центру слоя).

Имеет смысл?

Итак, я пытаюсь выяснить, нужно ли вместо объединения перевода + масштаба:

перевести

измените точку привязки на верхний левый угол.

масштаб.

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

Есть предположения?


person SaldaVonSchwartz    schedule 27.01.2012    source источник


Ответы (1)


Вы должны опубликовать свой код. Как правило, нам намного легче помочь вам, когда мы можем посмотреть на ваш код.

Во всяком случае, это работает для меня:

- (IBAction)showZoomView:(id)sender {
    [UIView animateWithDuration:.5 animations:^{
        self.zoomView.layer.transform = CATransform3DIdentity;
    }];
}

- (IBAction)hideZoomView:(id)sender {
    CGPoint buttonCenter = self.hideButton.center;
    CGPoint zoomViewCenter = self.zoomView.center;
    CATransform3D transform = CATransform3DIdentity;
    transform = CATransform3DTranslate(transform, buttonCenter.x - zoomViewCenter.x, buttonCenter.y - zoomViewCenter.y, 0);
    transform = CATransform3DScale(transform, .001, .001, 1);
    [UIView animateWithDuration:.5 animations:^{
        self.zoomView.layer.transform = transform;
    }];
}

В моем тестовом примере self.hideButton и self.zoomView имеют одинаковый супервизор.

person rob mayoff    schedule 27.01.2012
comment
Спасибо! да .. в центре собственности;) Я полностью упустил из виду. А насчет того, чтобы не публиковать код, я просто подумал, что это скорее концептуальный вопрос, поэтому публикация кода не добавит ничего к этому вопросу. Хотя через ваш код я понял, что мог бы использовать это свойство. Еще раз спасибо! - person SaldaVonSchwartz; 27.01.2012