Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
312 views
in Technique[技术] by (71.8m points)

ios - how to present a view controller on iOS7 without the status bar overlapping

I'm seeing when I migrated my app to iOS 7, the nav bar is appearing under the status bar when presenting a view controller. I think a lot of people have run into this same issue. Here's a screenshot of what I'm seeing:

existing nav

Requirements:

  • The new view must appear "modally", i.e. I need presentViewController.

  • Display some sort of nav bar or toolbar, with the status bar taking on the background color of the nav bar ala iOS 7 style.

  • It must work on iOS 6.

  • I'm using a xib to handle layout, with autolayout enabled.

Options:

A. Shift your view's frame down by a bit.

Ugh, are we back to the pre-iOS 5 days and mucking with frames? Also it's generally not a good idea mixing with autolayout.

B. Add a little gap up top below your nav bar.

One disadvantage of options A and B is the status bar won't blend into your nav:

nav with gap

C. Programatically add constraints.

The main disadvantage is you'll have to muck with constraints and calculating the nav and status bar heights. Yuck.

D. Stretch the navigation bar / toolbar's height to include the area of the status bar.

Looks good on iOS 7, but breaks on iOS 6. You'll need to programatically update the height of the nav bar, and also make sure the rest of your view updates appropriately. Messy.

enter image description here

E. Mess with iOS6/7 deltas in IB.

Multiple disadvantages: You'll be hardcoding the ios6/7 deltas. Also doesn't work with autolayout.

F. Use a nested UINavigationController.

This is the workaround I selected. See answer below.

uinavcontroller workaround

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The easiest workaround I've found is to wrap the view controller you want to present inside a navigation controller, and then present that navigation controller.

MyViewController *vc = [MyViewController new];
UINavigationController *nav = [[UINavigationController alloc] 
    initWithRootViewController:vc];
[self presentViewController:nav animated:YES completion:NULL];

Advantages:

  • No mucking with frames needed.
  • Same code works on iOS 6 an iOS 7.
  • Less ugly than the other workarounds.

Disadvantages:

  • You'll probably want to leave your XIB empty of navigation bars or toolbars, and programatically add UIBarButtonItems to the navigation bar. Fortunately this is pretty easy.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...