亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現導航欄透明示例代碼

2020-07-26 02:52:06
字體:
來源:轉載
供稿:網友

在最近一個項目中碰到這樣一個場景,在被push進來的一個頁面設置導航欄透明,且要求控制對tableview組的頭視圖進行懸停顯示,nav隨著tableview偏移量改變透明度,當然這樣的需求確實不是什么難事,但是如果當前頁面繼續push一個不需要此類效果的頁面,當在返回當前頁面的時候就會出現一個坑,nav的展示很突兀,下面是直接上解決方法...ps:假設A頁面為需要設置透明,B頁面被Apush且不需要設置透明

首先在需要設置導航欄透明的頁面的viewDidload中寫上

self.title = @"Title";[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];  self.navigationController.navigationBar.shadowImage = [UIImage new];  self.barImageView = self.navigationController.navigationBar.subviews.firstObject;  self.barImageView.alpha = 0;  //設置狀態欄  [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];  //設置標題顏色  self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor clearColor]};

在scrollViewDidScroll代理方法中

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {  CGFloat offset = scrollView.contentOffset.y;  //根據自己需要設置(136)的大小  CGFloat alpha = offset / 136;  _barImageView.alpha = alpha;  //記錄下當前的透明度,在返回當前頁面時需要  _alpha = alpha;  [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithFloat:alpha] forKey:@"_alpha"];  //設置標題的透明度  self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor colorWithWhite:0 alpha:alpha]};}

當前頁的viewWillAppear, viewDidAppear, viewWillDisappear

-(void)viewWillAppear:(BOOL)animated{  [super viewWillAppear:animated];  self.table.delegate = self;}-(void)viewDidAppear:(BOOL)animated {  BOOL isGesturePop = [[[NSUserDefaults standardUserDefaults] objectForKey:@"isGesturePop"] boolValue];  if (!isGesturePop) {    _barImageView.alpha = _alpha;    self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor colorWithWhite:0 alpha:_alpha]};  }  [super viewDidAppear:animated];}-(void)viewWillDisappear:(BOOL)animated{  [super viewWillDisappear:animated];  self.table.delegate = nil;  self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor blackColor]};  _barImageView.alpha = 1;  [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:NO] forKey:@"isGesturePop"];}

那么在我們需要push的下一個頁面需要什么操作呢,我們需要在這個頁面顯示正常的nav并且禁掉系統的手勢pop,自己寫一個pop手勢,以方便我們拿到pop滑動時的偏移量,在做的時候使用了兩個類,在最后會有源碼貼出

B.m 須遵守UIGestureRecognizerDelegate,并導入NavigationInteractiveTransition.h

全局變量

@property (nonatomic, strong) NavigationInteractiveTransition *navT;

viewDidLoad

self.navigationController.interactivePopGestureRecognizer.enabled = NO;  UIGestureRecognizer *gesture = self.navigationController.interactivePopGestureRecognizer;  gesture.enabled = NO;  UIView *gestureView = gesture.view;  UIPanGestureRecognizer *popRecognizer = [[UIPanGestureRecognizer alloc] init];  popRecognizer.delegate = self;  popRecognizer.maximumNumberOfTouches = 1;  [gestureView addGestureRecognizer:popRecognizer];  _navT = [[NavigationInteractiveTransition alloc] initWithViewController:self.navigationController];  [popRecognizer addTarget:_navT action:@selector(handleControllerPop:)];

