IQKeyboardManager使用导致UINavigationController导航控制器移位异常

来源:互联网 发布:2017淘宝购物节 编辑:程序博客网 时间:2024/05/17 17:55

IQKeyboardManager组件的使用方便了多个编辑控件的切换。但在使用中,也有个问题,那就是会导致UINavigationController移

位,而后通过设置"self.view = [[UIScrollView alloc] initWithFrame:self.view.bounds];"可以解决该问题。但不知道从哪个版本开始

(反正现在我是用最新的4.0.8版本),这种设置解决方法也行不通了,依然会导致UINavigationController的移位。

使用效果图(UINavigationController移位)


为了解决这个问题,可以有两套方案

方案1 使用原来的低版本。如3.2.0.3

(1)修改IQKeyboardManager的版本号

platform :ios, '8.0'target:DemoIQKeyboard do#pod 'IQKeyboardManager', '~> 4.0.8'pod 'IQKeyboardManager', '~> 3.2.0.3'end
(2)设置有编辑控制页面的类型为UIScrollView

- (void)loadView{    [super loadView];    self.view = [[UIScrollView alloc] initWithFrame:self.view.bounds];}
方案1使用低版本虽然不能使用到新版本的相关特性,但对于修正UINavigationController移位还是挺好的。

使用效果图(方案1修正后)


方案2 继续使用最新版本,同时修改源码

(1)有编辑的页面,设置其该页面为UIScrollView类型。如视图控制器的view

- (void)loadView{    [super loadView];    self.view = [[UIScrollView alloc] initWithFrame:self.view.bounds];}

(2)修改IQKeyboardManager中IQUIWindow+Hierarchy.m文件中的方法"- (UIViewController*)topMostController"

- (UIViewController*)topMostController{    // 原代码//    UIViewController *topController = [self rootViewController];//    //    //  Getting topMost ViewController//    while ([topController presentedViewController])topController = [topController presentedViewController];////    //  Returning topMost ViewController//    return topController;        // 修改后代码    UIViewController *topController = [self rootViewController];    if ([topController isKindOfClass:[UITabBarController class]])    {        UITabBarController *tabbarController = (UITabBarController *)topController;        topController = tabbarController.selectedViewController;        if ([topController isKindOfClass:[UINavigationController class]])        {            UINavigationController *navController = (UINavigationController *)topController;            topController = navController.visibleViewController;        }    }    //  Getting topMost ViewController    while ([topController presentedViewController])    {        topController = [topController presentedViewController];    }        //  Returning topMost ViewController    return topController;}

方案2虽然修正了UINavigationController不会移位,但是还有一个小缺陷,即首次进入编辑状态的编辑控件,且该控件被键盘遮挡时不会立马响应显示在键盘之上,而是需要通过点击键盘上的切换按钮后才会显示在键盘之上。

使用效果图(方案2修正后)



0 0
原创粉丝点击