導航條變透明,並隨著螢幕上劃漸漸變非透明
阿新 • • 發佈:2019-01-26
有時候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];
至於隨著螢幕上劃漸漸變非透明,利用offsetY就好// 去掉導航欄透明化後 導航欄底部顯現的黑線 - (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]; } }
還有些問題總結,基本都寫在程式碼片上了,有必要時再總結。- (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; } }
至此,小馬述一家之言。