您的位置:首页 > 移动开发 > IOS开发

有关ios自动滚动页面以显示被键盘挡住的编辑框的处理

2015-04-25 00:11 579 查看
目前手头上有一个项目,注册流程用到了很多用户信息输入,界面样式固定,时间紧急,就用的xib控件,但是这样问题就来了,控件都是固定位置的,如果键盘弹起来就把正在输入的编辑框挡住了,这样的用户体验是非常不好的,所以寻找各种解决办法,目前的比较完美的解决方案是:IQKeyboardManager + 自定义ScrollViewController

首先,把IQkeyBoardManager 这个第三方的控件放到工程中,编译通过,发现我们的界面已经可以随编辑框滚动了!但是貌似NavigationBar 一起滚动了,而且,有的时候statusBar跟navigationbar上的title 重叠了,这样的效果肯定不是我们想要的,所以去GitHub上看官版教程,叫我们把xib 的主view 改为scrollview ,就可以解决navigationbar 一起滚动的问题,ok,改完之后会发现,全乱套了,因为你的scrollview 的约束已经失效,scrollview是主view,这样的话,上面的view是依赖于scrollview的,但是scrollview 又依赖于子view,所以会有冲突。重新autolayout?太费事了。。

解决办法,真的就是加一个scrollview 到主view上去,就相当于在view上再放一层scrollview,把所有的控件放到scrollview上,这样做的话,貌似代码量增加很多,我是这样解决的,

1. 首先将xib与controller 解除自动加载xib关系,将xib中的view跟fileOwner的连线叉掉,将xib文件名后面加一个Scroll : xxxxViewControllerScroll.xib 避免 controller 自动加载xib

2. 创建BaseScrollviewController 继承于viewController,在viewDidLoad里面添加如下代码

` _mainScroll =[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH,SCREEN_HEIGHT)];

[_mainScroll setDelaysContentTouches:NO];

_contentView =[[[NSBundle mainBundle]loadNibNamed:[NSString stringWithFormat:@"%@%@",NSStringFromClass([self class]),@"Scroll"] owner:self options:nil] firstObject];
_mainScroll.contentSize = CGSizeMake(SCREEN_WIDTH, SCREEN_HEIGHT);
_contentView.frame      = CGRectMake(0, 0, SCREEN_WIDTH, _contentView.frame.size.height);
[_mainScroll addSubview:_contentView];
[self.view addSubview:_mainScroll];

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(myTap)];
[_contentView addGestureRecognizer:tap];


-(void)myTap{

[self.view endEditing:YES];

[_mainScroll scrollsToTop];

}

`

然后以后viewcontroller集成自这个baseScrollviewcontroller,大概意思就是,viewdidload 之后直接放一个scrollview上去,size根据contentview设置,contentview 根据约定,加载xxxxViewControllerScroll.xib 文件放到scrollview上,然后上面加一个手势,点击之后结束编辑,键盘弹下并且滚到顶部。这样就可以完美的解决输入框被挡的问题了,而且有附加效果:键盘弹起来的状态下,主界面可以自由滚动查看输入框上下的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: