中级篇第六期:若隐若现的NavigationBar


我们就要如下图的效果哦,就是让NavigationBar随着滑动而出现与隐藏,就是那种若隐若现的感觉,感觉棒棒哒,哈哈


wKiom1UzbcLixAbBAAC7hebVI0Q033.jpg

wKioL1Uzbxvj3ZVHAADbSn9FIHM741.jpg

wKiom1UzbcKiDq8uAAEa0JSLtdE094.jpg




废话不多说咯,上代码咯


首先呢,我们要创建TableView还要给它指定一个HeaderView,然后再开始我们接下来的事情


 
    UIView *backGroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(tableView.frame), 80)];
    backGroundView.backgroundColor = [UIColor redColor];
    tableView.tableHeaderView = backGroundView;


那这种效果实现的前提,肯定是在ScrollViewDelegate里面实现咯,那就完善这个方法吧


 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    UIColor *color = [UIColor blueColor];
    CGFloat offsetY = scrollView.contentOffset.y;
    if (offsetY > 0) {
        
    } else {
        
    }
}


那么我们先来看看系统的NavigationBar是什么情况,如果细心一点的话,你会发现系统的NavigationBar上面覆盖着一层View,没错,就是它咯,但是我们从API里面取不到,只能够重新帮它写一个好啦,行,那就走一个Category好了


 
@interface UINavigationBar (BackgroundColor)

@property (nonatomic, strong) UIView *overlayView;

- (void)categorySetBackgroundColor:(UIColor *)color;

@end


那么我们要为Category添加一个属性的呢,很可惜,Category是不允许有属性的,所以我们只好利用runTime来做这件事情咯,那就是动态绑定一个属性,让这个属性给Category,这里我们利用了runTime的绑定方法,而不是Category的属性哦


static const void *OverlayViewKey = &OverlayViewKey; 
 
- (UIView *)overlayView {
    return objc_getAssociatedObject(self, &OverlayViewKey);
}

- (void)setOverlayView:(UIView *)overlayView {
    objc_setAssociatedObject(self, OverlayViewKey, overlayView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}


接下来呢,我们就要把这个View插进NavigationBar里面了哦,看代码


 
- (void)categorySetBackgroundColor:(UIColor *)color {
    if (!self.overlayView) {
        [self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
        [self setShadowImage:[UIImage new]];
        self.overlayView = [[UIView alloc] initWithFrame:CGRectMake(0, -20, [UIScreen mainScreen].bounds.size.width, 64)];
        [self insertSubview:self.overlayView atIndex:0];
    }
    [self.overlayView setBackgroundColor:color];
}


然后我们再回到ScrollViewDelegate里面,来重新写这里的逻辑


 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    UIColor *color = [UIColor blueColor];
    CGFloat offsetY = scrollView.contentOffset.y;
    if (offsetY > 0) {
        CGFloat alpha = 1 - ((108 - offsetY) / 108);
        [self.navigationController.navigationBar categorySetBackgroundColor:[color colorWithAlphaComponent:alpha]];
    } else {
        [self.navigationController.navigationBar setBackgroundColor:[color colorWithAlphaComponent:0]];
    }
}


OK,就这样了哦,是不是效果很美呢



这是网上一个小伙伴写的哦,只不过他提供出来的代码比较粗糙,小弟做了下整理,希望可以帮到那些需要的人呢,好啦,这期就到这里了哦



有问题的话来群里找我哦,或者留言都OK的





你可能感兴趣的:(ios,NavigationBar)