Не полноэкранный 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];
}
Ответ 3
Это может помочь?
Добавление UINavigationController в качестве подзадачи UIView
Вы всегда можете использовать класс UINavigationBar напрямую и сами реализовать управляющий код.
Ответ 4
Трудно ответить, потому что это сложно.
На iPhone у вас не может быть UINavigationController, который короче экрана.
Поэтому, если вы хотите показать рекламный баннер, покажите его над нижней панелью инструментов или под верхней навигационной панелью.
На iPad у вас могут быть два UINavigationControllers бок о бок, но в моем случае они по-прежнему занимают всю высоту экрана. Учитывая поведение iPhone, я не пытался изменить поведение высоты на iPad.