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

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

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

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

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

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

Спасибо

10
задан Peter Hosey 18 August 2010 в 06:37
поделиться

1 ответ

Установка рамки не влияет ни на масштаб, ни на перевод. Вы либо используете неправильную терминологию, либо используете неправильный инструмент для работы. Масштабирование и преобразование выполняются с использованием аффинных преобразований Core Graphics, когда вы хотите повлиять на 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 соответственно, которые представляют новую позицию на экран. Опять же, их нужно заключить в блок анимации.

33
ответ дан 3 December 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: