最近需要給APP添加手勢(shì)左滑返回功能,使用了框架FDFullscreenPopGesture,把使用過程中遇到的坑以及解決方法記錄下
2018-05-03 更新------
當(dāng)使用相機(jī)進(jìn)行拍攝的時(shí)候,頁(yè)面的上方看不見了,閃光燈功能使用不了,所以添加了如下判斷:
// 設(shè)置導(dǎo)航的顯示/隱藏
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(CGFLOAT_MIN * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UIViewController *vc = [self.navigationController.viewControllers lastObject];
// 添加對(duì)相機(jī)拍攝的過濾
if ([self.navigationController isKindOfClass:[UIImagePickerController class]]
) {
UIImagePickerController *imagePickVC = (UIImagePickerController *)self.navigationController;
// 不是相機(jī)才進(jìn)行處理
if (imagePickVC.sourceType != UIImagePickerControllerSourceTypeCamera) {
[self _handleVCNavigationBarHidden:vc];
}
} else {
// 不是相機(jī)才進(jìn)行處理
[self _handleVCNavigationBarHidden:vc];
}
});
- (void)_handleVCNavigationBarHidden:(UIViewController *)vc {
[self.navigationController setNavigationBarHidden:vc.fd_prefersNavigationBarHidden animated:NO];
}
一、UIWebView無法左滑返回
原因:UIWebView默認(rèn)是不開啟左滑手勢(shì)返回功能的,需要自己開啟;
解決:在viewDidLoad方法里面設(shè)置屬性fd_interactivePopDisabled為NO;
- (void)viewDidLoad
{
[super viewDidLoad];
self.fd_interactivePopDisabled = NO;
}
二、UIWebView左滑返回沒有成功時(shí)或者取消返回時(shí)導(dǎo)航欄的title文字為空,不見了
原因:在viewWillDisappear:方法里面UIWebView控件被銷毀了;
ScanWebView = nil;
解決:
方法一: 最直接有效
在viewWillDisappear:方法里面取消UIWebView控件的銷毀;即把這行代碼注釋掉;ScanWebView = nil;//注釋掉
方法二: 比較復(fù)雜
在webViewDidFinishLoad:方法里面用一個(gè)變量保存獲取的title文字,在viewWillAppear:方法里面設(shè)置導(dǎo)航欄的title文字;
1、保存title文字的變量
@property (nonatomic, copy) NSString *titleString; //保存title文字的變量
2、設(shè)置導(dǎo)航欄的title文字
- (void)viewWillAppear:(BOOL)animated{ //設(shè)置導(dǎo)航欄的title文字
[super viewWillAppear:animated];
self.titleLabel.text = self.titleString;
}
3、用變量保存獲取到的title文字
- (void)webViewDidFinishLoad:(UIWebView *)webView{ //用變量保存獲取到的title文字
NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
self.titleString = title;
}
三、左滑返回沒有成功或者取消時(shí),會(huì)出現(xiàn) ... 的情況
原因:導(dǎo)航控制器的導(dǎo)航欄默認(rèn)是有一個(gè)返回按鈕的;設(shè)置屬性hidesBackButton為YES就會(huì)出現(xiàn)這種情況;
解決:設(shè)置屬性hidesBackButton為NO,或者直接注釋掉這行代碼,不進(jìn)行設(shè)置;
self.navigationItem.hidesBackButton = NO;
四、從無NavigationBar到有NavigationBar,手勢(shì)返回的時(shí)候,有NavigationBar的控制器導(dǎo)航欄會(huì)變成白色,或者消失不見了;
原因:在滑動(dòng)的時(shí)候顯示出錯(cuò)
解決:
在viewWillAppear:和viewWillDisappear:方法里面添加對(duì)是否隱藏NavigationBar的判斷;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(CGFLOAT_MIN * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UIViewController *vc = [self.navigationController.viewControllers lastObject];
if (vc.fd_prefersNavigationBarHidden) {
[self.navigationController setNavigationBarHidden:YES animated:NO];
} else {
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
});
五、調(diào)用系統(tǒng)的發(fā)送短信控制器MFMessageComposeViewController時(shí)(如使用shareSDK進(jìn)行短信分享時(shí)),右上角沒有“取消按鈕”,無法返回app
原因:好像被擋住了
解決:添加對(duì)控制器是否是MFMessageComposeViewController的判斷,是的話添加自己添加一個(gè)取消按鈕并添加方法的實(shí)現(xiàn),
if ([self isKindOfClass:[MFMessageComposeViewController class]]) {
[self fd_pushViewController:viewController animated:animated];
[[self.viewControllers lastObject] navigationItem].rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(dismissModal:)];
return;
}
- (void)dismissModal:(UIButton *)sender{
[[self.viewControllers lastObject] dismissViewControllerAnimated:YES completion:nil];
}
以上為使用過程遇到的坑以及解決辦法,很多也都是從GitHub搜集而來的,建議多到GitHub去看看;
附上FDFullscreenPopGesture的GitHub鏈接;
最后貼上在FDFullscreenPopGesture基礎(chǔ)上修改后的代碼: