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);