iOS UIScrollView上滑隱藏UINavigationBar

ppsheep發表於2016-10-31

歡迎大家關注我的公眾號,我會定期分享一些我在專案中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來

iOS UIScrollView上滑隱藏UINavigationBar

文章也會同步更新到我的部落格:
ppsheep.com

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

首先看一下效果

iOS UIScrollView上滑隱藏UINavigationBar
1

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

UINavigationBar Category

在UINavigationBar中


@interface UINavigationBar (PPSNavigationBar)
/**
 設定scrollview的透明度 隨著滑動  透明度改變

 @param alpha 透明度
 */
- (void)pps_setScrollViewAlpha:(CGFloat)alpha;


/**
 設定Bar偏移

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

@end複製程式碼

.m

@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複製程式碼

實現起來很簡單

在NavigationBar中

  • _leftViews
  • _rightViews
  • _titleView
  • UINavigationItemView

這幾個屬性都是UINavigationBar的屬性,如果不知道這幾個屬性 是可以通過runtime得到這幾個屬性的

具體的實現方法參考我的另一篇文章:

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…

相關文章