UIVIew анимация - масштабирование + перевод

У меня есть представление, которое я хочу масштабировать и переводить в новое место, анимируя его. Я попытался добиться этого с помощью следующего кода:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kDurationForFullScreenAnimation];
[[self animatingView] setFrame:finalRect];
[UIView commitAnimations];

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

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

Какое наиболее подходящее решение этой проблемы, также, почему в первом случае эта проблема возникает?

Спасибо

Ответ 1

Установка рамки не имеет ни масштаба, ни перевода. Вы используете неправильную терминологию или используете неправильный инструмент для работы. Масштабирование и перевод выполняются с использованием преобразований Core Graphics Affine, когда вы хотите повлиять на UIView (в отличие от уровня, использующего преобразования Core Animation).

Для масштабирования вида используйте

// 2x
[rotationView setTransform:CGAffineTransformMakeScale(2.0, 2.0)];

Для перевода используйте

// Move origin by 100 on both axis
[rotationView setTransform:CGAffineTransformMakeTranslation(100.0, 100.0)];

Чтобы оживить их, заверните их в блок анимации. Если вы хотите преобразовать представление с обоими из них, то вам необходимо их конкатенировать.

Если вы вообще не хотите масштабирования и трансляции (трансформирует), то что вы имеете в виду - вы хотите изменить границы и положение обзора. Они меняются при звонках на

[view setBounds:newRect];
[view setCenter:newCenter];

Где newRect и newCenter являются CGRect и CGPoint соответственно, которые представляют новую позицию на экране. Опять же, они должны быть завернуты в блок анимации.

Ответ 2

Вот пример анимации блока:

CGPoint newCenter = CGPointMake(100.0,100.0);

[UIView animateWithDuration: 1
                      delay: 0
                    options: (UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)
                 animations:^{object.center = newCenter ; object.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0);}
                 completion:^(BOOL finished) { }
];

Ответ 3

Попробуйте это решение:

  CGAffineTransform s =  CGAffineTransformMakeScale(0.5f,0.5f);
  CGAffineTransform t = CGAffineTransformMakeTranslation(100, 0);
  v2.transform = CGAffineTransformConcat(t,s); // not s,t

эта операция не является коммутативной. Порядок является противоположным порядку при использовании удобных функций для применения одного преобразования к другому.

И вы можете использовать эту операцию для: например (удалить масштаб):

    v2.transform =
    CGAffineTransformConcat(CGAffineTransformInvert(s), v2.transform);