iOS 11 大标题导航栏捕捉而不是平滑过渡
Posted
技术标签:
【中文标题】iOS 11 大标题导航栏捕捉而不是平滑过渡【英文标题】:iOS 11 large title navigation bar snaps instead of smooth transition 【发布时间】:2018-06-10 20:45:42 【问题描述】:我遇到了一个问题,即在嵌入 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
导航栏已选中首选大标题,并且导航项已将大标题设置为自动。
上面两个示例的代码和配置完全相同,除了一个是 UITableViewController 与 UIViewController 内的 UITableView。
我还观察到,如果 UITableView 的内容不超过视图的高度,则不会发生损坏的行为。但一旦单元格数量超出屏幕显示范围,它就会中断。
知道我做错了什么还是 ios 11 的错误?
【问题讨论】:
您如何配置导航栏?故事板,以编程方式?你能显示选项或代码吗? 我认为 UITableViewController 的实现可以正确处理这种行为。 @barbarity 我用更多信息编辑了我的 OP。 @AndyC 那里有相关文档吗? 哦,不。你完全正确。当内容大于屏幕时,它会突然折叠。我会调查 【参考方案1】:我遇到了同样的问题 - 我在 UINavigationController
中嵌入了 UIViewController
,UIViewController
的 tableview 具有对安全区域的前导、尾随、顶部、底部约束。整个 tableview 表现得跳跃/活泼。诀窍是将 tableview 的顶部约束更改为 superview。
这里我记录了改变约束 tableview iOS 11 bug constraint change
【讨论】:
谢谢!我对此进行了测试,并且可以正常工作。将 UITableView 的顶部约束更改为引用 UIViewController 的 Superview 而不是 Safe Area,现在它很流畅!我觉得这仍然是Apple的一个错误?或者需要有关于它的文档。 太棒了。将 collectionView 固定到安全的顶部锚点,并更改为 view.topAnchor 解决了该问题。谢谢 我在 XIB 的 viewController 中使用集合视图并将约束设置为 superview 但仍然面临同样的问题。它表现得跳跃/活泼。有什么解决办法吗? 我正在尝试为 UITableViewController 中的表格视图修复此问题,但我无法更改情节提要中表格视图的约束。我必须使用 UIViewController 并添加自己的表格视图吗?表格视图包含动态单元格。我尝试使用 NSLayoutConstraint.activate([ tableView.topAnchor.constraint(equalTo: view.superview!.topAnchor)]) 在 viewWillAppear() 中以编程方式更改它,但这没有效果。 非常感谢您的回答。让我头疼不已。【参考方案2】:将这行代码放在包含 UITableView 的 UIViewController 上 对我来说很好用。
斯威夫特
extendedLayoutIncludesOpaqueBars = true;
目标-C
self.extendedLayoutIncludesOpaqueBars = YES;
将 UITableView AutoLayout 顶部空间设置为“Superview”而不是“Safe Area”
【讨论】:
这行得通,谢谢!无论您是在 UIViewController 中使用 UITableView 还是将 UITableViewController 作为子视图控制器,这似乎都可以解决问题。 当我的导航控制器包含在选项卡控制器中时,这会导致我的安全区域出现问题。有了这个,我的表格视图不考虑标签栏创建的底部安全区域。 @Connor 除了extendedLayoutIncludesOpaqueBars,还可以用edgesForExtendedLayout指定哪些边被扩展; ==> extendedLayoutIncludesOpaqueBars = true edgesForExtendedLayout = [.top]【参考方案3】:我遇到了类似的问题并通过删除 UINavigationBar.appearance().isTranslucent = false
解决了它
来自我的 AppDelegate。
更新:如果你不想要半透明,你应该启用extendedLayoutIncludesOpaqueBars
。这样所有的故障都得到了修复。
【讨论】:
我可以确认这可以解决问题。这太糟糕了。我想要一个非半透明的导航栏。 取消选中半透明后会出现弹跳效果。【参考方案4】:在界面生成器中:
-
选择您的“viewController”。
属性检查器勾选“Under Opaque Bars”和“Under Top Bars”。
将您的 scrollView 第二个项目的最高约束设置为“SuperView”而不是“SafeArea”。
它对我有用。
Reference
【讨论】:
【参考方案5】: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
.
原答案:https://***.com/a/48321447/1386369
【讨论】:
以上是关于iOS 11 大标题导航栏捕捉而不是平滑过渡的主要内容,如果未能解决你的问题,请参考以下文章