向下滚动:标题栏显示和隐藏

时间:2016-06-15 16:52:38

标签: ios objective-c xcode

您好我的视图控制器似乎有些问题。当用户向下滚动时,我的标题栏将慢慢淡出,一旦用户向上滚动标题栏将慢慢淡入。我的问题是当向下滚动时,标题栏有时会卡住并变得不稳定,如下图所示:< / p>

Header bar fading enter image description here

enter image description here

白色条卡在没有干净的显示和消失效果的情况下卡住。这是代码:

    #warning new code for hide header bar
/**
 *  Catch scroll event for calculating Show and hide header view
 * Note that _menu (tableView) is the scrollable control
 */
[_contentTableView addObserver:self
        forKeyPath:@"contentOffset"
           options:NSKeyValueObservingOptionOld
           context:nil];
_hidesBarsOnScroll = YES;
}

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context
{
UITableView *tempTableView = _contentTableView;

CGPoint oldOffset = [(NSValue *)change[NSKeyValueChangeOldKey] CGPointValue];

if (!_hidesBarsOnScroll || tempTableView.contentOffset.y == oldOffset.y)
    return;

// Show on scroll up
if (_barsHidden &&
    tempTableView.contentOffset.y < oldOffset.y &&
    tempTableView.contentOffset.y + tempTableView.bounds.size.height < tempTableView.contentSize.height) // Skip on bottom
{

    if (tempTableView.contentOffset.y < 60) {
        _header.hidden = NO;
        float alpha = 1.0 - tempTableView.contentOffset.y / 64.0;
        [_header setBackgroundColor:[UIColor colorWithRed: 0.1216 green: 0.1569 blue: 0.2078 alpha: alpha]];
    }
    if (tempTableView.contentOffset.y<=0)
    {
        CGRect contentViewFrame = _contentTableView.frame;
        contentViewFrame.origin.y = 64;
        _contentTableView.frame = contentViewFrame;

        [_header setBackgroundColor:_headerColor];
        _barsHidden = NO;
    }
}

// Hide on scroll down
if (!_barsHidden &&
    tempTableView.contentOffset.y > 0 && // Skip on top
    tempTableView.contentOffset.y > oldOffset.y)
{
    float alpha = 1.0 - tempTableView.contentOffset.y / 64.0;
    [_header setBackgroundColor:[UIColor colorWithRed: 0.1216 green:     0.1569 blue: 0.2078 alpha: alpha]];

    CGRect contentViewFrame = _contentTableView.frame;
    contentViewFrame.origin.y = 84-tempTableView.contentOffset.y;
    _contentTableView.frame = contentViewFrame;

    if (tempTableView.contentOffset.y >= 64) {
        _barsHidden = YES;
        _header.hidden = YES;
    }
}
}

1 个答案:

答案 0 :(得分:0)

UITableView继承了UIScrollView委托,因此跟踪内容偏移量可以简化如下......

// in the view controller
self.contentTableView.delegate = self;

然后实施

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView == self.contentTableView) {
        // header logic
        self.header = [self alphaAtOffset:scrollView.contentOffset.y];
    }
}

问题的下一部分是产生一个函数映射滚动位置到标题alpha。该函数的域应该是任何浮点数,范围应该是0.0到1.0。

我无法确切地告诉您代码中的内容,但通常这样的函数如下所示:

                    SOME_THRESHOLD
                          |
                          v
alpha == 1  ----------|
                      |\
                      | \
                      |  \--------- alpha == 0
                      |
 neg contentOffset.y  |  pos contentOffset.y

其中SOME_THRESHOLD是滚动偏移,您希望标题完全消失。这可以在代码中呈现如下......

#define SOME_THRESHOLD 64.0

- (CGFloat)alphaAtOffset:(CGFloat)offset {
    if (offset < 0.0) return 1.0;
    if (offset > SOME_THRESHOLD) return 0.0;
    return 1.0 - (offset / SOME_THRESHOLD);
}