TabBar теряется при использовании пользовательского перехода Seque. Как вернуть его обратно? - PullRequest
2 голосов
/ 06 февраля 2012

Поэтому я решил попробовать создать приложение для iPhone, используя StoryBoarding.И я установил базовое приложение на основе вкладок, довольно быстро.

Контроллер TabBar в качестве начального контроллера View с двумя вкладками.На каждой вкладке добавлено еще несколько представлений в виде содержимого.

На одной вкладке у меня есть контроллер навигации, который имеет несколько следующих представлений.Здесь у меня нет проблем.Я могу двигаться вперед и назад, используя пользовательские кнопки и панель навигации.Кроме того, TabBar всегда находится на своем месте во время всех перемещений по представлениям.

Затем я получил вторую вкладку.Здесь нет контроллера навигации, потому что на второй вкладке мне нужно использовать пользовательские последовательности для создания пользовательских анимаций перехода между представлениями.Никаких проблем с секвестами, анимацией и переходами пока нет (по крайней мере, я почти получил нужную анимацию :)).Но где я застрял, тот TabBar.Как только я нажимаю любую кнопку, которая будет переходить к другому виду, используя пользовательский эффект, я теряю свой TabBar.Даже если я вернусь к исходному виду, TabBar больше не будет.

Я читал кое-что о появлении контроллера вкладок в стеке представлений, но все примеры, которые я смог найти, просто не работали для меня.

Если кто-то застрял с подобной вещью, пожалуйста, поделитесь решением.Любая ссылка на хороший учебник или пример будет очень признателен.

edit: Итак, мой пользовательский эффект выглядит следующим образом:

my "(void) execute" выглядит примерно так: (по крайней мере, он оживляет от источника к месту назначения, как и ожидалось. Единственное, чтонеправильно, это то, что TabBar скрывается или отклоняется)

#import "XCustomSeque.h"
#import <QuartzCore/QuartzCore.h>
@implementation XCustomSeque
@synthesize appDelegate=_appDelegate;
-(void) perform{
    UIViewController *srcViewController = (UIViewController *) self.sourceViewController;
    UIViewController *destViewController = (UIViewController *) self.destinationViewController;

    self.appDelegate = [[UIApplication sharedApplication] delegate];

    CATransition* trans = [CATransition animation];    
    [trans setType:kCATransitionMoveIn];
    [trans setFillMode:kCAFillModeBoth];
    [trans setDuration:1];
    [trans setSubtype:kCATransitionFromLeft];

    CALayer *layer = destViewController.view.layer;

    [srcViewController.view removeFromSuperview];
    [self.appDelegate.window addSubview:destViewController.view];
    [layer addAnimation:trans forKey:nil]; 

    self.appDelegate.window.rootViewController=destViewController;
}
@end

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

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

        +-> [NavC-1] --> [VC-1-1] --(push)-> [VC-1-2] ...
        |   (shows nav bar)
[TabC] -+
        |
        +-> [NavC-2] --> [VC-2-1] --(custom)-> [VC-2-2]
            (hides nav bar)

При переходе от VC-2-1 к VC-2-2 вы используете пользовательский переход (подкласс UIStoryboardSegue) с методом -perform, например, следующим,(См. Как создать пользовательский модальный переход в 4.2 Xcode с использованием раскадровки )

- (void)perform
{
    UIViewController *src = self.sourceViewController;
    UIViewController *dst = self.destinationViewController;
    [UIView transitionWithView:src.navigationController.view duration:0.2
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^{
                        [src.navigationController pushViewController:dst animated:NO];
                    }
                    completion:NULL];
}

Когда вы возвращаетесь из VC-2-2 в VC-2-1, вы нехочу использовать segue, потому что он создает новую копию VC-2-1.Вместо этого вы используете метод действия (вызываемый при нажатии кнопки «Назад»), например, следующий.

- (IBAction)goBack:(id)sender
{
    [UIView transitionWithView:self.navigationController.view duration:0.2
                       options:UIViewAnimationOptionTransitionFlipFromRight
                    animations:^{
                        [self.navigationController popViewControllerAnimated:NO];
                    }
                    completion:NULL];
}
0 голосов
/ 11 февраля 2012

Таким образом, после того, как я возился с различными образцами в интернете, и, тем не менее, ни один из них, похоже, не работал должным образом, я отбросил собственную анимацию seque для последующего взлома. Решил придерживаться чуть ли не того, что предложил Хоши. По крайней мере, моя панель вкладок всегда видна, а кода для анимации еще меньше.

Итак, с StoryBoarding я закончил с этим (немного отличающимся от предложения Хоши):

        +-> [NavC-1] --> [VC-1-1] --(push)-> [VC-1-2] ...
        |   (shows nav bar)
[TabC] -+
        |
        +-> [NavC-2] --> [VC-2-1] --(push)-> [VC-2-2]
            (hides nav bar)

Я использовал стандартный Push Seque для перехода вперед в слайде (здесь нет написанного кода, все на StoryBoard)

Затем во второй ветке мне нужно было иметь вид без навигационной панели и с пользовательской кнопкой «Назад», которая при нажатии запускала переход назад. Конечно, панель вкладок должна оставаться там, где она есть. Панель навигации было легко скрыть, просто снимите флажок «Показывает панель навигации» на панели атрибутов [NavC-2]. Теперь, чтобы получить обратный слайд-переход, я создал собственный класс для каждого View Controller во второй ветви и заполнил их следующим:

#import "VC_2_1.h"   
@implementation VC_2_1

- (IBAction)on_back_button_pressed:(id)sender 
{
    [self.navigationController popViewControllerAnimated:YES]; 
}

@end

on_back_button_pressed - это то, что вызывается кнопкой назад на [VC-2-1]. То же самое касается [VC-2-2] и любого другого VC, следующего во второй ветви.

И все эти люди дали мне именно то, что мне было нужно. Нажимайте пользовательские кнопки и перемещайтесь между представлениями, используя анимацию слайдов влево и вправо. И вкладка не теряется. :)

на самом деле ключом к проблеме была эта строка, как предложил Хоши.

[self.navigationController popViewControllerAnimated:YES];

это был единственный способ, который давал мне анимацию обратного слайда при нажатии на пользовательскую кнопку (не кнопку возврата на стандартной панели навигации)

Ура!

...