Xcode8/Swift3/ios10 导航栏有变化吗?
Xcode 8 / Swift 3 / ios 10 navigation bar changes?
我要返回"old" 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"
}
然后以这样的代码结束,用于切换视图:
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 兼容的解决方案。
我不知道 iOS10 关于独立导航栏有什么变化,所以我不能具体回答你的问题。但是,我可以告诉您两种可能的修复方法:
1) 为独立导航栏设置适当的约束和值:
确保约束设置如下:
- 导航 Bar.Top = 顶部布局 Guide.Bottom
- 导航 Bar.Leading = Superview.Leading
- 导航 Bar.Trailing = Superview.Trailing
然后,在栏的身份检查器中,添加具有这些值的用户定义属性:
- 关键路径:barPosition
- 类型:数字
- 价值:3
安装独立导航栏的方式就像它附加到导航控制器一样。
注意:该栏将出现在故事板中,就好像它的高度不正确一样。没关系!它会在您实际 运行 应用程序时适当调整。
更新:相同的解决方案,但不使用 "user defined attribute":
- 确保约束已按上述设置。
- 将情节提要的导航栏作为@IBOutlet 连接到它的视图控制器。
- 在视图控制器的 class 中,将 UINavigationBarDelegate 协议添加到 class 声明中。
- 在视图控制器的 viewDidLoad 方法中,将导航栏的委托设置为 self。
- 在视图控制器中,添加栏定位委托的 positionForBar 方法。 Return 表示 TopAttached 的 UIBarPosition。 (注意:UINavigationBarDelegate 继承自 UIBarPositioningDelegate 的该方法。)
有关详细信息,请参阅 Easily use a Navigation Bar without a corresponding Navigation Controller 演示 GIF。
有关 "user defined attribute" 方法的更多详细信息,请参阅 Even more easily use a Navigation Bar without a corresponding Navigation Controller!
2) 将视图嵌入到导航控制器中:
- 在故事板中,删除 "independent" 导航栏。
- 确保带有导航栏的视图是 selected.
- 从菜单中,select Editor/Embed In/Navigation 控制器。
注意:您不需要编写任何代码或为导航控制器制作子class。它会自动适当地处理您的导航栏。
旁注:我有一个在 iOS 7 中创建的应用程序,它也有一个独立的导航栏。在 Xcode 8/iOS 10 中,它遇到了同样的问题。
我使用了上面的第一种方法,它解决了导航栏问题。但是,然后我在启动时出现了闪烁(可能与 iOS 10 中的栏动画有关)。
我使用的是启动图像。我突然想到图像可能与导航栏动画不符。所以,我切换到方法 2,将我的视图嵌入到导航控制器中。然后,我删除了我一直使用的启动图像,并添加了一个新的启动屏幕——使用嵌入导航控制器的视图构建。这一起解决了闪烁问题。
通过 viewDidLoad() 中的疯狂试验和错误,我发现了为什么会出现此错误:
如果我创建带有空标题的按钮,我就会遇到问题,即像这样:
outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton));
使用 non-empty 标题创建并且有效:
outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "test", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton));
在这两种情况下,标题实际上也是稍后设置的 - 但重要的是在创建按钮时有一个 non-empty 标题。
我要返回"old" 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"
}
然后以这样的代码结束,用于切换视图:
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 兼容的解决方案。
我不知道 iOS10 关于独立导航栏有什么变化,所以我不能具体回答你的问题。但是,我可以告诉您两种可能的修复方法:
1) 为独立导航栏设置适当的约束和值:
确保约束设置如下:
- 导航 Bar.Top = 顶部布局 Guide.Bottom
- 导航 Bar.Leading = Superview.Leading
- 导航 Bar.Trailing = Superview.Trailing
然后,在栏的身份检查器中,添加具有这些值的用户定义属性:
- 关键路径:barPosition
- 类型:数字
- 价值:3
安装独立导航栏的方式就像它附加到导航控制器一样。
注意:该栏将出现在故事板中,就好像它的高度不正确一样。没关系!它会在您实际 运行 应用程序时适当调整。
更新:相同的解决方案,但不使用 "user defined attribute":
- 确保约束已按上述设置。
- 将情节提要的导航栏作为@IBOutlet 连接到它的视图控制器。
- 在视图控制器的 class 中,将 UINavigationBarDelegate 协议添加到 class 声明中。
- 在视图控制器的 viewDidLoad 方法中,将导航栏的委托设置为 self。
- 在视图控制器中,添加栏定位委托的 positionForBar 方法。 Return 表示 TopAttached 的 UIBarPosition。 (注意:UINavigationBarDelegate 继承自 UIBarPositioningDelegate 的该方法。)
有关详细信息,请参阅 Easily use a Navigation Bar without a corresponding Navigation Controller 演示 GIF。
有关 "user defined attribute" 方法的更多详细信息,请参阅 Even more easily use a Navigation Bar without a corresponding Navigation Controller!
2) 将视图嵌入到导航控制器中:
- 在故事板中,删除 "independent" 导航栏。
- 确保带有导航栏的视图是 selected.
- 从菜单中,select Editor/Embed In/Navigation 控制器。
注意:您不需要编写任何代码或为导航控制器制作子class。它会自动适当地处理您的导航栏。
旁注:我有一个在 iOS 7 中创建的应用程序,它也有一个独立的导航栏。在 Xcode 8/iOS 10 中,它遇到了同样的问题。
我使用了上面的第一种方法,它解决了导航栏问题。但是,然后我在启动时出现了闪烁(可能与 iOS 10 中的栏动画有关)。
我使用的是启动图像。我突然想到图像可能与导航栏动画不符。所以,我切换到方法 2,将我的视图嵌入到导航控制器中。然后,我删除了我一直使用的启动图像,并添加了一个新的启动屏幕——使用嵌入导航控制器的视图构建。这一起解决了闪烁问题。
通过 viewDidLoad() 中的疯狂试验和错误,我发现了为什么会出现此错误:
如果我创建带有空标题的按钮,我就会遇到问题,即像这样:
outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton));
使用 non-empty 标题创建并且有效:
outletCatalogNav.leftbarButtonItem = UIBarButtonItem(title: "test", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ownCatalogBackButton));
在这两种情况下,标题实际上也是稍后设置的 - 但重要的是在创建按钮时有一个 non-empty 标题。