iOS UIScrollView上滑隱藏UINavigationBar

歡迎你們關注個人公衆號,我會按期分享一些我在項目中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來
javascript

文章也會同步更新到個人博客:
ppsheep.comjava

咱們常常看到一些閱讀類的應用,上滑UIScrollView的時候 UINavigationBar就隱藏了 雖然Apple給咱們提供了隱藏NavigationBar的方法,可是有一個弊端 就是navigationbar不能隨着UIScrollView的滑動速度來隱藏,而且設置bar逐漸隱藏,今天咱們就來實現這樣一個效果git

首先看一下效果github

1

首先分析一下,隨着滑動隱藏NavigationBar,確定是在UIScrollView的delegate方法scrollViewDidScroll:作操做ui

UINavigationBar Category

在UINavigationBar中spa

@interface UINavigationBar (PPSNavigationBar)
/** 設置scrollview的透明度 隨着滑動 透明度改變 @param alpha 透明度 */
- (void)pps_setScrollViewAlpha:(CGFloat)alpha;


/** 設置Bar偏移 @param translationY 偏移量 */
- (void)pps_setTranslationY:(CGFloat)translationY;

@end複製代碼

.mcode

@implementation UINavigationBar (PPSNavigationBar)

-(void)pps_setTranslationY:(CGFloat)translationY{
    self.transform = CGAffineTransformMakeTranslation(0, translationY);
}

-(void)pps_setScrollViewAlpha:(CGFloat)alpha{
    [[self valueForKey:@"_leftViews"] enumerateObjectsUsingBlock:^(UIView *view, NSUInteger i, BOOL *stop) {
        view.alpha = alpha;
    }];

    [[self valueForKey:@"_rightViews"] enumerateObjectsUsingBlock:^(UIView *view, NSUInteger i, BOOL *stop) {
        view.alpha = alpha;
    }];

    UIView *titleView = [self valueForKey:@"_titleView"];
    titleView.alpha = alpha;

    [[self subviews] enumerateObjectsUsingBlock:^(UIView *obj, NSUInteger idx, BOOL *stop) {
        if ([obj isKindOfClass:NSClassFromString(@"UINavigationItemView")]) {
            obj.alpha = alpha;
            *stop = YES;
        }
    }];
}

@end複製代碼

實現起來很簡單 orm

在NavigationBar中 cdn

  • _leftViews
  • _rightViews
  • _titleView
  • UINavigationItemView

這幾個屬性都是UINavigationBar的屬性,若是不知道這幾個屬性 是能夠經過runtime獲得這幾個屬性的 blog

具體的實現方法參考個人另外一篇文章:

ppsheep.com/2016/10/31/…

經過幾個屬性名咱們就能知道 表明什麼

而後在咱們的viewcontroller中

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //這裏加上64是爲了獲得準確的scrollview的偏移量 固然你也能夠在下面的判斷中計算
    CGFloat offsetY = scrollView.contentOffset.y+64;
    if (offsetY > 0) {
        if (offsetY >= 44) {
            [self setNavigationBarTransformProgress:1];
        } else {
            [self setNavigationBarTransformProgress:(offsetY/44)];
        }
    } else {
        [self setNavigationBarTransformProgress:0];
        self.navigationController.navigationBar.backIndicatorImage = [UIImage new];
    }
}

- (void)setNavigationBarTransformProgress:(CGFloat)progress
{
    [self.navigationController.navigationBar pps_setTranslationY:(-44 * progress)];
    [self.navigationController.navigationBar pps_setScrollViewAlpha:(1-progress)];
}複製代碼

實現起來 仍是很簡單的

源工程:

github.com/yangqian111…

相關文章
相關標籤/搜索