歡迎你們關注個人公衆號,我會按期分享一些我在項目中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來
javascript
文章也會同步更新到個人博客:
ppsheep.comjava
咱們常常看到一些閱讀類的應用,上滑UIScrollView的時候 UINavigationBar就隱藏了 雖然Apple給咱們提供了隱藏NavigationBar的方法,可是有一個弊端 就是navigationbar不能隨着UIScrollView的滑動速度來隱藏,而且設置bar逐漸隱藏,今天咱們就來實現這樣一個效果git
首先看一下效果github
首先分析一下,隨着滑動隱藏NavigationBar,確定是在UIScrollView的delegate方法scrollViewDidScroll:作操做ui
在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
這幾個屬性都是UINavigationBar的屬性,若是不知道這幾個屬性 是能夠經過runtime獲得這幾個屬性的 blog
具體的實現方法參考個人另外一篇文章:
經過幾個屬性名咱們就能知道 表明什麼
而後在咱們的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)];
}複製代碼
實現起來 仍是很簡單的
源工程: