Не полноэкранный UINavigationController

Можно ли использовать UINavigationController таким образом, чтобы он не использовал полное окно?

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

Ответ 1

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

Сначала создайте экземпляр UINavigationController, как обычно:

UINavigationController *nc = [[UINavigationController alloc] init];
self.navController = nc;
[nc release];

Затем создайте экземпляр UIView, ограниченный желаемым размером:

UIView *navView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, DESIRED_HEIGHT)];
navView.clipsToBounds = YES;
[navView addSubview:self.navController.view];   
[self.view addSubview:navView];
[navView release];

Для свойства navView clipsToBounds должно быть установлено значение YES, или UINavigationController и его просмотр по-прежнему будут отображаться в полноэкранном режиме. Затем добавьте UINavigationController в это ограниченное представление. Этот UIView может быть добавлен в представление UIViewController, как показано выше.

Следует отметить, что любые представления UIViewController, добавленные в UINavigationController, будут иметь свой контент, ограниченный границами navView, а не фрейм подразделов, добавленных в UINavigationController, поэтому содержимое в каждом подвью должно быть создано правильно отображение для границ навигации.

В любом случае этот метод действительно работает, поскольку я создал приложение, которое его успешно использует. Единственным другим способом, с которым я когда-либо работал, является создание настраиваемого класса контроллера навигации с нуля, дублирование функций UINavigationController, но без автоматического изменения размера (что я также делал в прошлом), и это может быть боль. Надеюсь, это поможет.

Ответ 2

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

Мой вызов и причина, по которой я публикую здесь, заключалась в том, чтобы ответить на этот вопрос и реорганизовать его для моих нужд, используя iOS5 и раскадровки. Это решение, вероятно, не будет хорошо работать для старых реализаций, но я думал, что все равно опубликую его.

Вот что я получил, и он работает хорошо (приложение для iPad). Все это настроено на моем UIViewController по умолчанию, установленном как root в представлении раскадровки.

Надеюсь, что это поможет!

- (void)viewDidLoad
{
    [super viewDidLoad];



    // Do any additional setup after loading the view, typically from a nib.

    /*vars: 
     rightSideView is the containing view - this is where the UINavigationController will sit, along with it view stack
     myStoryboard is self-explanatory I think
     myViewController is identified as in storyboard as "accountView", to be pulled from the storyboard and used as the rootview
     */


    //Steps

    //Add subview to this controller view (for positioning)


    UIView *rightSideView = [[UIView alloc]initWithFrame:CGRectMake(30, 30, 500, 600)];
    rightSideView.clipsToBounds = YES;//this little baby makes sure that the damn navigation bar clips!!

    rightSideView.backgroundColor = [UIColor grayColor];//so I can see it

    //instantiate view controller for nav controller root view
    UIStoryboard *myStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
    UIViewController *myViewController = [myStoryboard instantiateViewControllerWithIdentifier:@"accountView"];

    //create NavController
    UINavigationController *myNavController = [[UINavigationController alloc]initWithRootViewController:myViewController];

    //Add navController as one of my child ViewControllers

    [self addChildViewController:myNavController];

    //Add NavController view into my constrained view
    [rightSideView addSubview:myNavController.view];

    //Finally, add right side view as a subview of myself
    [self.view addSubview:rightSideView];



}

Ответ 4

Трудно ответить, потому что это сложно.

На iPhone у вас не может быть UINavigationController, который короче экрана. Поэтому, если вы хотите показать рекламный баннер, покажите его над нижней панелью инструментов или под верхней навигационной панелью.

На iPad у вас могут быть два UINavigationControllers бок о бок, но в моем случае они по-прежнему занимают всю высоту экрана. Учитывая поведение iPhone, я не пытался изменить поведение высоты на iPad.