上文,我们叙述来了键盘与文本框最简单的情况,接下来,我们来讲一讲在tableview中多个文本框与键盘的处理。我们在每一行cell都添加上了文本框,cell过多的话是可以滚动的,这里的textfield的位置就是不固定的,所以上文的方法,我们就不能再用了。在这里那么我们怎么样才能知道要编辑的textfield的坐标呢?这里我们用了一个比较常用的方法:CGPoint p=EditField.ConvertPointToView(new CGPoint(0,30),tableview.Window);这个方法的就是首先确定一个在cell里面的位置,比如说这里就是确定了cell里面坐标为(0,30)的点,然年将这个点转换成在整个tablevie里面的坐标,这样我们就可以获得了这个坐标。现在我们找到这个坐标,我们是不是可以用到了上文中的方法,但是,还是还是会出现一定的问题,会出现文本框不停的调整的问题。那么我们这里才用了ContentOffset,我来给大家解释一下,它相当于一个窗口,然后通过这个窗口,能够看到外面的世界,而且这个窗口还是可以移动的,这个窗口就相当于我们手机的整个屏幕,整个tableview就是我们通过窗口看到的外面的世界。外面的世界也是一个坐标系的平面,窗口也是一个独立的坐标系,但是窗口相对于外面的平面也是有一个坐标的(也就是两个顶点之间的偏移量)。
这里我们通过键盘的监听事件,来处理当前正在编辑的文本的坐标,通过判断键盘的坐标和文本框的底部坐标判断,然后通过一个动画来使tableview整个的移动。
代码如下:
EditField=new UITextField(new CoreGraphics.CGRect(10,5,250,44));
EditField.Text=data[(int)indexPath.Row].LeftLabel;
EditField.KeyboardType=UIKeyboardType.Default;
EditField.ReturnKeyType=UIReturnKeyType.Done;
EditField.ShouldReturn=delegate {
return EditField.ResignFirstResponder();
};
//程序开始编辑
EditField.AddTarget(delegate {
//获得文本框的位置
CGPoint p=EditField.ConvertPointToView(new CGPoint(0,30),tableview.Window);
cellBotton=p.Y;
CGPoint oldP=tableview.ContentOffset;
keyboardWillShow=UIKeyboard.Notifications.ObserveWillShow((s,e)=>{
CGRect kbFrame=e.FrameEnd;
nfloat kbdMinY=UIScreen.MainScreen.Bounds.Height-kbFrame.Height;
//键盘与文本框底部两者坐标进行判断
if(cellBotton>kbdMinY)
{
nfloat dis=(nfloat)Math.Abs((float)(cellBotton-kbdMinY));
oldP.Y+=dis;
UIView.Animate(0.1,()=>{
tableview.ContentOffset=oldP;
},()=>{cellBotton=0;});
}
});
},UIControlEvent.EditingDidBegin);