歡迎大家關注我的公眾號,我會定期分享一些我在專案中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來
文章也會同步更新到我的部落格:
ppsheep.com
我們經常看到一些閱讀類的應用,上滑UIScrollView的時候 UINavigationBar就隱藏了 雖然Apple給我們提供了隱藏NavigationBar的方法,但是有一個弊端 就是navigationbar不能隨著UIScrollView的滑動速度來隱藏,並且設定bar逐漸隱藏,今天我們就來實現這樣一個效果
首先看一下效果
首先分析一下,隨著滑動隱藏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得到這幾個屬性的
具體的實現方法參考我的另一篇文章:
通過幾個屬性名我們就能知道 代表什麼
然後在我們的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)];
}複製程式碼
實現起來 還是很簡單的
源工程: