最近需要给APP添加手势左滑返回功能,使用了框架FDFullscreenPopGesture,把使用过程中遇到的坑以及解决方法记录下
2018-05-03 更新------
当使用相机进行拍摄的时候,页面的上方看不见了,闪光灯功能使用不了,所以添加了如下判断:
// 设置导航的显示/隐藏
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 ([self.navigationController isKindOfClass:[UIImagePickerController class]]
) {
UIImagePickerController *imagePickVC = (UIImagePickerController *)self.navigationController;
// 不是相机才进行处理
if (imagePickVC.sourceType != UIImagePickerControllerSourceTypeCamera) {
[self _handleVCNavigationBarHidden:vc];
}
} else {
// 不是相机才进行处理
[self _handleVCNavigationBarHidden:vc];
}
});
- (void)_handleVCNavigationBarHidden:(UIViewController *)vc {
[self.navigationController setNavigationBarHidden:vc.fd_prefersNavigationBarHidden animated:NO];
}
一、UIWebView无法左滑返回
原因:UIWebView默认是不开启左滑手势返回功能的,需要自己开启;
解决:在viewDidLoad
方法里面设置属性fd_interactivePopDisabled
为NO
;
- (void)viewDidLoad
{
[super viewDidLoad];
self.fd_interactivePopDisabled = NO;
}
二、UIWebView左滑返回没有成功时或者取消返回时导航栏的title文字为空,不见了
原因:在viewWillDisappear:
方法里面UIWebView
控件被销毁了;
ScanWebView = nil;
解决:
方法一: 最直接有效
在viewWillDisappear:
方法里面取消UIWebView
控件的销毁;即把这行代码注释掉;ScanWebView = nil;//注释掉
方法二: 比较复杂
在webViewDidFinishLoad:
方法里面用一个变量保存获取的title文字,在viewWillAppear:
方法里面设置导航栏的title文字;
1、保存title文字的变量
@property (nonatomic, copy) NSString *titleString; //保存title文字的变量
2、设置导航栏的title文字
- (void)viewWillAppear:(BOOL)animated{ //设置导航栏的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;
}
三、左滑返回没有成功或者取消时,会出现 ... 的情况
原因:导航控制器的导航栏默认是有一个返回按钮的;设置属性hidesBackButton
为YES
就会出现这种情况;
解决:设置属性hidesBackButton
为NO
,或者直接注释掉这行代码,不进行设置;
self.navigationItem.hidesBackButton = NO;
四、从无NavigationBar到有NavigationBar,手势返回的时候,有NavigationBar的控制器导航栏会变成白色,或者消失不见了;
原因:在滑动的时候显示出错
解决:
在viewWillAppear:
和viewWillDisappear:
方法里面添加对是否隐藏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];
}
});
五、调用系统的发送短信控制器MFMessageComposeViewController
时(如使用shareSDK进行短信分享时),右上角没有“取消按钮”,无法返回app
原因:好像被挡住了
解决:添加对控制器是否是MFMessageComposeViewController
的判断,是的话添加自己添加一个取消按钮并添加方法的实现,
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
基础上修改后的代码: