Руководство по архитектуре JAVA-приложения

Чтобы выполнить пользовательский переход с навигационным контроллером (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;
    }
    
  • Внедрите аниматоры для анимации push и pop, например:
    @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 .

22
задан Jens Schauder 15 March 2009 в 14:59
поделиться

3 ответа

Следующее должно быть полезно для вас

  1. Базовые паттерны J2EE
  2. Эффективная корпоративная Java
  3. Шаблоны корпоративной архитектуры приложений
  4. Head First Design Patterns
  5. Проекты J2EE
  6. Sun Сертифицированный корпоративный архитектор, Учебное пособие

Хотя, бросив быстрый взгляд на документ из codeplex, я могу сказать, что, вероятно, 70-80% того, что там, относится к Java а также.

21
ответ дан 29 November 2019 в 05:01
поделиться

Я приношу извинения за то, что не была прочитана очень хорошая ссылка, которую Вы предоставили.

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

я смущаюсь отправлять ссылки на любые стандарты EE Java, потому что изменения, внесенные в движении к EJB 3.0, делают много "лучших практик" более ранних версий устаревшим.

Объектно-реляционное отображение теперь воплощено в JPA; Spring представил идеи как dependecy инжекционное и аспектно-ориентированное программирование.

Прямо сейчас я сказал бы, что изучение Spring даст Вам лучшее понимание лучших практик Java для архитектуры предприятия.

10
ответ дан 29 November 2019 в 05:01
поделиться

Я все еще загружаю документ, на который ссылаются, но из описания страницы я думал бы

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 или любая другая база данных для этого... не очень полезного. Таким образом, я предполагаю, что этого не произойдет.

5
ответ дан 29 November 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: