老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

iOS中怎么實現導航欄控制

這篇文章將為大家詳細講解有關iOS中怎么實現導航欄控制,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

在達坂城等地區,都構建了全面的區域性戰略布局,加強發展的系統性、市場前瞻性、產品創新能力,以專注、極致的服務理念,為客戶提供網站制作、做網站 網站設計制作按需網站制作,公司網站建設,企業網站建設,品牌網站制作,成都全網營銷,外貿營銷網站建設,達坂城網站建設費用合理。

1.導航欄的顯示與隱藏

導航欄的顯示與隱藏,分兩種情況:

1.從不顯示導航欄的頁面push到顯示導航欄的頁面。

2.從顯示導航欄的頁面Push到不顯示導航欄的頁面。

注意:

1.如果導航欄不顯示時,系統的側滑返回功能無效。

2.雖然側滑返回功能無效,但是導航欄的 .interactivePopGestureRecognizer.delegate還是存在的。

針對以上兩種情況分別處理,整個Push過程都假設是從A頁面跳轉到B頁面

1.1 從不顯示導航欄的頁面Push到顯示導航欄的頁面。

關于導航欄的顯示,是否順滑,是通過如下兩個方法來控制。

// 不顯示動畫,導航欄顯示就比較突兀
[self.navigationController setNavigationBarHidden:YES];

// 顯示動畫,在側滑時,導航欄顯示就比較順滑
[self.navigationController setNavigationBarHidden:YES animated:YES];

所以,做法是:

A頁面:

- (void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];
 
 [self.navigationController setNavigationBarHidden:YES animated:YES];
}

B頁面:

- (void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];
 
 [self.navigationController setNavigationBarHidden:NO animated:YES];
}

1.2 從顯示導航欄的頁面跳轉到不顯示導航欄的頁面

這種情況的做法如下:

A頁面:

- (void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];
 [self.navigationController setNavigationBarHidden:NO animated:YES];
}

B頁面:

// 在頁面將要出現時,記錄原始側滑手勢代理對象,并將手勢代理設置為當前頁面
- (void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];
 
 self.interactivePopDelegate = self.navigationController.interactivePopGestureRecognizer.delegate;
 self.navigationController.interactivePopGestureRecognizer.delegate = self;
 
 [self.navigationController setNavigationBarHidden:YES animated:YES];
}

// 在頁面消失時,還原側滑手勢代理對象
- (void)viewDidDisappear:(BOOL)animated
{
 [super viewDidDisappear:animated];
 
 self.navigationController.interactivePopGestureRecognizer.delegate = self.interactivePopDelegate;
 self.interactivePopDelegate = nil;
}

// 實現手勢代理,為了防止影響其他手勢,可以判斷一下手勢類型
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
 if ([gestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
 return YES;
 }
 ...... 其他手勢的處理
 
 
 return NO;
}

2.統一重寫導航欄返回按鈕

有時候,我們可能需要統一工程中的返回按鈕樣式,比如都是 箭頭+返回 或者都是 箭頭。

方案有兩種:

1.創建一個BaseViewController,然后統一設置navigationItem.leftBarButtonItem

2.重寫導航控制器的Push方法,在push之前,設置navigationItem.backBarButtonItem

注意:

如果重寫了導航欄的leftBarButtonItem,那么側滑返回功能也就失效了,需要側滑返回功能需要自己處理。

第一種方案比較簡單就不做贅述了,第二種方案是這樣的:

自定義導航控制器,然后重寫如下方法:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
 UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
 viewController.navigationItem.backBarButtonItem = backItem;
 
 [super pushViewController:viewController animated:animated];
}

如果不需要返回這兩個字,只需要這樣寫就好。

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
 UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:nil style:UIBarButtonItemStyleDone target:nil action:nil];
 viewController.navigationItem.backBarButtonItem = backItem;
 
 [super pushViewController:viewController animated:animated];
}

3.監聽返回按鈕的點擊事件

