ChatGPT解决这个技术问题 Extra ChatGPT

导航栏出现在带有新 iOS7 SDK 的视图上

CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

在早期版本中,它可以正常工作。搜索栏显示在 statusbar 和导航栏下方。 tableview 出现在搜索栏下方

但是当我在 Xcode 5 sdk iOS 7 上运行它时,搜索栏不可见(我认为它位于状态栏和导航栏下方),并且导航栏也出现在表格视图上方。

iOS 7 稳定版本会修复它吗?

还是我的编码问题?

或者我们应该通过为 iOS 7 添加 y (y = statubar height + nav bar height) 值来处理它?

我最近下载了 Xcode 5 DP 以在 iOS 7 中测试我的应用程序。我注意到并确认的第一件事是我的视图边界并不总是调整大小以适应状态栏和导航栏。

在 viewDidLayoutSubviews 中,我打印视图的边界:

{{0, 0}, {320, 568}}

这导致我的内容出现在导航栏和状态栏下方。

我知道我可以通过获取主屏幕的高度,减去状态栏的高度和导航栏的高度来计算自己的高度,但这似乎是不必要的额外工作。

有没有其他人遇到过这个问题?

更新:

我已经找到了解决这个特定问题的方法。将导航栏的 translucent 属性设置为 NO:

self.navigationController.navigationBar.translucent = NO;

这将修复视图在导航栏和状态栏下方的框架。

但是,当您希望导航栏为半透明时,我还没有找到解决方法。例如,在全屏查看照片时,我希望导航栏是半透明的,并且视图被框在它下面。这行得通,但是当我切换显示/隐藏导航栏时,我遇到了更奇怪的结果。第一个子视图(UIScrollView)每次都会更改其边界 y 原点。

测试版软件。苹果开发者论坛更合适。此外,过渡指南中明确提到了该问题。

O
One Man Crew

这并不完全正确。 iOS 7 中引入了一个新属性,可让您像以前的 iOS 版本一样调整布局行为。将这段代码放在你的视图控制器中,你应该很高兴!导航栏占用的空间应自动计算

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

您需要在 -(void)viewDidLoad 方法中添加上述内容。

注意:您现在应该使用最新的 GM 版本的 iOS 7 和 Xcode 5,因为 API 已从 beta 版本更改。


在我的代码中它说edgeForExtendedLayout。使用未声明的标识符 UIExtendedEdgeNone。请帮忙。
它已更改为 UIRectEdgeNone
这正是为什么不应该在这里提出或回答这样的问题的原因。
我不明白为什么如果你想保持与 ios6 的兼容性,你必须通过代码引入条件案例来检查控制器是否具有该属性。
这似乎只有在视图嵌入 UINavigationController 时才有效。
B
Benjamin Toueg

https://i.stack.imgur.com/echAn.png

如果您在 Storyboard 中工作(我强烈推荐!),这就是解决方案:您可以在 Storyboard 中禁用 ViewController 的“扩展边缘”。您必须为每个 viewController 执行此操作。您可以通过单击 Stortyboard 中的 viewController 图标(在视图本身下方的 productOwner 旁边)禁用扩展边缘,然后选择属性检查器(如图像所示)。

这也会像 iOS 6 一样设置对齐线。

xCode 5 中另一个很棒的工具是“预览”:单击管家按钮(助手编辑器)并选择预览。在那里您可以选择 iOS 6 并查看您的故事板设计在 iOS 6 上的样子。

简直太棒了:D

[更新]

注意:禁用“Extend Edges”可能会导致应用程序在 iOS7 上进入后台时导航栏上出现黑光。发光也将在多任务视图中可见(双击主页按钮)。这可以通过将导航栏视图的背景颜色设置为白色来解决。

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];

是的,这是从故事板的角度来看的解决方案。谢谢你。
B
Bids

正如 OP 所说,有一个简单的解决方案是将导航栏设置为不透明。无需在代码中执行此操作,只需取消选中根导航栏的“半透明”:

https://i.stack.imgur.com/bt2ml.png


y
yhlin

self.edgesForExtendedLayout=UIRectEdgeNone;

它适用于 iOS 7 模拟器(Xcode 5 DP5)


这在 ios7 中运行良好,但如果我在 ios 6 及更早版本上运行该应用程序,视图会向上移动。有什么解决办法吗?我们还需要在每个视图控制器的 viewdid 加载方法中设置这个属性吗?
如果出现以下情况,您可以随时检查当前 iOS 是否为 7:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
c
codercat

这些答案都很有帮助,尤其是 MQoder,但对我来说,我还必须将默认顶部栏设置为“不透明的黑色导航”。

https://i.stack.imgur.com/FzfKK.png


Y
Yossi

@One Man Crew 的回答是正确的,但是:

我建议使用此代码以避免在旧版本上运行应用程序时出现错误:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif

R
Robasan

self.edgesForExtendedLayout = UIRectEdgeNone;

您需要在 AppDelegate#application:didFinishLaunchingWithOptions 上执行此操作:

self.window.backgroundColor = [UIColor whiteColor];

否则导航栏的背景颜色将变为灰色。因为透明的导航栏与窗口重叠。


E
Enrico Susatyo

如果你想在用户滚动你的表格视图时保持透明度,你可以设置它的 contentInset :

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

J
Jayprakash Dubey

一种解决方案是使用导航控制器。这会自动解决问题。还要使用 Xcode 5 而不是 Xcode Preview 版本,因为它们是 beta 版本。