iOS 11 个大标题导航栏快照而不是平滑过渡
iOS 11 large title navigation bar snaps instead of smooth transition
我遇到了一个问题,即在 UIViewController 内嵌的 UITableView 上滚动时,大标题导航栏会突然折叠。该问题似乎只在屏幕上向上滚动时出现。在屏幕上向下滚动时,标题会平滑地再次变大,但反之则不然。
如果使用 UITableViewController,则不会出现此问题。
这是在 UITableViewController 中滚动时的正常预期行为。
这里是在 UIViewController 中使用 UITableView 时中断的、突然的过渡。
这是损坏的实现代码:
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 12
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Basic", for: indexPath)
cell.textLabel?.text = "Title \(indexPath.row)"
return cell
}
}
导航栏已选中 Prefers Large Titles,导航项已将 Large Title 设置为 Automatic。
除了一个是 UITableViewController 还是一个 UIViewController 内部的 UITableView 之外,上面两个示例的代码和配置完全相同。
我还观察到,如果 UITableView 的内容不超过视图的高度,则不会发生损坏的行为。但是一旦单元格多于屏幕无法容纳的单元格,它就会崩溃。
知道我做错了什么或者这是 iOS 11 错误吗?
我遇到了同样的问题 - 我在 UINavigationController
中嵌入了 UIViewController
,UIViewController
的表视图带有 安全区域的前导、尾随、顶部、底部约束。整个表视图表现得神经质/活泼。诀窍是将 tableview 的顶部约束更改为 superview.
这里我记录了改变约束
tableview iOS 11 bug constraint change
我遇到了类似的问题并通过删除 UINavigationBar.appearance().isTranslucent = false
解决了它
来自我的 AppDelegate。
更新:如果你不想半透明,你应该启用extendedLayoutIncludesOpaqueBars
。这样所有的故障都被修复了。
将这行代码放在包含 UITableView 的 UIViewController 上
对我来说很好。
Swift
extendedLayoutIncludesOpaqueBars = true;
Objective-C
self.extendedLayoutIncludesOpaqueBars = YES;
将 UITableView AutoLayout top space 设置为 "Superview" 而不是 "Safe Area"
在界面生成器中:
- Select 你的 "viewController".
- 属性检查器勾选 "Under Opaque Bars" 和 "Under Top Bars"。
- 将 scrollView 第二项的最高约束设置为 "SuperView" 而不是 "SafeArea"。
它对我有用。
Solar 的回答是正确的,但我不知道如何在故事板中修复它。最后,我在另一个问题中解决了 Roman 的解决方案,方法是添加:
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: view.topAnchor),
scrollView.leftAnchor.constraint(equalTo: view.leftAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
scrollView.rightAnchor.constraint(equalTo: view.rightAnchor)
])
在 viewDidLoad
.
原回答:
我遇到了一个问题,即在 UIViewController 内嵌的 UITableView 上滚动时,大标题导航栏会突然折叠。该问题似乎只在屏幕上向上滚动时出现。在屏幕上向下滚动时,标题会平滑地再次变大,但反之则不然。
如果使用 UITableViewController,则不会出现此问题。
这是在 UITableViewController 中滚动时的正常预期行为。
这里是在 UIViewController 中使用 UITableView 时中断的、突然的过渡。
这是损坏的实现代码:
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 12
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Basic", for: indexPath)
cell.textLabel?.text = "Title \(indexPath.row)"
return cell
}
}
导航栏已选中 Prefers Large Titles,导航项已将 Large Title 设置为 Automatic。
除了一个是 UITableViewController 还是一个 UIViewController 内部的 UITableView 之外,上面两个示例的代码和配置完全相同。
我还观察到,如果 UITableView 的内容不超过视图的高度,则不会发生损坏的行为。但是一旦单元格多于屏幕无法容纳的单元格,它就会崩溃。
知道我做错了什么或者这是 iOS 11 错误吗?
我遇到了同样的问题 - 我在 UINavigationController
中嵌入了 UIViewController
,UIViewController
的表视图带有 安全区域的前导、尾随、顶部、底部约束。整个表视图表现得神经质/活泼。诀窍是将 tableview 的顶部约束更改为 superview.
这里我记录了改变约束 tableview iOS 11 bug constraint change
我遇到了类似的问题并通过删除 UINavigationBar.appearance().isTranslucent = false
解决了它
来自我的 AppDelegate。
更新:如果你不想半透明,你应该启用extendedLayoutIncludesOpaqueBars
。这样所有的故障都被修复了。
将这行代码放在包含 UITableView 的 UIViewController 上 对我来说很好。
Swift
extendedLayoutIncludesOpaqueBars = true;
Objective-C
self.extendedLayoutIncludesOpaqueBars = YES;
将 UITableView AutoLayout top space 设置为 "Superview" 而不是 "Safe Area"
在界面生成器中:
- Select 你的 "viewController".
- 属性检查器勾选 "Under Opaque Bars" 和 "Under Top Bars"。
- 将 scrollView 第二项的最高约束设置为 "SuperView" 而不是 "SafeArea"。
它对我有用。
Solar 的回答是正确的,但我不知道如何在故事板中修复它。最后,我在另一个问题中解决了 Roman 的解决方案,方法是添加:
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: view.topAnchor),
scrollView.leftAnchor.constraint(equalTo: view.leftAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
scrollView.rightAnchor.constraint(equalTo: view.rightAnchor)
])
在 viewDidLoad
.
原回答: