我有collectionViewController和collectionViewCell包含TableView.CollectionView是水平布局。我想在滚动tableView时隐藏导航栏。有没有任何想法。
答案 0 :(得分:22)
从iOS 8开始,你可以使用
self.navigationController?.hidesBarsOnSwipe = true
当然,这需要您的ViewController嵌入在NavigationController中。 NavigationController的所有子VC都将继承此行为,因此您可能希望在viewWillAppear
中启用/禁用它。
您还可以在故事板中的导航控制器上设置相应的标志。
答案 1 :(得分:13)
每当您想要滚动表格视图时,您可以使用一些git库进行滚动导航栏。滚动顶部到底部/底部到顶部它会自动调整导航栏。
您可以像这样使用此代码来使用此库
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if let navigationController = self.navigationController as? ScrollingNavigationController {
navigationController.followScrollView(tableView, delay: 50.0)
}
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[(ScrollingNavigationController *)self.navigationController followScrollView:self.tableView delay:50.0f];
}
它有一些委托方法有助于管理与滚动和导航相关的所有这些。
AMScrollingNavbar click here for see
我认为这对你有帮助。
答案 2 :(得分:5)
创建一个 @property(assign,nonatomic)CGFloat currentOffset;
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
scrollView = self.collectionProductView;
_currentOffset = self.collectionProductView.contentOffset.y;
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat scrollPos = self.collectionProductView.contentOffset.y ;
if(scrollPos >= _currentOffset ){
//Fully hide your toolbar
[UIView animateWithDuration:2.25 animations:^{
[self.navigationController setNavigationBarHidden:YES animated:YES];
}];
} else {
//Slide it up incrementally, etc.
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}
请不要忘记再次粘贴 [self.navigationController setNavigationBarHidden:NO animated:YES];
at - viewwilldisappear或控制器移动到另一个控制器,因为这可能导致下一个视图控制器导航栏消失。
答案 3 :(得分:4)
试试这个:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.panGestureRecognizer.translation(in: scrollView).y < 0 {
navigationController?.setNavigationBarHidden(true, animated: true)
} else {
navigationController?.setNavigationBarHidden(false, animated: true)
}
}
答案 4 :(得分:0)
func scrollViewDidScroll(_ scrollView: UIScrollView)
{
// var navigationBarFrame = self.navigationController!.navigationBar.frame
let currentOffset = scrollView.contentOffset
if (currentOffset.y > (self.lastContentOffset?.y)!) {
if currentOffset.y > 0 {
initial = initial - fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y))
}
else if scrollView.contentSize.height < scrollView.frame.size.height {
initial = initial + fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y))
}
}
else {
if currentOffset.y < scrollView.contentSize.height - scrollView.frame.size.height {
initial = initial + fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y))
}
else if scrollView.contentSize.height < scrollView.frame.size.height && initial < maxPlus {
initial = initial - fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y))
}
}
if (initial <= maxMinus){
initial = maxMinus
self.tableviewTopConstrin.constant = 0
UIView.animate(withDuration: 0.4, animations: {
self.view.layoutIfNeeded()
})
}else if(initial >= maxPlus){
initial = maxPlus
self.tableviewTopConstrin.constant = 70
UIView.animate(withDuration: 0.4, animations: {
self.view.layoutIfNeeded()
})
}else{
}
self.lastContentOffset = currentOffset;
}
答案 5 :(得分:0)
在nao的答案之上:
如果scrollview高度不够小,则在隐藏导航栏时将导致不可滚动的scrollview。而且,如果scrollview不可滚动,则不会调用此函数,导航栏将永远消失
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let height = view.safeAreaLayoutGuide.layoutFrame.size.height
let scrolled = scrollView.panGestureRecognizer.translation(in: scrollView).y
if !(scrollView.visibleSize.height - height >= 90) {
if scrolled < 0 {
navigationController?.setNavigationBarHidden(true, animated: true)
} else {
navigationController?.setNavigationBarHidden(false, animated: true)
}
}
}
答案 6 :(得分:0)
其他解决方案有一个错误,如果您将手指从屏幕上抬起并再次按住,则会出现 navController...
这个方法更好:
// Show/Hide the NavigationBar when scrolling
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.y > -48 {
navigationController?.setNavigationBarHidden(true, animated: true)
} else {
navigationController?.setNavigationBarHidden(false, animated: true)
}
}