在一个多项输入界面上,会有多个uitextfield类型的输入框。为了滚动方面,我们会将他们一一添加到uitableview的cell中,从而组成一个可以上下滑动的数据输入界面。
但是字符输入是通过系统自动弹出软键盘来完成的,因此在选择屏幕底端的cell时,会被软键盘的区域所覆盖。
同样,正因为输入框是在uitableview的cell中,所以可以将所在的cell滚动到软键盘覆盖的区域之上的位置。使得我们能看到输入框。
现在,我们要实现这个操作过程。
我们可以简单的将该cell滚动到表视图的可见区域的最上方的位置。
uitableview提供了这个方法“scrolltorowatindexpath:atscrollposition:animated:”。作为第一反应者的输入框,可以它的委托方法- (void)textfielddidbeginediting:(uitextfield*)textfield
将其赋值一个变量lastedittextfield中。软键盘的出现和消失都注册到该视图控制器类中,并实现它的方法。这样,在uitextfield激活弹出键盘时,系统会自动提交一个软键盘弹出的通知。键盘弹出通知会调用一个方法。
该方法要实现的逻辑是根据lastedittextfield所在的位置点,得到操作的cell,再将此cell滚动到视图可见区域的最上方。
cgpoint pt =lastedittextfield.center;
pt = [self.tableview convertpoint:ptfromview:lastedittextfield.superview];
nsindexpath* indexpath = [self.tableviewindexpathforrowatpoint:pt];
[self.tableview scrolltorowatindexpath:indexpathatscrollposition:uitableviewrowanimationtop animated:yes];
这段代码中,最重要的是根据lastedittextfield.center的值,通过uiview的实例方法-(cgpoint)convertpoint:(cgpoint)point fromview:(uiview *)view 将它转成self.tableview的坐标体系下的值。再根据新坐标体系中lastedittextfield.center的值,通过uitableview的实例方法scrolltorowatindexpath:atscrollposition:animated:将该cell滚动到屏幕最上方。
在键盘消失时,系统会再发送一个通知,将屏幕恢复到原来的位置。
将输入框滚动到最上方,虽然能满足我们的输入可见要求。但是,如果能只滚动到软键盘之上方,而不是uitableview的最上方;在输入框不在键盘覆盖的区域时,是不需要滚动的。这样的处理,将是更满意的结果。
中国足彩网信息请查看IT技术专栏
2025国考·省考课程试听报名