Swift3 Xcode 8/Swift 3/ios 10导航栏更改?

Swift3 Xcode 8/Swift 3/ios 10导航栏更改?,swift3,xcode8,ios10,Swift3,Xcode8,Ios10,我将回到旧的xcode 7/swift 2项目 我所有的导航栏都发生了奇怪的事情 我有这样的代码: @IBOutlet weak var outletCatalogNav: UINavigationItem! //... outletCatalogNav.title = "my title"; //... outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.

我将回到旧的xcode 7/swift 2项目

我所有的导航栏都发生了奇怪的事情

我有这样的代码:

@IBOutlet weak var outletCatalogNav: UINavigationItem!

//...

outletCatalogNav.title = "my title";

//...

outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton));

//...    

if (outletCatalogNav.leftbarButtonItem != nil) {
  outletCatalogNav.leftbarButtonItem.leftBarButtonItem!.title = " back"
}
outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton));
然后,切换视图的代码如下所示:

TmpOldViewController.present(TmpNewViewController!, animated: TmpAnimate, completion: nil):
信息:由于历史原因,我自己处理视图控制器更改,因为iOS应用程序代码是从完全不同的开发平台、语言和环境转换而来的

无论如何,在过去,这个按钮只会放在标题的左边。现在在ios10模拟器中,它至少呈现在下面,但仍然在左边,这意味着我用于导航栏的原始高度不再足够,因为它被其他控件覆盖了-在下面的屏幕截图中,您可以看到这一点,并显示左下角的蓝色文本提示

制约因素包括:

Navigation Bar.top = Top Layout Guide.bottom
TableViewCatalog.top = Navigation Bar.bottom
Navigation Bar.leading = leadingMargin - 20
trailingMargin = Navigation Bar.trailing - 20

什么改变了?我在导航栏中找不到任何有关更改的引用。作为参考,由于改为swift 3,我现在只针对ios8+,因此我不需要ios7兼容的解决方案。

我不知道iOS 10中关于独立导航栏的更改,所以我无法具体回答您的问题。但是,我可以告诉您两种可能的修复方法:

1为独立导航栏设置适当的约束和值: 确保约束设置如下所示: -导航栏。顶部=顶部布局指南。底部 -导航栏.Leading=Superview.Leading -导航栏.Trailing=Superview.Trailing

然后,在条形图的标识检查器中,添加具有以下值的用户定义属性: -关键路径:barPosition -类型:编号 -价值:3

这将安装独立导航条,使其像连接到导航控制器一样工作

注意:该条将显示在情节提要中,好像它的高度不正确。没关系!当您实际运行应用程序时,它将进行适当调整

更新:相同的解决方案,但不使用用户定义的属性: -确保如上所述设置约束。 -将情节提要的导航栏作为@IBOutlet连接到其视图控制器。 -在视图控制器的类中,将UINavigationBarDelegate协议添加到类声明中。 -在视图控制器的viewDidLoad方法中,将导航栏的委托设置为self。 -在视图控制器中,添加条形定位代理的positionForBar方法。返回表示TopAttached的UIBarPosition。注意:UINavigationBarDelegate从UIBarPositionDelegate继承此方法

有关更多详细信息,请参阅演示GIF

有关用户定义的属性方法的更多详细信息,请参阅

2将视图嵌入导航控制器: -在情节提要中,删除独立导航栏。 -确保选择了带有导航栏的视图。 -从菜单中,选择编辑器/嵌入/导航控制器

注意:您不需要为导航控制器编写任何代码或创建子类。它只会自动适当地处理你的导航栏

附带说明:我有一个应用程序,是在iOS 7中创建的,它也有一个独立的导航栏。在Xcode 8/iOS 10中,它也有同样的问题

我使用了上面的第一种方法,修复了导航条问题。然而,我在启动时有一个闪烁,可能与iOS 10中的工具栏动画有关


我用的是发射图像。我突然想到,与导航栏动画相比,图像可能处于关闭状态。因此,我切换到方法2,将我的视图嵌入导航控制器。然后,我删除了我一直在使用的发射图像,并添加了一个新的发射屏幕——内置在导航控制器中的视图。总之,这解决了闪烁问题。

通过在viewDidLoad中进行一些疯狂的尝试和错误,我找到了发生此错误的原因:

如果我创建的按钮标题为空,则会出现问题,即:

@IBOutlet weak var outletCatalogNav: UINavigationItem!

//...

outletCatalogNav.title = "my title";

//...

outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton));

//...    

if (outletCatalogNav.leftbarButtonItem != nil) {
  outletCatalogNav.leftbarButtonItem.leftBarButtonItem!.title = " back"
}
outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton));
创建一个非空标题,它可以工作:

outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "test", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton));

在这两种情况下,标题实际上也会在以后设置,但重要的是在创建按钮时有一个非空标题。

您是否使用独立的导航栏,即仅使用导航栏,没有导航控制器?@leanne是的-我添加了更多代码和解释,以防相关。另外两个问题:1导航栏还有哪些其他限制?2在实际设备上运行时,它会做同样的事情吗?@leanne Navigation Bar.top=top Layout Guide.bottom和TableViewCatalog.top=Navigation Bar.bottom今天晚些时候将在iphone 6上进行测试,在ios8+要求之后,我不得不放弃测试iPhone4,所以目前使用模拟器尝试通过创建一个全新的UIBarButtonItem来替换.title=back。我认为条形按钮项的框架计算方式有一些变化。是否有任何特殊原因不设置:TableViewCatalog.top=Navigation bar.bottom?我可以保留吗?使用解决方案1:通过设置barPosition可以做什么
不知何故,你的解决方案2——这是否意味着我必须删除或至少重写我自己的所有逻辑,以便在整个应用程序中控制要显示的视图?这是一个相当简单的基于堆栈的逻辑,但从理论上讲,我可能会倾向于支持多个级别。您可以保留TableViewCatalog.top=Navigation Bar.bottom。是的,有一种方法可以在运行时执行解决方案1。请参阅这篇博文:我已经更新了我的答案,包括基本说明和指向解决方案1两个版本的链接。