2013-11-16 4 views
1

Пользовательские переходы легко работают со стандартными контейнерами и представляют собой модальные контроллеры. Но как насчет использования пользовательских переходов с полностью настраиваемым контейнером?Пользовательские контейнеры и пользовательские переходы

Я бы хотел использовать протокол UIViewControllerContextTransitioning с моим пользовательским контейнером и использовать переходные и интерактивные переходы.

В комментарии в файл заголовка UIViewControllerContextTransitioning Я читаю:

// The UIViewControllerContextTransitioning protocol can be adopted by custom 
// container controllers. It is purposely general to cover more complex 
// transitions than the system currently supports. 

, но я не могу понять, как создать контекст Переходить и начать весь процесс пользовательского перехода.

+0

Вы пытались вызвать presentViewController: анимированные: завершение: и addChildViewController: вместе в том, что вы нажимаете метод контроллера вида своего пользовательского класса контейнера? Я не смог найти какой-либо метод, отличный от presentViewController, который вызывает вызов делегата перехода. –

+0

Так вы думаете, что просто presentViewController делает трюк? Я думал об этой функции так же, как к модульному контроллеру просмотра ... но, вероятно, вы правы. – MatterGoal

+0

Если у вас есть время попробовать, скажите, работает ли он, я был слишком занят, чтобы попробовать прямо сейчас. –

ответ

4

Это очень хорошо!

взгляните на это SO Answer.

Вам просто нужно создать viewController, соответствующий протоколу UIViewControllerContextTransitioning, и использовать API Containment ViewController (addChildViewController :, willMoveToParentViewController: и т. Д.).

Если вы хотите начать настраиваемый переход, просто вызовите метод [animateTransition] на вашем контроллере перехода. С этого момента это то же самое, что и с API, предоставляемым Apple.

Сделайте свой собственный контейнер подходящим с API перехода.

На самом деле все новые протоколы, представленные в iOS7 (UIViewControllerContextTransitioning и т. Д.), Действительно не нужны для реализации собственного полностью настраиваемого контейнера-контейнера. Его просто обеспечивает аккуратный класс отношений и пул методов. Но вы можете написать все это самостоятельно и не нужно использовать какой-либо частный API. ViewController Containment (представленный в iOS5) - это все, что вам нужно для этой работы.

Я просто попробовал попробовать и даже работал с интерактивными переходами.

Если вам нужен какой-то пример кода, пожалуйста, дайте мне знать, и я приведу некоторые :)

EDIT

Кстати, это как Facebook и Instagram для прошивкой создает свою навигационную концепцию , Вы можете прокрутить навигационную панель в этих Приложениях, и когда новый ViewController «нажат», навигационная панель, кажется, была сброшена во время нажатия.

Как ни странно, я задал тот же вопрос месяц назад здесь, на StackOverflow: D

My Question

И я только что понял, я ответил это сам :)

имеют хороший день!

+1

Я принял ваш ответ! это правильный вариант :) спасибо! Было бы здорово иметь некоторые примеры кода. На данный момент, следуя вашим советам, я смог выполнить анимацию между двумя контроллерами, но в «animateTransition» мне нужно вручную добавить каждый подзаголовок ... это правильный путь? Используя настраиваемый переход со стандартным Modal Controller, «просмотр» автоматически добавляется в контекстный вид ... поэтому я задаюсь вопросом, правильный ли мой код. – MatterGoal

+2

Я рад, что смогу помочь вам :) Когда вы реализуете свой собственный контейнер, вы также несете ответственность за то, чтобы взгляды childViewControllers были добавлены и удалены должным образом. Как правило, за один раз доступно только одно представление childController, но это НЕ обязательный. Поэтому, когда вы в настоящее время добавляете и удаляете каждый вид childViewController, ваш код, вероятно, прав;) Системный переход (например, NavigationController, Modal и т. Д.) Обрабатывает удаление «fromVC» для вас при использовании пользовательских переходов. Я как можно скорее соберу код примера для примера :) – Cabus

+0

Спасибо Cabus! Очень трудно найти хороший пример по этой теме (я имею в виду пользовательский контейнер + настраиваемый переход :)). – MatterGoal

1

На самом деле, он говорит так, но вы неполны:

Протокол UIViewControllerContextTransitioning может быть принят контроллерами пользовательских контейнеров. Целесообразно обобщать более сложные переходы, чем система, поддерживаемая в настоящее время. Для теперь навигация push/pops и UIViewController присутствует/увольняется переходы могут быть настроены.

Это означает, что вы можете запустить ваш ВК transitioningDelegate по телефону presentViewController:animated:completion: метод или вы можете реализовать navigationController:animationControllerForOperation:fromViewController:toViewController: в вашем UINavigationControllerDelegate класса и возвращает объект, соответствующий UIViewControllerAnimatedTransitioning протокол.

Подводя итог, существует только два способа обеспечения пользовательского перехода. Оба требуют представления/нажатия VC, в то время как мы добавляем subviews для создания пользовательских контроллеров представления контейнеров.

Возможно, Apple будет делать то, что они сказали в первых строках своего утверждения в заголовочном файле в будущем, но сейчас то, что вы хотите сделать, кажется невозможным.

+0

Я рад сказать, что вы ошибались :) проверьте ответ Cabus. – MatterGoal

+0

Я бы хотел дать +50 тем, кто этого заслужил, но я не могу, когда я хочу начать щедрость, это позволяет мне давать +100. Любая помощь? –

+0

Я действительно не знаю, имеет ли максимальный предел 100 и более ... Я могу начать более 100 очков. – MatterGoal

-2

Пожалуйста, смотрите на MPFoldTransition, это сработало для меня.

Вы также можете использовать следующую категорию, вы можете создать свой собственный переход, используя это.

#import <UIKit/UIKit.h> 

@interface UIView (Animation) 

- (void) moveTo:(CGPoint)destination duration:(float)secs option:(UIViewAnimationOptions)option; 
- (void) downUnder:(float)secs option:(UIViewAnimationOptions)option; 
- (void) addSubviewWithZoomInAnimation:(UIView*)view duration:(float)secs option:(UIViewAnimationOptions)option; 
- (void) removeWithZoomOutAnimation:(float)secs option:(UIViewAnimationOptions)option; 
- (void) addSubviewWithFadeAnimation:(UIView*)view duration:(float)secs option:(UIViewAnimationOptions)option; 
- (void) removeWithSinkAnimation:(int)steps; 
- (void) removeWithSinkAnimationRotateTimer:(NSTimer*) timer; 

@end 

Реализация:

#import "UIView+Animation.h" 

@implementation UIView (Animation) 

- (void) moveTo:(CGPoint)destination duration:(float)secs option:(UIViewAnimationOptions)option 
{ 
    [UIView animateWithDuration:secs delay:0.0 options:option 
        animations:^{ 
         self.frame = CGRectMake(destination.x,destination.y, self.frame.size.width, self.frame.size.height); 
        } 
        completion:nil]; 
} 

- (void) downUnder:(float)secs option:(UIViewAnimationOptions)option 
{ 
    [UIView animateWithDuration:secs delay:0.0 options:option 
     animations:^{ 
      self.transform = CGAffineTransformRotate(self.transform, M_PI); 
      self.alpha = self.alpha - 0.5; 
     } 
     completion:nil]; 
} 

- (void) addSubviewWithZoomInAnimation:(UIView*)view duration:(float)secs option:(UIViewAnimationOptions)option 
{ 
    // first reduce the view to 1/100th of its original dimension 
    CGAffineTransform trans = CGAffineTransformScale(view.transform, 0.01, 0.01); 
    view.transform = trans; // do it instantly, no animation 
    [self addSubview:view]; 
    // now return the view to normal dimension, animating this tranformation 
    [UIView animateWithDuration:secs delay:0.0 options:option 
     animations:^{ 
      view.transform = CGAffineTransformScale(view.transform, 100.0, 100.0); 
     } 
     completion:nil];  
} 

- (void) removeWithZoomOutAnimation:(float)secs option:(UIViewAnimationOptions)option 
{ 
    [UIView animateWithDuration:secs delay:0.0 options:option 
    animations:^{ 
     self.transform = CGAffineTransformScale(self.transform, 0.1, 0.1); 
    } 
    completion:^(BOOL finished) { 
     [self removeFromSuperview]; 
    }]; 
} 

// add with a fade-in effect 
- (void) addSubviewWithFadeAnimation:(UIView*)view duration:(float)secs option:(UIViewAnimationOptions)option 
{ 
    view.alpha = 0.0; // make the view transparent 
    [self addSubview:view]; // add it 
    [UIView animateWithDuration:secs delay:0.0 options:option 
        animations:^{view.alpha = 1.0;} 
        completion:nil]; // animate the return to visible 
} 

// remove self making it "drain" from the sink! 
- (void) removeWithSinkAnimation:(int)steps 
{ 
    //NSTimer *timer; 
    if (steps > 0 && steps < 100) // just to avoid too much steps 
     self.tag = steps; 
    else 
     self.tag = 50; 
    [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(removeWithSinkAnimationRotateTimer:) userInfo:nil repeats:YES]; 
} 
- (void) removeWithSinkAnimationRotateTimer:(NSTimer*) timer 
{ 
    CGAffineTransform trans = CGAffineTransformRotate(CGAffineTransformScale(self.transform, 0.9, 0.9),0.314); 
    self.transform = trans; 
    self.alpha = self.alpha * 0.98; 
    self.tag = self.tag - 1; 
    if (self.tag <= 0) 
    { 
     [timer invalidate]; 
     [self removeFromSuperview]; 
    } 
} 

@end 

Я надеюсь, что это решит вашу проблему. наслаждайтесь. :)

+1

Ты не понял мой вопрос. Моя проблема: «Как использовать CUSTOM CONTAINER с ТАМОЖЕННЫМИ ПЕРЕХОДАМИ». – MatterGoal

0

От docsUIViewControllerContextTransitioning

Не принимать этот протокол в своих классах, и вы должны непосредственно создавать объекты, которые принимают этот протокол.

Смежные вопросы