В настоящее время я тестирую новый контроллер перехода iOS 7. Что я хочу - это особый модальный переход, представляющий ваш следующий вид, разрезанный на несколько полосок сверху. Каждая полоса должна появляться после инкрементной задержки, чтобы дать желаемый эффект.ios 7 - метод анимации UIView с задержкой не задерживается
Так что мой код выглядит следующим образом:
- (void)presentModalWithContext:(id<UIViewControllerContextTransitioning>)context
{
UIView *inView = [context containerView];
UIView *fromView = [context viewControllerForKey:UITransitionContextFromViewControllerKey].view;
UIView *toView = [context viewControllerForKey:UITransitionContextToViewControllerKey].view;
NSTimeInterval stripTime = 1.0;
NSTimeInterval stripDelay = 1.0;
NSInteger stripCount = 10;
CGFloat stripHeight = toView.frame.size.height/stripCount;
for (NSInteger i = 0; i < stripCount; i++)
{
CGFloat offsetY = i*stripHeight;
CGRect snapRect = CGRectMake(0, offsetY, toView.frame.size.width, stripHeight);
UIView *view = [toView resizableSnapshotViewFromRect:snapRect afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];
CGRect stripRect = CGRectMake(0, -(stripCount-i)*stripHeight, snapRect.size.width, snapRect.size.height);
view.frame = stripRect;
[inView insertSubview:view aboveSubview:fromView];
NSTimeInterval interval = stripDelay*(stripCount-i);
[UIView animateWithDuration:stripTime delay:interval options:0 animations:^{
CGPoint center = view.center;
center.y += stripCount*stripHeight;
view.center = center;
} completion:^(BOOL finished) {
NSLog(@"complete");
if (i == stripCount-1)
[context completeTransition:YES];
}];
}
}
Я уже проверил начальное и конечное положение каждой полосы и уже в порядке. Моя переменная interval
также правильно устанавливается в каждом цикле.
Но, похоже, это совсем не задерживается. Все полоски движутся вместе, создавая впечатление, что весь вид движется.
Быстрый взгляд на основной журнал показывает, что все анимации выполняются одновременно:
2013-09-20 01:11:32.908 test_transition[7451:a0b] complete
2013-09-20 01:11:32.909 test_transition[7451:a0b] complete
2013-09-20 01:11:32.910 test_transition[7451:a0b] complete
2013-09-20 01:11:32.910 test_transition[7451:a0b] complete
2013-09-20 01:11:32.911 test_transition[7451:a0b] complete
2013-09-20 01:11:32.911 test_transition[7451:a0b] complete
2013-09-20 01:11:32.912 test_transition[7451:a0b] complete
2013-09-20 01:11:32.912 test_transition[7451:a0b] complete
2013-09-20 01:11:32.913 test_transition[7451:a0b] complete
2013-09-20 01:11:32.913 test_transition[7451:a0b] complete
ли кто-то сможет определить, что здесь не так?
EDIT:
Кажется, это следующая строка, которая отменяет задержку каких-либо анимации, даже если те не касающиеся зрения того snapshotted:
UIView *view = [toView resizableSnapshotViewFromRect:snapRect afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];
Если я установить параметр afterScreenUpdates
к NO
, вид снимок null
и я получаю следующее сообщение об ошибке: журнал
Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.
Как визуализировать представление перед моментальным снимком? Я пробовал [toView setNeedsDisplay]
, но без успеха ...
Я сделал несколько тестов на вашем коде, и кажется, что аргумент задержки в animateWithDuration: delay: options: animation: completion: игнорируется в вашем коде. Даже если я прокомментирую цикл for и задаю i = 0, верхний срез появится в верхней части экрана сразу, независимо от того, какое значение я передаю для stripDelay. Я делаю еще несколько экспериментов, чтобы увидеть, является ли это проблемой iOS 7 или проблемой UIViewControllerContextTransitioning. – rdelmar
Мои дальнейшие эксперименты показали, что параметр задержки соблюдается в нескольких моих проектах, где я использовал новые настраиваемые переходы контроллера. У меня есть та, которая является обычным нажатием, и та, которая является обычным подарком, и оба они работали (хотя, с нажатием, анимация перекрестного затухания навигации сразу же появилась). Итак, я немного озадачен тем, почему вы не работаете. – rdelmar
Thx для вашей помощи @rdelmar. Это действительно странно, я должен где-то повесить, если вы сообщите, что ваши тестовые проекты работают:/Но я действительно не знаю, где, это довольно простой пример, который я дал – Yaman