UIGestureRecognizerDelegate 代理方法gestureRecognizerShouldBegin

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {  //記錄當前是是否是通過手勢滑動回去  [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"isGesturePop"];  /**   * 這里有兩個條件不允許手勢執行,1、當前控制器為根控制器;2、如果這個push、pop動畫正在執行(私有屬性)   */  return self.navigationController.viewControllers.count != 1 && ![[self.navigationController valueForKey:@"_isTransitioning"] boolValue];}

需要依賴的兩個類源碼

NavigationInteractiveTransition.h

#import <UIKit/UIKit.h>@class UIViewController, UIPercentDrivenInteractiveTransition;@interface NavigationInteractiveTransition : NSObject <UINavigationControllerDelegate>- (instancetype)initWithViewController:(UIViewController *)vc;- (void)handleControllerPop:(UIPanGestureRecognizer *)recognizer;- (UIPercentDrivenInteractiveTransition *)interactivePopTransition;@end

NavigationInteractiveTransition.m

#import "NavigationInteractiveTransition.h"#import "PopAnimation.h"@interface NavigationInteractiveTransition ()@property (nonatomic, weak) UINavigationController *vc;@property (nonatomic, strong) UIPercentDrivenInteractiveTransition *interactivePopTransition;@property(nonatomic, strong) UIImageView *barImageView;@end@implementation NavigationInteractiveTransition- (instancetype)initWithViewController:(UIViewController *)vc{  self = [super init];  if (self) {    self.vc = (UINavigationController *)vc;    self.vc.delegate = self;  }  return self;}/** * 我們把用戶的每次Pan手勢操作作為一次pop動畫的執行 */- (void)handleControllerPop:(UIPanGestureRecognizer *)recognizer {  /**   * interactivePopTransition就是我們說的方法2返回的對象,我們需要更新它的進度來控制Pop動畫的流程,我們用手指在視圖中的位置與視圖寬度比例作為它的進度。   */  CGFloat progress = [recognizer translationInView:recognizer.view].x / recognizer.view.bounds.size.width;  [self.vc.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];  self.vc.navigationBar.shadowImage = [UIImage new];  self.barImageView = self.vc.navigationBar.subviews.firstObject;  CGFloat alpha = [[[NSUserDefaults standardUserDefaults] objectForKey:@"_alpha"] floatValue];  self.barImageView.alpha = 1 - progress > alpha ? alpha : 1 - progress;//  NSLog(@"===progress==%.2f",progress);  /**   * 穩定進度區間,讓它在0.0(未完成)~1.0(已完成)之間   */  progress = MIN(1.0, MAX(0.0, progress));  if (recognizer.state == UIGestureRecognizerStateBegan) {    /**     * 手勢開始,新建一個監控對象     */    self.interactivePopTransition = [[UIPercentDrivenInteractiveTransition alloc] init];    /**     * 告訴控制器開始執行pop的動畫     */    [self.vc popViewControllerAnimated:YES];  }  else if (recognizer.state == UIGestureRecognizerStateChanged) {    /**     * 更新手勢的完成進度     */    [self.interactivePopTransition updateInteractiveTransition:progress];  }  else if (recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateCancelled) {    /**     * 手勢結束時如果進度大于一半,那么就完成pop操作,否則重新來過。     */    if (progress > 0.5) {      [self.interactivePopTransition finishInteractiveTransition];      self.barImageView.alpha = 0;;    }    else {      [self.interactivePopTransition cancelInteractiveTransition];    }    self.interactivePopTransition = nil;  }}- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController                 animationControllerForOperation:(UINavigationControllerOperation)operation                        fromViewController:(UIViewController *)fromVC                         toViewController:(UIViewController *)toVC {  /**   * 方法1中判斷如果當前執行的是Pop操作,就返回我們自定義的Pop動畫對象。   */  if (operation == UINavigationControllerOperationPop)    return [[PopAnimation alloc] init];  return nil;}- (id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController             interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController {  /**   * 方法2會傳給你當前的動畫對象animationController,判斷如果是我們自定義的Pop動畫對象,那么就返回interactivePopTransition來監控動畫完成度。   */  if ([animationController isKindOfClass:[PopAnimation class]])    return self.interactivePopTransition;  return nil;}@end

PopAnimation.h

#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>@interface PopAnimation : NSObject <UIViewControllerAnimatedTransitioning>@end

PopAnimation.m

#import "PopAnimation.h"@interface PopAnimation ()@property (nonatomic, strong) id <UIViewControllerContextTransitioning> transitionContext;@end@implementation PopAnimation- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext {  //這個方法返回動畫執行的時間  return 0.25;}/** * transitionContext你可以看作是一個工具,用來獲取一系列動畫執行相關的對象,并且通知系統動畫是否完成等功能。 */- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {  /**   * 獲取動畫來自的那個控制器   */  UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];  /**   * 獲取轉場到的那個控制器   */  UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];  /**   * 轉場動畫是兩個控制器視圖時間的動畫,需要一個containerView來作為一個“舞臺”,讓動畫執行。   */  UIView *containerView = [transitionContext containerView];  [containerView insertSubview:toViewController.view belowSubview:fromViewController.view];  NSTimeInterval duration = [self transitionDuration:transitionContext];  /**   * 執行動畫,我們讓fromVC的視圖移動到屏幕最右側   */  [UIView animateWithDuration:duration animations:^{    fromViewController.view.transform = CGAffineTransformMakeTranslation([UIScreen mainScreen].bounds.size.width, 0);  }completion:^(BOOL finished) {    /**     * 當你的動畫執行完成,這個方法必須要調用,否則系統會認為你的其余任何操作都在動畫執行過程中。     */    [transitionContext completeTransition:!transitionContext.transitionWasCancelled];  }];}- (void)animationDidStop:(CATransition *)anim finished:(BOOL)flag {  [_transitionContext completeTransition:!_transitionContext.transitionWasCancelled];}@end

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一页自拍| 欧美尤物巨大精品爽| 亚洲免费影视第一页| 亚洲欧美国内爽妇网| 欧美日韩成人在线观看| 91po在线观看91精品国产性色| 久久综合国产精品台湾中文娱乐网| 亚洲精品一区二区三区婷婷月| 日韩亚洲成人av在线| 国产精品成人观看视频国产奇米| 久久影院模特热| 日韩毛片在线观看| 欧美激情小视频| 57pao国产精品一区| 国产精品入口日韩视频大尺度| 日韩高清电影好看的电视剧电影| 91在线观看免费高清完整版在线观看| 欧美成人第一页| 国产z一区二区三区| 亚洲成年人在线| 精品成人在线视频| www.欧美免费| 亚洲精品av在线| 欧美xxxx做受欧美.88| 九九九久久久久久| 国产精品自拍小视频| 亚洲欧美日韩国产精品| 欧美性xxxxhd| 狠狠色香婷婷久久亚洲精品| 97香蕉久久夜色精品国产| 精品动漫一区二区三区| 久久久久久av| 国产精品久久久久久av| 欧美专区在线视频| 国产精品丝袜高跟| 欧美日韩国产在线播放| 亚洲综合日韩中文字幕v在线| 韩国精品久久久999| 欧美亚洲国产日本| 精品视频在线播放色网色视频| 欧美激情免费观看| 亚洲aⅴ日韩av电影在线观看| 国产精品黄页免费高清在线观看| 国产精品99蜜臀久久不卡二区| 国产精品第一第二| 91地址最新发布| 成人黄色大片在线免费观看| 欧美一级电影免费在线观看| 精品爽片免费看久久| 欧美日韩中文字幕综合视频| 一区二区三区黄色| 欧美有码在线观看视频| 亚洲成人av在线播放| 欧美性猛交xxxx乱大交蜜桃| 精品国偷自产在线| 高跟丝袜一区二区三区| 亚洲成人网久久久| 亚洲少妇中文在线| 亚洲国产中文字幕久久网| 91精品国产免费久久久久久| 51精品国产黑色丝袜高跟鞋| 欧美电影在线观看高清| 亚洲欧美日韩在线高清直播| 中文字幕精品www乱入免费视频| 日本欧美国产在线| 成人高h视频在线| 日韩av中文字幕在线免费观看| 国产欧美一区二区三区久久| 在线看欧美日韩| 国产精品老女人精品视频| 亚洲自拍偷拍在线| 国产日韩亚洲欧美| 亚洲精品国产精品国自产观看浪潮| 在线电影欧美日韩一区二区私密| 日韩精品在线视频观看| 在线观看视频亚洲| 97精品国产aⅴ7777| 日韩视频一区在线| 欧美国产中文字幕| 精品久久久久久国产91| 综合网日日天干夜夜久久| 欧美国产极速在线| 亚洲网站在线播放| 日韩毛片在线观看| 国产精品91久久久| 色偷偷88888欧美精品久久久| 韩国国内大量揄拍精品视频| 日韩av综合中文字幕| 欧美激情xxxx性bbbb| 国产精品日韩在线观看| 国产精品自拍视频| 一二美女精品欧洲| 欧美超级免费视 在线| 亚洲精品动漫久久久久| 亚洲国产成人久久| 国产极品精品在线观看| 成人网欧美在线视频| 国产成人精品日本亚洲专区61| 久久天天躁夜夜躁狠狠躁2022| 国产深夜精品福利| 韩国v欧美v日本v亚洲| 国产精品成熟老女人| 在线播放国产一区二区三区| 日韩免费看的电影电视剧大全| 久久视频在线播放| 综合av色偷偷网| 国产精品一区二区久久国产| 欧美日韩久久久久| 性欧美在线看片a免费观看| 国产mv免费观看入口亚洲| 在线观看久久av| 亚洲激情中文字幕| 2019最新中文字幕| 日韩国产一区三区| 日韩av免费网站| 亚洲区bt下载| 国产综合在线观看视频| 69精品小视频| 国产精品久久久久久久久借妻| 国产婷婷97碰碰久久人人蜜臀| 久久久中精品2020中文| 亚洲一区999| 国产精品久久不能| 91精品91久久久久久| 一区二区亚洲欧洲国产日韩| 韩国视频理论视频久久| 91亚洲午夜在线| 欧美大成色www永久网站婷| 久久成年人免费电影| 欧美激情欧美激情| 日韩免费观看在线观看| 国产成人精品999| 亚洲第一精品夜夜躁人人爽| 国产一区二区香蕉| 精品久久在线播放| 日韩成人中文字幕在线观看| 91久久夜色精品国产网站| 久久成人精品电影| 中文字幕无线精品亚洲乱码一区| 国产精品免费观看在线| 亚洲欧美国产精品| 日本精品中文字幕| 狠狠久久五月精品中文字幕| 欧美激情一区二区三区久久久| 欧美日韩高清在线观看| 国产精品大陆在线观看| 亚洲欧美中文日韩v在线观看| 亚洲欧美日韩国产成人| 91老司机在线| 欧美视频在线观看免费| 亚洲第一在线视频| 国产一区二区日韩精品欧美精品| 在线观看久久久久久| 成人www视频在线观看| 欧美激情一二三| 欧美一级电影在线| 日韩欧美在线视频日韩欧美在线视频| www欧美日韩| 国产精品18久久久久久首页狼| 性欧美xxxx交| 日韩精品视频在线| 91高清视频在线免费观看| 午夜精品久久久久久久男人的天堂| 亚洲美女久久久|