【发布时间】:2018-03-22 00:37:43
【问题描述】:
问题
导航栏在滚动时会显示动画 (hidesBarsOnSwipe)。如果页面上有一个带有部分标题的表格,部分标题将贴在视图顶部并在用户滚动时跟随用户。当这两者一起使用时,当导航栏隐藏时,节标题和导航栏之间存在间隙,显示背景表格单元格。我希望部分标题跟随导航栏,因为它没有间隙地隐藏。
对于我的问题,使用节标题并不是绝对必要的。我只是想要一个贴在屏幕顶部并在用户滚动时跟随用户的栏。
我已经尝试了下面发布的示例的替代方法,它使用UITableViewController。调整插图会导致部分标题滑到状态栏下方。使用包含静态 UIView(用于节标题)和 UITableView 的 UIViewController 会导致同样的问题。
这个问题的合适解决方案是什么?
示例
状态栏的背景是灰色的,节标题的背景是红色的,以更好地突出导航栏和节标题之间的差距。随着表格慢慢向下滚动,从缝隙中窥视的黄色表格单元格变得明显。隐藏导航栏后,部分标题按预期在状态栏上重置。
用于上述动画的视图控制器:
class TableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Color status bar background.
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = .lightGray
}
UIApplication.shared.statusBarStyle = .default
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 20
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
}
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
view.backgroundColor = .red
return view
}
}
更新 1
从状态栏中删除背景颜色并不能解决我看到的问题。下面的 GIF 显示了状态栏处于原始透明状态时的行为。
TLYShyNavBar 有一个我想要实现的行为的 GIF(在下面添加)。这个项目没有维护,如果没有额外的操作就无法工作,但是有一个很好的例子来说明我期望的行为是什么样的。
更新 2
我知道这种行为不是错误/问题,而是 Apple 更喜欢它。为视图的背景着色是一个选项(参见下面的answer)。对于这种情况,有两种方法可以解决:
-
为背景着色以匹配导航栏并移除导航栏的阴影以使视图无缝。
self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.isTranslucent = false
-
为背景着色以匹配红色条。
不幸的是,这种方法掩盖了间隙而不是消除它。它使其中一个条在动画期间出现变形,直到它们在两种情况下都完成过渡。
【问题讨论】:
-
@matt 删除状态栏的背景颜色并不能解决问题。我在更新中为我的问题添加了更多详细信息。
标签: ios uinavigationbar ios11