UITabBarController -Как я могу анимировать простые переключатели? - PullRequest
1 голос
/ 08 октября 2011

Я все еще довольно новичок в этом деле.Это приложение - только мое второе.

У меня есть TabBarController, и есть два способа переключения между представлениями:

МЕТОД 1: Используйте значки панели вкладок.Я предоставил необходимый обратный вызов делегата.Это что-то вроде этого:

/***************************************************************\**
 \brief This animates the view transitions, and also sets up anything
 that needs doing between views.
 *****************************************************************/
- (BOOL)tabBarController:(UITabBarController *)inTabBarController
shouldSelectViewController:(UIViewController *)inViewController
{
    BOOL ret = NO;

        // Need to have all of these to work.
    if ( inTabBarController && [inTabBarController view] && inViewController && [inViewController view] )
        {
        UIView  *srcView = [[inTabBarController selectedViewController] view];
        UIView  *dstView = [inViewController view];

        if ( srcView != dstView )
            {
            if ( srcView == [prefsController view] )
                {
                [UIView transitionFromView:srcView
                                    toView:dstView
                                  duration:0.25
                                   options:UIViewAnimationOptionTransitionCurlDown
                                completion:nil];
                }
            else if ( dstView == [prefsController view] )
                {
                [UIView transitionFromView:srcView
                                    toView:dstView
                                  duration:0.25
                                   options:UIViewAnimationOptionTransitionCurlUp
                                completion:nil];
                }
            else if ( srcView == [listSearchController view] && dstView == [mapSearchController view] )
                {
                [UIView transitionFromView:srcView
                                    toView:dstView
                                  duration:0.25
                                   options:UIViewAnimationOptionTransitionFlipFromLeft
                                completion:nil];
                }
            else if ( dstView == [listSearchController view] && srcView == [mapSearchController view] )
                {
                [UIView transitionFromView:srcView
                                    toView:dstView
                                  duration:0.25
                                   options:UIViewAnimationOptionTransitionFlipFromRight
                                completion:nil];
                }

            ret = YES;
            }
        }

    return ret;
}

Отлично работает.

МЕТОД 2: Захватите смахивания и запустите переходы таким образом, например:

/***************************************************************\**
 \brief Gesture Callback -Swipes from the List View to the Map View
 *****************************************************************/
- (IBAction)swipeFromList:(UIGestureRecognizer *)sender
{
    [tabBarController setSelectedIndex:1];
}

проблема в том, что я не могу получить переход на работу.Если я добавлю код перехода в обработчик смахивания, например, так:

/***************************************************************\**
 \brief Gesture Callback -Swipes from the List View to the Map View
 *****************************************************************/
- (IBAction)swipeFromList:(UIGestureRecognizer *)sender
{
    [UIView transitionFromView:[listSearchController view]
                        toView:[mapSearchController view]
                      duration:0.25
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    completion:nil];
    [tabBarController setSelectedIndex:1];
}

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

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

Подсказки, кто-нибудь?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 октября 2011

Ничего себе. Я решил это, и я не совсем уверен, почему, но это работает.

Вот что я сделал:

Сначала я учел переходы в стандартный метод:

/***************************************************************\**
 \brief Manages the transition from one view to another. Just like
 it says on the tin.
 *****************************************************************/
- (void)transitionBetweenThisView:(UIView *)srcView
                      andThisView:(UIView *)dstView
{
    if ( srcView != dstView )
        {
        if ( srcView == [prefsController view] )
            {
            [UIView transitionFromView:srcView
                                toView:dstView
                              duration:0.25
                               options:UIViewAnimationOptionTransitionCurlDown
                            completion:nil];
            }
        else if ( dstView == [prefsController view] )
            {
            [UIView transitionFromView:srcView
                                toView:dstView
                              duration:0.25
                               options:UIViewAnimationOptionTransitionCurlUp
                            completion:nil];
            }
        else if ( srcView == [listSearchController view] && dstView == [mapSearchController view] )
            {
            [UIView transitionFromView:srcView
                                toView:dstView
                              duration:0.25
                               options:UIViewAnimationOptionTransitionFlipFromLeft
                            completion:nil];
            }
        else if ( dstView == [listSearchController view] && srcView == [mapSearchController view] )
            {
            [UIView transitionFromView:srcView
                                toView:dstView
                              duration:0.25
                               options:UIViewAnimationOptionTransitionFlipFromRight
                            completion:nil];
            }
        }
}

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

/***************************************************************\**
 \brief This animates the view transitions, and also sets up anything
 that needs doing between views. It stops the tab bar controller
 from managing the transition, and does it manually.
 \returns a BOOL. Always NO.
 *****************************************************************/
- (BOOL)tabBarController:(UITabBarController *)inTabBarController
 shouldSelectViewController:(UIViewController *)inViewController
{
    [self transitionBetweenThisView:[[inTabBarController selectedViewController] view] andThisView:[inViewController view]];
    int index = [[inTabBarController viewControllers] indexOfObject:inViewController];
    [inTabBarController setSelectedIndex:index];
    return NO;
}

Затем я добавил следующий код в ловушки для свайпов:

/***************************************************************\**
 \brief Gesture Callback -Swipes from the List View to the Map View
 *****************************************************************/
- (IBAction)swipeFromList:(UIGestureRecognizer *)sender
{
    [self transitionBetweenThisView:[listSearchController view] andThisView:[mapSearchController view]];
    [tabBarController setSelectedIndex:1];
}

Теперь проблема была в том, что у меня всегда возникал сбой при возврате к виду, с которого я проводил (не используя панель вкладок). Авария сказала, что вид назначения был освобожден.

После проверки некоторых куриных внутренностей я решил, что мне нужно держать нос и сохранить прежний вид, например:

    [[listSearchController view] retain];
    [self transitionBetweenThisView:[listSearchController view] andThisView:[mapSearchController view]];

Это работает. Я проверил это с помощью инструментов. Нет утечек.

2 голосов
/ 15 января 2013

Этот код работает нормально **

int controllerIndex = 2;
UIView * fromView = self.tabBarController .selectedViewController.view;
UIView * toView = [[self.tabBarController.viewControllers objectAtIndex:controllerIndex] view];

// Transition using a page curl.
[UIView transitionFromView:fromView toView:toView duration:0.5
                   options:(controllerIndex > self.tabBarController.selectedIndex ? UIViewAnimationOptionTransitionCurlUp : UIViewAnimationOptionTransitionCurlDown)

                completion:^(BOOL finished) {

                    if (finished) {
                        self.tabBarController.selectedIndex = controllerIndex;
                    }

                }];**
...