状态栏和导航栏显示在我的视图上';ios7中的s界
我最近下载了5DP,用iOS 7测试我的应用程序。我注意到并确认的第一件事是,我的视图边界并不总是根据状态栏和导航栏调整大小 在状态栏和导航栏显示在我的视图上';ios7中的s界,ios,ios7,Ios,Ios7,我最近下载了5DP,用iOS 7测试我的应用程序。我注意到并确认的第一件事是,我的视图边界并不总是根据状态栏和导航栏调整大小 在viewdilayoutsubviews中,我打印视图的边界: {0,0},{320568} 这将导致我的内容出现在导航栏和状态栏下方 我知道我可以通过计算主屏幕的高度,减去状态栏的高度和导航栏的高度来计算高度,但这似乎是不必要的额外工作 如何解决此问题 更新: 我已经找到了解决这个具体问题的办法。将导航栏的半透明属性设置为否: self.navigationContr
viewdilayoutsubviews
中,我打印视图的边界:
{0,0},{320568}
这将导致我的内容出现在导航栏和状态栏下方
我知道我可以通过计算主屏幕的高度,减去状态栏的高度和导航栏的高度来计算高度,但这似乎是不必要的额外工作
如何解决此问题
更新:
我已经找到了解决这个具体问题的办法。将导航栏的半透明属性设置为否:
self.navigationController.navigationBar.translucent = NO;
这将修复视图在导航栏和状态栏下方的边框
然而,我还没有找到一个修复的情况下,当你想导航栏是半透明的。例如,在全屏查看照片时,我希望导航栏是半透明的,并且视图要在其下方加框。这是可行的,但当我切换显示/隐藏导航栏时,我体验到了更奇怪的结果。第一个子视图(UIScrollView)的边界y原点每次都会更改。如果希望视图具有半透明的导航栏(这有点不错),则必须设置contentInset或类似设置 我是这样做的:
// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;
myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}
可以通过在ios7sdk中实现名为
edgesForExtendedLayout
的新属性来实现这一点。请添加以下代码以实现此目的
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
您需要在-(void)viewDidLoad
方法中添加上述内容
iOS 7对布局和自定义应用程序的方式进行了一些更改
用户界面的外观。视图控制器布局、色调的更改
颜色和字体会影响应用程序中的所有UIKit对象。在里面
此外,对手势识别器API的增强为您提供了更好的
对手势交互的粒度控制
使用视图控制器
在iOS 7中,视图控制器使用全屏布局。同时,,
iOS 7使您能够更精确地控制视图控制器的运行方式
展示其观点。特别是全屏布局的概念
已进行优化,以允许视图控制器指定每个视图的布局
它的视野边缘
中不推荐使用wantsFullScreenLayout
视图控制器属性
iOS 7。如果当前指定了wantsFullScreenLayout=NO
,则视图
控制器可能会在意外的屏幕位置显示其内容
当它在iOS 7中运行时
要调整视图控制器布局视图的方式,UIViewController
提供以下属性:
- 边缘扩展布局
edgesForExtendedLayout
属性使用UIRectEdge
类型,
它指定矩形的四条边中的每一条,除了
指定none和all。使用edgesForExtendedLayout
指定
应延伸视图的边,而不考虑条形图的半透明性。通过
默认情况下,此属性的值为UIRectEdgeAll
- 扩展布局包括不透明条
extendedlayoutincludesopaquebar
属性设置为
否。(ExtendedLayoutCludeSopaqueBars的默认值为否)
- 自动调整滚动视图插图
自动调整滚动视图插图设置为否。(修订)
automaticallyaadjustsscrollviewsinsets
的默认值为YES)
- 顶部布局指南、底部布局指南
topLayoutGuide
和bottomLayoutGuide
属性表示
视图控制器视图中顶部或底部栏边的位置。
如果条形图应与视图的顶部或底部重叠,则可以使用
界面生成器,通过创建
约束到topLayoutGuide
底部或顶部
底部布局指南。(如果没有任何条形图与视图重叠,则
topLayoutGuide
与视图顶部和视图顶部相同
bottomLayoutGuide
与视图底部相同。)两者
属性是在请求时惰性创建的
请参阅,您不必计算要将所有内容向下移动多远,这有一个内置属性。在界面生成器中,高亮显示视图控制器,然后导航到属性检查器。在这里,您将看到“延伸边”旁边的一些复选框。如您所见,在第一个屏幕截图中,默认选择的内容显示在顶部和底部栏下,而不是不透明栏下,这就是为什么将栏样式设置为“非半透明”对您有效的原因
正如您在第一个屏幕截图中所看到的,有两个UI元素隐藏在导航栏下面。(我在IB中启用了线框来说明这一点)这些元素、UIButton和UISegmentedControl都将其“y”原点设置为零,并且视图控制器设置为允许顶部栏下方的内容
第二个屏幕截图显示了取消选中“顶栏下”复选框时发生的情况。如您所见,“视图控制器”视图已适当下移,以便其y原点位于导航栏的正下方
这也可以通过使用-[UIViewController edgesForExtendedLayout]
以编程方式实现。这里有一个链接到
[self setEdgesForExtendedLayout:UIRectEdgeNone];
self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific
- (void) viewDidLayoutSubviews {
// only works for iOS 7+
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect viewBounds = self.view.bounds;
CGFloat topBarOffset = self.topLayoutGuide.length;
// snaps the view under the status bar (iOS 6 style)
viewBounds.origin.y = topBarOffset * -1;
// shrink the bounds of your view to compensate for the offset
viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
self.view.bounds = viewBounds;
}
}
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
- (void) viewDidLayoutSubviews {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect viewBounds = self.view.bounds;
CGFloat topBarOffset = self.topLayoutGuide.length;
viewBounds.origin.y = topBarOffset * -1;
self.view.bounds = viewBounds;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0) {
self.edgesForExtendedLayout = UIRectEdgeBottom;
}
}
if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.edgesForExtendedLayout = UIRectEdge.None
}
override func viewDidLoad() {
super.viewDidLoad()
edgesForExtendedLayout = []
}
override func viewWillAppear(_ animated: Bool) {
self.edgesForExtendedLayout = []
}
if #available(iOS 11.0, *) {} else {
self.edgesForExtendedLayout = []
self.navigationController?.view.backgroundColor = .white
}