有關ios自動滾動頁面以顯示被鍵盤擋住的編輯框的處理

目前手頭上有一個項目,註冊流程用到了很多用戶信息輸入,界面樣式固定,時間緊急,就用的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上,然後上面加一個手勢,點擊之後結束編輯,鍵盤彈下並且滾到頂部。這樣就可以完美的解決輸入框被擋的問題了,而且有附加效果:鍵盤彈起來的狀態下,主界面可以自由滾動查看輸入框上下的內容。

發佈了25 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章