У меня есть вид, который я хочу масштабировать и перевести на новое место путем его анимации. Я попытался добиться этого с помощью следующего кода:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kDurationForFullScreenAnimation];
[[self animatingView] setFrame:finalRect];
[UIView commitAnimations];
Эффект этого кода заключается в том, что представление сначала изменяет размер своего содержимого на finalRect, а затем переводит его в новое местоположение. т.е. масштабирующая часть никогда не анимируется. Представление просто преобразуется в новый размер, а затем переводится.
Эта проблема уже обсуждалась в нескольких других потоках, но ни один из них не делает вывод. Однако существует решение использовать таймер и устанавливать кадр каждый раз при обратном вызове таймера, но у него есть недостаток производительности.
Каково наиболее подходящее решение этой проблемы, а также, почему в первом случае эта проблема возникает ?
Спасибо
Установка рамки не влияет ни на масштаб, ни на перевод. Вы либо используете неправильную терминологию, либо используете неправильный инструмент для работы. Масштабирование и преобразование выполняются с использованием аффинных преобразований 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 соответственно, которые представляют новую позицию на экран. Опять же, их нужно заключить в блок анимации.