Построить контроллер представления вкладок с нуля - PullRequest
0 голосов
/ 17 июня 2011

Контроллер панели вкладок Apple имеет множество ограничений.Одним из важных ограничений является то, что вы не можете изменять панель вкладок в безопасном режиме отклонения.Моя панель вкладок имеет простые скользящие движения и она многорядная.По этим причинам я решил построить TBVC с самого начала;Кажется, все работает правильно, но я действительно возился с ротациейКаждый раз, когда я меняю ориентацию, меняются основные рамки представления.

Вот моя иерархия сверху до представления контейнера: -MainView - содержит -> TabBarView + containerView. Контейнерное представление - это представление, используемое для хранения загруженных представлений.от других контроллеров.Вот метод -loadView моего CustomTabBaViewController

- (void)loadView
{
    UIView *theView=[[UIView alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    theView.autoresizingMask=UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    theView.backgroundColor=[UIColor greenColor];

    containerOfControllersView=[[UIView alloc] initWithFrame:theView.bounds];
    containerOfControllersView.backgroundColor=[UIColor blueColor];
    containerOfControllersView.autoresizingMask=UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [theView addSubview:containerOfControllersView];

    ideoloTabBar=[[IdeoloTabBar alloc]initWithNumberOfControllers:[controllers count]];
    [theView addSubview:ideoloTabBar];
    self.view=theView;
    [theView release];

}

Когда я устанавливаю новое представление из другого контроллера, я использую этот метод:

-(void)setCurrentViewWithView:(UIView*)theView{
    if ([[self.containerOfControllersView subviews] count]>0) {
        UIView *tagView=[self.containerOfControllersView viewWithTag:555];
        tagView.tag=0;
        [tagView removeFromSuperview];
    }
    theView.tag=555;
    theView.autoresizingMask=UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    theView.frame=[[UIScreen mainScreen]applicationFrame];
    [self.containerOfControllersView addSubview:theView];
    [self.view bringSubviewToFront:ideoloTabBar];
}

Как вы можете видеть представления из другого представленияконтроллеры применяются с помощью applicationFrame.

Когда я поворачиваю устройство, происходит что-то не так, основное изображение не только изменяется в соответствии с новой ориентацией, но также перемещается на 20 пикселей (размер строки состояния) к боттону, таким образом, оставляяразрыв между строкой состояния и видом контейнера.Так как я дал основному виду границы экрана, которые я не могу понять, его необходимо переместить.

ОБНОВЛЕНИЕ

Я пытаюсь использовать другой подход, поэтому я изменилloadView выглядит так:

- (void)loadView
{
    [super loadView];
    containerOfControllersView=[[UIView alloc] initWithFrame:self.view.bounds];
    containerOfControllersView.backgroundColor=[UIColor blueColor];
    containerOfControllersView.autoresizingMask=UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.view.backgroundColor=[UIColor greenColor];
    [self.view addSubview:containerOfControllersView];
    ideoloTabBar=[[IdeoloTabBar alloc]initWithNumberOfControllers:[controllers count]];
    [self.view addSubview:ideoloTabBar];
}

И в setCurrentViewWithView: (UIView *) theView я изменил строку с помощью

theView.frame=self.view.bounds;

вместо использования applicationFrame.

СЕЙЧАС:

На iPhone, когда я пытаюсь загрузить modalView, он обрезается примерно на 40 пикселей внизу. На iPad, когда я пытаюсь загрузить модальный вид, он оставляет 20 пикселей внизу, потому что 20 пикселей находятся под строкой состояния, ноwantFullScreen - это NO.

UPDATE 2

Кажется, что presentModalViewController должен вызываться из корневого контроллера представления.Я создам протокол и абстрактный подкласс UIViewController, чтобы реализовать его и правильно загрузить.

Есть предложения?обойтись?

Ответы [ 3 ]

1 голос
/ 17 июня 2011

Мне не нравится подход создания полностью собственного TabBarController с нуля.Мне нравится помещать пользовательский вид поверх реального TabBar в качестве подпредставления, а затем передавать все нажатия кнопок реальному TabBarController.Таким образом, вам не нужно кодировать оконный менеджер самостоятельно.

- (void)tabButtonPressed:(id)sender
{
    UIButton *button = (UIButton *)sender;

    if (button.tag == HomeButton)
        self.tabBarController.selectedIndex = 0;

    // etc.
}

Это также должно быть безопасным для отклонения.

0 голосов
/ 24 июня 2011

Прошло много времени с тех пор, как я использую свой собственный TabBarViewController с исчезающей панелью вкладок, и, похоже, он работает должным образом как на iPad, так и на iPhone. Основная проблема, с которой я столкнулся, была связана с неправильным назначением фрейма представления контента и, вероятно, с неправильным предположением, что modalVC были загружены из текущего контроллера представления.
Первая точка: представление содержимого должно использовать границы основного представления, вот часть метода loadView контроллера корневого представления:

[super loadView];
containerOfControllersView=[[UIView alloc] initWithFrame:self.view.bounds];


Второе: перед тем, как добавить в качестве подпредставления представление контроллера представления, отметьте, что его фрейм должен иметь те же границы своего нового родительского представления.

    theView.frame =self.view.bounds;

Третье: контроллеры модального вида следует загружать из корневого контроллера вида, иначе они никогда не будут иметь правильный размер. Вот почему я реализовал базовый абстрактный класс для каждого контроллера представления, который наследует протокол, управляющий предварительным выбором и отклонением модальных контроллеров представления.
Надеюсь, это поможет кому-то еще.
Andrea

0 голосов
/ 17 июня 2011

Это было решено здесь: Рамка приложения оставляет пустую строку вверху

Но вы также можете указать свой кадр, вычтя 20 из y:

CGRect rect = [[UIScreen mainScreen] applicationFrame];
theView.frame = CGRectMake(rect.origin.x, rect.origin.y - 20, rect.size.width, rect.size.height);
...