我最近下载了Xcode 5 DP,在iOS 7上测试我的应用。我注意到并确认的第一件事是,视图的边界并不总是根据状态栏和导航栏调整大小。
在viewDidLayoutSubviews中,我打印了视图的边界:
{{0, 0}, {320, 568}}
这导致我的内容出现在导航栏和状态栏的下方。
我知道我可以通过获取主屏幕的高度,减去状态栏的高度和导航栏的高度来解释高度,但这似乎是不必要的额外工作。
我该如何解决这个问题?
更新:
我已经找到了解决这个问题的方法。将导航栏的半透明属性设置为NO:
self.navigationController.navigationBar.translucent = NO;
这将修复视图被框在导航栏和状态栏下面的问题。
然而,我还没有找到一个修复的情况下,当你想导航栏是半透明的。例如,在全屏查看一张照片时,我希望导航栏是半透明的,视图被框在它下面。这是可行的,但是当我切换显示/隐藏导航栏时,我经历了更奇怪的结果。第一个子视图(一个UIScrollView)每次都会改变它的边界y原点。
你可以通过在iOS7 SDK中实现一个名为edgesForExtendedLayout的新属性来实现这一点。请添加以下代码来实现此功能,
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
你需要在你的-(void)viewDidLoad方法中添加上面的内容。
iOS 7 brings several changes to how you layout and customize the
appearance of your UI. The changes in view-controller layout, tint
color, and font affect all the UIKit objects in your app. In
addition, enhancements to gesture recognizer APIs give you finer
grained control over gesture interactions.
Using View Controllers
In iOS 7, view controllers use full-screen layout. At the same time,
iOS 7 gives you more granular control over the way a view controller
lays out its views. In particular, the concept of full-screen layout
has been refined to let a view controller specify the layout of each
edge of its view.
The wantsFullScreenLayout view controller property is deprecated in
iOS 7. If you currently specify wantsFullScreenLayout = NO, the view
controller may display its content at an unexpected screen location
when it runs in iOS 7.
To adjust how a view controller lays out its views, UIViewController
provides the following properties:
edgesForExtendedLayout
The edgesForExtendedLayout property uses the UIRectEdge type,
which specifies each of a rectangle’s four edges, in addition to
specifying none and all. Use edgesForExtendedLayout to specify which
edges of a view should be extended, regardless of bar translucency. By
default, the value of this property is UIRectEdgeAll.
extendedLayoutIncludesOpaqueBars
If your design uses opaque bars, refine edgesForExtendedLayout by
also setting the extendedLayoutIncludesOpaqueBars property to
NO. (The default value of extendedLayoutIncludesOpaqueBars is NO.)
automaticallyAdjustsScrollViewInsets
If you don’t want a scroll view’s content insets to be automatically
adjusted, set automaticallyAdjustsScrollViewInsets to NO. (The
default value of automaticallyAdjustsScrollViewInsets is YES.)
topLayoutGuide, bottomLayoutGuide
The topLayoutGuide and bottomLayoutGuide properties indicate the
location of the top or bottom bar edges in a view controller’s view.
If bars should overlap the top or bottom of a view, you can use
Interface Builder to position the view relative to the bar by creating
constraints to the bottom of topLayoutGuide or to the top of
bottomLayoutGuide. (If no bars should overlap the view, the bottom of
topLayoutGuide is the same as the top of the view and the top of
bottomLayoutGuide is the same as the bottom of the view.) Both
properties are lazily created when requested.
请参考,苹果医生
我有一个场景,我使用苹果编写的BannerViewController来显示我的广告和嵌入在BannerViewController中的ScrollViewController。
为了防止导航栏隐藏我的内容,我必须做两个更改。
1)修改BannerViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
}
2)修改我的scrollviewcontroller
- (void)viewDidLoad
{
[super viewDidLoad];
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0) {
self.edgesForExtendedLayout = UIRectEdgeBottom;
}
}
现在广告正确地显示在视图的底部,而不是被导航栏覆盖,顶部的内容也没有被切断。