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

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

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

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

Имеет смысл?

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

translate

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

scale.

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

Есть мысли?

1 Ответ

7 голосов
/ 27 января 2012

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

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

- (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 имеют такое же суперпредставление.

...