在有些場景,我們需要監聽返回按鈕的事件。比如,當頁面用戶輸入了一些內容后,用戶要點擊返回,想要回到上一個頁面時,提醒用戶是否要緩存已經輸入的內容。

如果我們重寫了導航欄的返回按鈕,那么處理這種情況就很Easy,不做贅述了。

但是,如果我們沒有重寫過系統的返回按鈕,想要處理這種情況就比較麻煩,但是也是可以處理的。

處理步驟如下:

1.首先創建一個UIViewController的類別,頭文件(.h)的內容如下:

@protocol BackItemProtocol 

- (BOOL)navigationShouldPopWhenBackButtonClick;

@end

@interface UIViewController (BackItem)

@end

@interface UINavigationController (BackItem)

@end

包含一個協議、UIViewController的類別、UINavigationController的類別。

然后,實現文件(.m)如下:

#import "UIViewController+BackItem.h"

@implementation UIViewController (BackItem)

- (BOOL)navigationShouldPopWhenBackButtonClick
{
 return YES;
}

@end


@implementation UINavigationController (BackItem)

// 這個其實是導航欄的協議方法,在這里重寫了
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
 if([self.viewControllers count] < [navigationBar.items count]) {
 return YES;
 }
 
 BOOL shouldPop = YES;
 UIViewController *vc = [self topViewController];
 if([vc respondsToSelector:@selector(navigationShouldPopWhenBackButtonClick)]) {
 shouldPop = [vc navigationShouldPopWhenBackButtonClick];
 }
 
 if (shouldPop) {
 dispatch_async(dispatch_get_main_queue(), ^{
 [self popViewControllerAnimated:YES];
 });
 } else {
 for(UIView *subview in [navigationBar subviews]) {
 if(subview.alpha < 1) {
 [UIView animateWithDuration:.25 animations:^{
  subview.alpha = 1;
 }];
 }
 }
 }
 return NO;
}

@end

默認是,不需要處理返回按鈕的事件,直接使用系統的pop方法。

但是,如果我們需要在用戶點擊返回按鈕時,彈窗提示,那就需要導入這個類別。

然后,重寫一個方法:

- (BOOL)navigationShouldPopWhenBackButtonClick
{
 BOOL isFlag = 輸入框不為空等等條件
 if (isFlag) {
 UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:nil message:@"是否保存修改" preferredStyle:UIAlertControllerStyleAlert];
 UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
 // 這里延時執行是因為UIAlertController阻塞UI,可能會導致動畫的不流暢
 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
 [self.navigationController popViewControllerAnimated:YES];
 });
 }];
 UIAlertAction *saveAction = [UIAlertAction actionWithTitle:@"保存" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 // 這里延時執行是因為UIAlertController阻塞UI,可能會導致動畫的不流暢
 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
 [self rightClick];
 });
 }];
 [alertVC addAction:cancelAction];
 [alertVC addAction:saveAction];
 [self presentViewController:alertVC animated:YES completion:nil];
 return NO;
 }
 
 return YES;
}

4.導航控制器的頁面跳轉方式

安卓中的頁面跳轉有四種方式: standard、singleTop、singleTask、singleInstance。

例如singleTask,在做IM類App,跳轉到聊天室的場景,就非常有用,可以保證控制器棧中只有一個聊天室,避免返回時層級太深。

iOS端如果要仿這個效果的話,可以利用導航控制器的API:

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated

首先,為UINavigationController 創建一個類別。

比如:

UINavigationController+HLPushAndPop.h
UINavigationController+HLPushAndPop.m

然后,新增幾個方法:

拿兩個方法來舉例

- (void)hl_pushSingleViewController:(UIViewController *)viewController
  animated:(BOOL)animated;

- (void)hl_pushSingleViewController:(UIViewController *)viewController
  parentClass:(Class)parentClass
  animated:(BOOL)animated;

再然后,實現方法:

