iPhone: пользовательская вкладка без ужасного меню «Дополнительно» - PullRequest
3 голосов
/ 19 декабря 2011

Итак, я хотел создать панель вкладок, которая имеет более 5 элементов, с возможностью прокрутки и нашел эту статью .Это легко сделать, создав подкласс UITabBarController и скрыв существующую панель вкладок:

for(UIView *view in self.view.subviews)
{
    if([view isKindOfClass:[UITabBar class]])
    {
        view.hidden = YES;
        break;
    }
}

Затем я просто добавляю UIScrollView и добавляю туда несколько кнопок, основываясь на коллекции элементов tabbarcontroller.

int i = 0;
for (UITabBarItem *item in self.tabBar.items)
{
    UIView *tab = [[[UIView alloc] initWithFrame:CGRectMake(i*60, 0, 60, 60)] autorelease];

    UIButton *btn = [[[UIButton alloc] initWithFrame:CGRectMake(7.5, 1, 45, 45)] autorelease];
    [btn setImage:item.image forState:UIControlStateNormal];
    btn.tag = i;
    [btn addTarget:self action:@selector(didSelectTabrBarItem:) forControlEvents:UIControlEventTouchUpInside];
    [tab addSubview:btn];

    [self.scrollView addSubview:tab];
    i++;

    if(self.selectedViewController == nil)
        [self setSelectedIndex:0];
}

Я переопределяю setSelectedindex / ViewController, так как мне нужно добавить дополнительный чертеж.

-(void)setSelectedViewController:(UIViewController *)selectedViewController
{
    [super setSelectedViewController:selectedViewController];
    [self startTimer];
}

-(void)setSelectedIndex:(NSUInteger)selectedIndex
{
    [super setSelectedIndex:selectedIndex];
    [self startTimer];
}

Проблема в том, что когда я нажимаю кнопку с номером 5, 6 или 7, контроллер tabbar открывает контроллер Больше.Как мне избавиться от этого и заставить последние три элемента действовать как другие?- Может ли это быть вызов супер?

Я думаю, будет полностью убить UITabBarController и реализовать мою собственную панель вкладок.Но возможно ли отключить меню more и заставить UITabBarController выбрать пункты 5, 6 и 7 как обычно?

Ответы [ 4 ]

6 голосов
/ 20 декабря 2011

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

И вот решение:

Фактическая проблема заключается в том, что когда вы касаетесь элемента панели вкладок с индексом выше 4, UITabBarController фактически отображает moreNavigationController.Это UINavigationController, содержащий представление типа UIMoreViewControllerList, который является типом из частной платформы Cocoa вместе с экземпляром выбранного вами ViewController.

Так как же нам избавиться от кнопки «Дополнительно»?

Просто удалите UIMoreViewControllerList из коллекции moreNavigationController, оставив только выбранный вами ViewController.

-(void)setSelectedViewController:(UIViewController *)selectedViewController
{
    [super setSelectedViewController:selectedViewController];

    if([self.moreNavigationController.viewControllers count] > 1)
    {        
        //Modify the view stack to remove the More view
        self.moreNavigationController.viewControllers = [[[NSArray alloc] initWithObjects:self.moreNavigationController.visibleViewController, nil] autorelease];
    }
}

Хорошо, что оставляет нас с кнопкой «Редактировать» в верхнем правом углу (заголовок заголовка).

Как вы тогда избавитесь от этого?

Да.Это еще один грязный взлом.Чтобы удалить кнопку «Редактировать», мне фактически пришлось бы реализовать один метод из UINavigationControllerDelegate для moreNavigationController в моем пользовательском UITabBarController.

//navigationController delegate
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{

    if ([navigationController isKindOfClass:NSClassFromString(@"UIMoreNavigationController")])
    {     
        // We don't need Edit button in More screen.
        UINavigationBar *morenavbar = navigationController.navigationBar;
        UINavigationItem *morenavitem = morenavbar.topItem;
        morenavitem.rightBarButtonItem = nil;
    }
}

И это способ убрать стандартную функциональность More.Я действительно думаю, что Apple разозлила свои штаны, создавая UITabBarController, который обрабатывает логику и пользовательский интерфейс.Почему бы не создать контроллер, который имеет логику для предварительной загрузки ViewControllers и переключения между ними, а затем - реализацию, которую вы можете использовать, если вам нужна дополнительная вещь.- Или даже лучше: сделайте возможным отключение функции Больше.

1 голос
/ 17 ноября 2012

Я должен завершить эту тему.В течение года я держал вышеупомянутое в App Store, и это вызвало огромные проблемы в долгосрочной перспективе.Это работает, но это странно, когда вы полагаетесь на встроенные функции UITabbarcontroller, поскольку он портится со стеком представлений.

Проработав этот горячий пепел в течение более года, мы решили создать наш собственный tabbarcontroller / menucontroller,Это заняло как день и освободило нас от всех исправлений и причуд.Мой хак работает, но я рекомендую создать свой собственный класс навигации - в конечном итоге он окупится: -)

1 голос
/ 20 декабря 2011

Это довольно близко, это может помочь вам

https://github.com/iosdeveloper/InfiniTabBar

0 голосов
/ 20 декабря 2011

У меня была похожая проблема, и я решил ее, используя UITabBarController и скрыв панель вкладок. Затем я нарисовал пользовательскую панель вкладок поверх нее, и когда была нажата кнопка для вкладки, позвоните

tabbar.selectedIndex = index 

Где 'tabbar' - это оригинальный UITabBarController. Установка свойства selectedIndex для UITabBarController изменяет текущий отображаемый контроллер представления на контроллер с этим индексом. Таким образом, вы по-прежнему получаете все функциональные возможности UITabBarController, но вы можете иметь столько вкладок, сколько хотите, и настраивать их так, как хотите.

В противном случае, я не думаю, что есть способ удалить «больше» функциональности.

...