iOS滚动隐藏导航栏

3

我曾尝试实现这样一种表视图,它可以检测滚动的量,并决定是否显示导航栏。

@interface HomeViewController () {
NSInteger scrollAmount;
bool navbarHidden = NO;
}

@implementation HomeViewController
@synthesize lastContentOffset = _lastContentOffset;
bool navbarHidden = NO;

- (void)awakeFromNib
{
    [super awakeFromNib];
    scrollAmount = 0;
    distance = 50;
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGPoint offset = scrollView.contentOffset;
    CGRect bounds = scrollView.bounds;
    UIEdgeInsets inset = scrollView.contentInset;
    if (offset.y > self.lastContentOffset.y)
    {
        scrollAmount++;
    }
    else
    {
        scrollAmount--;
    }
    bool awayFromTop = offset.y > distance + inset.top;
    if (awayFromTop && !navbarHidden) {
        [[self navigationController] setNavigationBarHidden:YES animated:YES];
        navbarHidden = YES;
    } else if (!awayFromTop || (scrollAmount < -100)) {
        [[self navigationController] setNavigationBarHidden:NO animated:YES];
        navbarHidden = NO;
    }
    self.lastContentOffset = offset;
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    scrollAmount = 0;
}

基本上,scrollViewDidScroll 计算滚动量,并且如果用户向上滚动,则将 scrollAmount 减去一个负数。
如果 offset 足够接近屏幕顶部(!awayFromTop)或滚动量小于-100,则期望导航栏被隐藏。
当我为 scrollAmount 输入 NSLog 时,程序运行正确,它会在用户离开顶部时隐藏导航栏,在靠近顶部时显示,并正确打印 scrollAmount
但是每当 scrollAmount 达到 -100 时,不执行 [[self navigationController] setNavigationBarHidden:NO animated:YES];],并且以某种方式无限地调用 scrollViewDidScroll ,即程序进入无限循环。 scrollAmount 会像 -100、-101、-102 …… -1005…… 这样打印。
然后我使用了以下代码:
if ([scrollView.panGestureRecognizer translationInView:self.view].y  < heightOfScreen/-4.0f && !navbarHidden) {
        [self.navigationController setNavigationBarHidden:YES animated:YES];
        navbarHidden = YES;
} else if ([scrollView.panGestureRecognizer translationInView:self.view].y  > heightOfScreen/4.0f && navbarHidden) {
        [self.navigationController setNavigationBarHidden:NO animated:YES];
        navbarHidden = NO;
}

很显然,scrollView.panGestureRecognizer translationInView:self.view].y的结果类似于scrollAmount,但它能够完美地工作,现在我想知道为什么我的实现失败了。欢迎提出任何想法。
1个回答

0
代码看起来没问题,但如果我是你,我会使用
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 

为了追踪滚动视图的滚动,因为scrollViewDidScroll在我的应用程序中会生成一些奇怪的行为。也许你想尝试一下。

实际上,我在问题中已经包含了一个替代且可行的解决方案(scrollView.panGestureRecognizer)。然而,我需要弄清楚那种奇怪的行为。得分的答案将是提供正确故障排除的答案,但感谢您的建议,也许有人可以利用它。 - Ömer Faruk Almalı

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接