實現步驟:

  1. 創建新的數組復制導航控制器原來的堆棧中的控制器。

  2. 在原始堆棧數組中判斷是否存在該類型的控制器,如果存在記錄其索引。

  3. 在復制的數組中將索引及上方所有控制器移除。

  4. 把將要push出來的控制器添加到復制的數組中。

  5. 將新的控制器數組設置為導航控制器的棧數組,根據參數判斷是否要顯示動畫。

我這邊做了一些發散,因為一些類可能會有很多子類,那么想要保證父類以及子類的實例都只有一個,所以將方法做了改進。

- (void)hl_pushSingleViewController:(UIViewController *)viewController
  animated:(BOOL)animated
{
 [self hl_pushSingleViewController:viewController parentClass:viewController.class animated:animated];
}

- (void)hl_pushSingleViewController:(UIViewController *)viewController
  parentClass:(Class)parentClass
  animated:(BOOL)animated
{
 if (!viewController) {
 return;
 }
 // 如果要push的界面不是 parentClass以及其子類的實例,則按照方法1處理
 if (![viewController isKindOfClass:parentClass]) {
 [self hl_pushSingleViewController:viewController animated:animated];
 return;
 }
 
 // 判斷 導航控制器堆棧中是否有parentClass以及其子類的實例
 NSArray *childViewControllers = self.childViewControllers;
 NSMutableArray *newChildVCs = [[NSMutableArray alloc] initWithArray:childViewControllers];
 BOOL isExit = NO;
 NSInteger index = 0;
 for (int i = 0; i < childViewControllers.count; i++) {
 UIViewController *vc = childViewControllers[i];
 if ([vc isKindOfClass:parentClass]) {
 isExit = YES;
 index = i;
 break;
 }
 }
 
 // 如果不存在,則直接push
 if (!isExit) {
 [self pushViewController:viewController animated:animated];
 return;
 }
 
 // 如果存在,則將該實例及上面的所有界面全部彈出棧,然后將要push的界面放到棧頂。
 for (NSInteger i = childViewControllers.count - 1; i >= index; i--) {
 [newChildVCs removeObjectAtIndex:i];
 }
 
 [newChildVCs addObject:viewController];
 viewController.hidesBottomBarWhenPushed = (newChildVCs.count > 1);
 [self setViewControllers:newChildVCs animated:animated];
}

關于iOS中怎么實現導航欄控制就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


文章題目:iOS中怎么實現導航欄控制
本文網址:http://www.xueling.net.cn/article/jhccps.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 国产成人无码aa片免费看 | 丰满人妻一区二区三区视频53 | 日韩一区二区三区免费 | 久久久综合免费视频 | www.春色 | 国内精品九九久久久精品 | 男人午夜视频 | 成人91视频 | 午夜福利看757 | 男女后进式猛烈XX00免费视频 | av中文字幕在线播放 | 亚洲av网站 | 成年人精品视频 | 免费国产a国产片高清不卡 欧美激欧美啪啪片 | 精品国产一区二区AV麻豆不卡 | 天堂网中文字幕在线观看 | 国产亚av手机在线观看 | 久久久久亚洲AV无码网站 | 久久国内精品视频 | 国产精品国产三级国产午 | 国产精品影视在线观看 | 亚洲国产一区二区av | 亚洲第一福利网站在线 | 美女视频黄网站免费观看 | 国产精品三级久久久久三级 | 卫生间被教官做好爽HH视频 | 精品国产18久久久久久白浆软件 | 久久成人18免费网站 | 亚洲午夜无码毛片av久久久久久 | 插插插精品亚洲一区 | 亚洲AV日韩AV一区谷露 | 成年人视频免费在线播放 | 国产二区精品 | 一本大道久久东京热无码av | 久久伊甸园 | 成人A片产无码免费奶头 | www久久久久久久 | 黄飞鸿对黄飞鸿 | 亚洲成色网 | 麻豆一区二区三区在线观看 | 亚洲在线视频一区 |