【问题标题】:How to only show a a shadow under navigation bar once user beings scrolling?一旦用户滚动,如何只在导航栏下显示阴影?
【发布时间】:2019-07-01 20:10:29
【问题描述】:
基本上,一旦用户开始滚动,我想在导航栏下方启用阴影半径。导航栏位于 TableView 控制器中,当视图控制器第一次打开时,导航控制器应该处于正常状态,但一旦用户开始滚动,就会出现阴影。
以下是我目前用于在导航栏下方创建阴影的代码:
//Adds Shadow below navigation bar
self.navigationController?.navigationBar.layer.masksToBounds = false
self.navigationController?.navigationBar.layer.shadowColor = UIColor.lightGray.cgColor
self.navigationController?.navigationBar.layer.shadowOpacity = 0.8
self.navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0, height: 2.0)
self.navigationController?.navigationBar.layer.shadowRadius = 2
如何才能在用户开始滚动时才启用?
【问题讨论】:
标签:
ios
swift
uinavigationbar
【解决方案1】:
您需要添加这些行以向函数显示阴影并从以下委托方法调用该函数:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
另外,调用与你的 showShadow 函数相反的函数可能会有所帮助,这将删除以下委托方法中的阴影:
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
【解决方案2】:
将此添加到您的视图控制器:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.layer.masksToBounds = false
self.navigationController?.navigationBar.layer.shadowColor = UIColor.lightGray.cgColor
self.navigationController?.navigationBar.layer.shadowOpacity = 0
self.navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0, height: 2.0)
self.navigationController?.navigationBar.layer.shadowRadius = 2
}
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
self.navigationController?.navigationBar.layer.shadowOpacity = 0.8
}
如果您想在滚动停止时移除阴影,您可以在此方法中将值重置为正常:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
self.navigationController?.navigationBar.layer.shadowOpacity = 0
}
当用户拖动 TableView 而不是滚动时,您可能也想这样做,在这种情况下,也添加这两个:
override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
self.navigationController?.navigationBar.layer.shadowOpacity = 0.8
}
override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
self.navigationController?.navigationBar.layer.shadowOpacity = 0
}