У меня есть ряд (скажем) блоков на экране подряд, все подпредставления моего основного вида. Каждый является UIView. Я хочу сдвинуть их все влево и по-новому взглянуть на экран справа в слогане. Вот что я делаю:
// First add a dummy view offscreen
UIView * stagingView = /* make this view, which sets up its width/height */
CGRect frame = [stagingView frame];
frame.origin.x = /* just off the right side of the screen */;
[stagingView setFrame:frame];
[self addSubview:stagingView];
А затем я настроил анимации в одном блоке для всех моих подпредставлений (включая тот, который я только что добавил):
[UIView beginAnimations:@"shiftLeft" context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(_animationDidStop:context:)];
[UIView setAnimationDuration:0.3];
for (UIView * view in [self subviews]) {
CGRect frame = [view frame];
frame.origin.x -= (frame.size.width + viewPadding);
[view setFrame:frame];
}
[UIView commitAnimations];
Вот то, что я ожидаю: (три) вида, уже находящиеся на экране, сдвигаются влево, а недавно созданный вид одновременно появляется справа.
Вот что происходит: вновь созданный вид анимируется точно так, как ожидалось, а виды, уже находящиеся на экране, вообще не двигаются! (Или, возможно, они прыгают без анимации в свои конечные местоположения).
И! Если я закомментирую весь процесс создания нового подпредставления за кадром ... то, что на экране делает , правильно анимирует!
А?
ОБНОВЛЕНИЕ : После еще нескольких осмотров я обнаружил нечто удивительное: я могу решить эту проблему, вернув свой пользовательский подкласс layoutSubviews
, не выполняя никакой работы, если он вызывается между временем анимации настроить, и время, которое он завершает. Этот метод должен сделать некоторую работу, чтобы настроить положение этих подпредставлений во время изменения ориентации. Но я не очень понимаю взаимодействие анимации с этим методом - я думаю, что он будет вызван в конце концов, возможно, в конце, что имело бы смысл и которое по сути должно быть неактивным после анимации. Может кто-нибудь объяснить мне взаимодействие? Кажется, я близок к просветлению, но еще не совсем там. Спасибо!