Swift iOS 11大标题导航栏捕捉,而不是平滑过渡
我面临一个问题,当在嵌入UIViewController内部的UITableView上滚动时,大标题导航栏会突然崩溃。问题似乎只有在屏幕上向上滚动时才会出现。当在屏幕上向下滚动时,标题会平滑地再次变大,但反之亦然 如果使用UITableViewController,则不会发生此问题 以下是在UITableViewController中滚动时的正常预期行为 这是在UIViewController内部使用UITableView时出现的中断、突然的转换 以下是中断实现的代码:Swift iOS 11大标题导航栏捕捉,而不是平滑过渡,swift,xcode,uitableview,uiviewcontroller,ios11,Swift,Xcode,Uitableview,Uiviewcontroller,Ios11,我面临一个问题,当在嵌入UIViewController内部的UITableView上滚动时,大标题导航栏会突然崩溃。问题似乎只有在屏幕上向上滚动时才会出现。当在屏幕上向下滚动时,标题会平滑地再次变大,但反之亦然 如果使用UITableViewController,则不会发生此问题 以下是在UITableViewController中滚动时的正常预期行为 这是在UIViewController内部使用UITableView时出现的中断、突然的转换 以下是中断实现的代码: class View
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的错误吗?我面临着同样的问题-我在
UINavigationController
中嵌入了UIViewController
,而UIViewController
具有指向安全区域的前导、尾随、顶部和底部约束的tableview。整个tableview表现得神经质/活泼。诀窍是将tableview的顶部约束更改为superview
这里我记录了更改约束的过程
我有一个类似的外观问题,通过删除
UINavigationBar.appearance().isTranslucent=false解决了这个问题
来自我的AppDelegate
更新:如果你不想要半透明,你应该启用。这样,所有的故障都会得到修复。将这行代码放在包含UITableView的UIViewController上
对我来说很好
迅捷的
目标-C
self.extendedLayoutIncludesOpaqueBars = YES;
将界面生成器中的UITableView自动布局顶部空间设置为“Superview”,而不是“安全区域”:
选择“视图控制器”
属性检查器勾选“不透明条下”和“顶部条下”
将scrollView的顶部约束设为“SuperView”而不是“SafeArea”的第二项
它对我起作用了
苏拉的答案是正确的,但我不知道如何在情节提要中修复它。最后,我用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
中
原始答案:如何配置导航栏?故事板,以编程方式?您能显示选项或代码吗?我认为UITableViewController有正确处理此行为的实现。@barbarity我用更多信息编辑了我的OP。@还有关于此的文档吗?哦,不,您完全正确。当内容大于屏幕时,它会突然崩溃。我会调查你的!我测试了这个,它是有效的。更改了UITableView的顶部约束,以引用UIViewController的Superview,而不是安全区域,现在它是平滑的!但我觉得这仍然是苹果的一个缺陷?或者需要关于它的文档。太棒了。正在将collectionView固定到安全的顶部锚定,并更改为view.topAnchor修复了该问题。谢谢我在XIB中使用viewController中的集合视图,并将约束设置为superview,但仍然面临相同的问题。它表现得神经质/活泼。这有什么解决方案吗?我正在尝试为UITableViewController中的表视图修复此问题,但我无法在情节提要中更改表视图的约束。我是否必须使用UIViewController并添加自己的表视图?表视图包含动态单元格。我尝试在viewWillAppear()中使用NSLayoutConstraint.activate([tableView.topAnchor.constraint(equalTo:view.superview!.topAnchor)]以编程方式更改它,但没有效果。非常感谢您的回答。帮我省去了一个大麻烦。我可以确认这解决了这个问题。这太糟糕了。我想要一个非半透明的导航栏。取消选中“半透明”后会出现反弹效果。这很有效,谢谢!无论您是在UIViewController中使用UITableView还是将UITableViewController用作子视图控制器,这似乎都可以解决问题。当导航控制器包含在选项卡控制器中时,这会导致我的安全区域出现问题。这样,我的表视图就不会考虑由选项卡栏创建的底部安全区域。@Connor除了ExtendedLayoutCludeSopaqueBars之外,您还可以指定哪些边是用edgesForExtendedLayout扩展的;=>ExtendedLayoutCludeSopaqueBars=真边ForExtendedLayout=[.top]
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)
])