1. 程式人生 > >導航條變透明,並隨著螢幕上劃漸漸變非透明

導航條變透明,並隨著螢幕上劃漸漸變非透明

有時候APP為追求一種視覺效果上的通透性,除返回按鈕,會將導航條透明化,如圖所示:

我現在用到的辦法,將導航條的背景圖設定一張透明的圖,然後去掉導航條下方黑線的方法是從網上找的

// 是否改為透明
@property (assign, nonatomic) BOOL changeTransparency;
// 向上滾動的距離
@property (nonatomic, assign) CGFloat distance;
// 導航條透明度
@property (nonatomic, assign) double navAlpha;

- (void)viewDidLoad {
    [super viewDidLoad];
   
    navBarHairlineImageView = [self findHairlineImageViewUnder:self.navigationController.navigationBar];
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:YES];
    
    if (!(self.navAlpha == 0)) { //進入其他頁面前,透明度不為0,再回來需要判斷,要不然導航條透明度與之前不一致
        // 導航條顯示“關於某某”
       self.titleLabel.text = [@"關於" stringByAppendingString:self.userName];
      
// 去掉導航欄透明化後 導航欄底部顯現的黑線
- (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
    if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
        return (UIImageView *)view;
    }
    for (UIView *subview in view.subviews) {
        UIImageView *imageView = [self findHairlineImageViewUnder:subview];
        if (imageView) {
            return imageView;
        }
    }
    return nil;
}
self.navigationController.navigationBar.alpha = self.navAlpha;
    } else {
        self.titleLabel.text = @"";
    }
    if (self.distance <= 0) {// 導航欄為透明狀態時,進入其他頁面再返回,若不做處理,返回按鈕會消失
        navBarHairlineImageView.hidden = YES;
        self.changeTransparency = YES;
        [self changeNavigationBarTransparencyWithDefaultValue:self.changeTransparency];
    } else {
        self.titleLabel.text = [@"關於" stringByAppendingString:self.userName];
    }
    
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
// 不論該頁面的導航條透明度是多少,離開此頁面一律為1,不可影響其他頁面
    self.navigationController.navigationBar.alpha = 1;
    [self changeNavigationBarTransparencyWithDefaultValue:self.changeTransparency];
}

- (void)changeNavigationBarTransparencyWithDefaultValue:(BOOL)defaultValue{
    if (self.changeTransparency) {
        UIImage *image = [LTUtils LTImageNamed:@"bk_clear"];
        [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsCompact];
        self.changeTransparency = NO;
    }else {
        [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsCompact];
    }
}
至於隨著螢幕上劃漸漸變非透明,利用offsetY就好
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat offsetY = self.sendTopicsTableView.contentOffset.y;
    self.distance = offsetY - personHeader_height;
    if (self.distance >= 0) {
        self.titleLabel.text = [@"關於" stringByAppendingString:self.userName];
        self.titleLabel.font = navItem_Font;
        [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsCompact];
        self.navAlpha = self.distance / 64.0;
        self.navigationController.navigationBar.alpha = self.distance <= 64 ? self.navAlpha : 1;
    } else {
        self.titleLabel.text = @"";
        UIImage *image = [LTUtils LTImageNamed:@"bk_clear"];
        self.navigationController.navigationBar.alpha = 1;
        [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsCompact];
        self.changeTransparency = NO;
    }
}
還有些問題總結,基本都寫在程式碼片上了,有必要時再總結。

至此,小馬述一家之言。