Чтобы выполнить пользовательский переход с навигационным контроллером (UINavigationController
), вы должны:
UINavigationControllerDelegate
. Например, вы можете иметь расширение частного класса в файле .m
контроллера вашего вида, который указывает соответствие этому протоколу: @interface ViewController ()
@end
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.delegate = self;
}
animationControllerForOperation
в контроллер вашего вида: - (id)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController*)fromVC
toViewController:(UIViewController*)toVC
{
if (operation == UINavigationControllerOperationPush)
return [[PushAnimator alloc] init];
if (operation == UINavigationControllerOperationPop)
return [[PopAnimator alloc] init];
return nil;
}
@interface PushAnimator : NSObject
@end
@interface PopAnimator : NSObject
@end
@implementation PushAnimator
- (NSTimeInterval)transitionDuration:(id )transitionContext
{
return 0.5;
}
- (void)animateTransition:(id)transitionContext
{
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
[[transitionContext containerView] addSubview:toViewController.view];
toViewController.view.alpha = 0.0;
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
toViewController.view.alpha = 1.0;
} completion:^(BOOL finished) {
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}
@end
@implementation PopAnimator
- (NSTimeInterval)transitionDuration:(id )transitionContext
{
return 0.5;
}
- (void)animateTransition:(id)transitionContext
{
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
[[transitionContext containerView] insertSubview:toViewController.view belowSubview:fromViewController.view];
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
fromViewController.view.alpha = 0.0;
} completion:^(BOOL finished) {
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}
@end
Это приводит к постепенному переходу, но вы должны чувствовать UIViewControllerInteractiveTransitioning
): @property (nonatomic, strong) UIPercentDrivenInteractiveTransition *interactionController;
Этот UIPercentDrivenInteractiveTransition
является хорошим объектом, который делает тяжелый подъем обновления вашей пользовательской анимации в зависимости от того, насколько завершен жест. Добавьте распознаватель жестов к вашему виду. Здесь я просто внедряю левый распознаватель жестов, чтобы имитировать поп: UIScreenEdgePanGestureRecognizer *edge = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFromLeftEdge:)];
edge.edges = UIRectEdgeLeft;
[view addGestureRecognizer:edge];
Внедрить обработчик распознавателя жестов: /** Handle swipe from left edge
*
* This is the "action" selector that is called when a left screen edge gesture recognizer starts.
*
* This will instantiate a UIPercentDrivenInteractiveTransition when the gesture starts,
* update it as the gesture is "changed", and will finish and release it when the gesture
* ends.
*
* @param gesture The screen edge pan gesture recognizer.
*/
- (void)handleSwipeFromLeftEdge:(UIScreenEdgePanGestureRecognizer *)gesture {
CGPoint translate = [gesture translationInView:gesture.view];
CGFloat percent = translate.x / gesture.view.bounds.size.width;
if (gesture.state == UIGestureRecognizerStateBegan) {
self.interactionController = [[UIPercentDrivenInteractiveTransition alloc] init];
[self popViewControllerAnimated:TRUE];
} else if (gesture.state == UIGestureRecognizerStateChanged) {
[self.interactionController updateInteractiveTransition:percent];
} else if (gesture.state == UIGestureRecognizerStateEnded) {
CGPoint velocity = [gesture velocityInView:gesture.view];
if (percent > 0.5 || velocity.x > 0) {
[self.interactionController finishInteractiveTransition];
} else {
[self.interactionController cancelInteractiveTransition];
}
self.interactionController = nil;
}
}
В вашем делете контроллера навигации вы также должны реализовать interactionControllerForAnimationController
метод делегата - (id)navigationController:(UINavigationController *)navigationController
interactionControllerForAnimationController:(id)animationController {
return self.interactionController;
}
Если вы google "UINavigationController настраиваемый переход учебник", и вы получите много хитов. Или см. видеоролики пользовательских переходов WWDC 2013 .
Следующее должно быть полезно для вас
Хотя, бросив быстрый взгляд на документ из codeplex, я могу сказать, что, вероятно, 70-80% того, что там, относится к Java а также.
Я приношу извинения за то, что не была прочитана очень хорошая ссылка, которую Вы предоставили.
я скажу, что архитектура должна быть независимым от языка видом вещи. Как только Вы понимаете принципы, это должен быть вопрос отображения функций и деталей реализации одной платформы на другой.
я смущаюсь отправлять ссылки на любые стандарты EE Java, потому что изменения, внесенные в движении к EJB 3.0, делают много "лучших практик" более ранних версий устаревшим.
Объектно-реляционное отображение теперь воплощено в JPA; Spring представил идеи как dependecy инжекционное и аспектно-ориентированное программирование.
Прямо сейчас я сказал бы, что изучение Spring даст Вам лучшее понимание лучших практик Java для архитектуры предприятия.
Я все еще загружаю документ, на который ссылаются, но из описания страницы я думал бы
a), Многое из него должно быть независимым от языка, таким образом, это должно относиться к Java также.
b) Шаблоны Архитектуры приложений для предприятия могли бы соответствовать. (это также - Платформа / независимый от языка.) Можно читать о книге здесь http://martinfowler.com/books.html
Редактирование:
я просто скользил по документу. Взгляды действительно interseting. Я предполагаю, что должен провести еще некоторое время с ним.
ссылки на.NET чрезвычайно редки там и главным образом перечисляют соответствующие части технологического стека.NET для данного ara., например, Windows Mobile Что-то для реализации клиента мобильного приложения. Во многих случаях это действительно просто продает.
, Таким образом, эквивалент для Java должен был бы рекомендовать решение Sun соответствия. Как MySQL для базы данных. В то время как этот подход имеет смысл для MS, который предпочел бы, чтобы их разработчики были заблокированы в материал MS, он не имеет смысла для Sun/Java, которые имеют раскрытость как главный аргумент продажи. Таким образом, оператор как 'SQL Server MS использования для этого' превратился бы в использование, Oracle, db2, mysql, SQL-сервер мс, hsqldb, дерби, informix, postrgres или любая другая база данных для этого... не очень полезного. Таким образом, я предполагаю, что этого не произойдет.