最新寫一個項目,其中某個界面需要添加了一個tableview, 分多個組,每個cell里的contentview里又加了一個textfield.
需要實現的效果:當點某個textfield時,若textfield被鍵盤遮擋,當前tableview自動滾動到彈出的鍵盤的上面。當錄入完畢,自動回到原來的位置。
我的處理方法是:建立一個CGPoit臨時變量contentoffset, 以保存當前tableview的偏移,以備錄入完畢,tableview滾回原來的位置。
下面是處理的代碼塊:
CGPoint contentoffset;
#pragma mark textfield delegate
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
myview.hidden=NO;
//獲取cell所在的indexpath
NSIndexPath *indexpath=[table indexPathForCell:((UITableViewCell *)textField.superview.superview) ];
//獲取當前cell在tableview中的位置
CGRect rectintableview=[table rectForRowAtIndexPath:indexpath];
//獲取當前cell在屏幕中的位置
CGRect rectinsuperview=[table convertRect:rectintableview fromView:[table superview]];
contentoffset.x=table.contentOffset.x;
contentoffset.y=table.contentOffset.y;
if ((rectintableview.origin.y+50-table.contentOffset.y)>200) {
[table setContentOffset:CGPointMake(table.contentOffset.x,((rectintableview.origin.y-table.contentOffset.y)-150)+table.contentOffset.y) animated:YES];
}
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
myview.hidden=YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
[table setContentOffset:CGPointMake(contentoffset.x,contentoffset.y) animated:YES];
return YES;
}
下面總結一下解決上面問題過程中學習的知識:
1, 通過textfield獲得當前cell
((UITableViewCell *)textField.superview.superview)
因為添加的時候是將textfield加到了cell的contentview里去了,所以textfield.superview實際是cell的contentview.
Contentview的superview是cell,所以textfield.superview.superview是當前textfield所在的cell.
2,通過cell獲得當前的indexpath
NSIndexPath *indexpath=[table indexPathForCell:((UITableViewCell *)textField.superview.superview) ];
3,通過cell獲得當前cell在tableview中的位置的方法
//獲取當前cell在tableview中的位置
CGRect rectintableview=[table rectForRowAtIndexPath:indexpath];
//獲取當前cell在屏幕中的位置
CGRect rectinsuperview=[table convertRect:rectintableview fromView:[table superview]];
4,通過設置tableview的偏移量來滾動到目標的位置
[table setContentOffset:CGPointMake(table.contentOffset.x,((rectintableview.origin.y-table.contentOffset.y)-150)+table.contentOffset.y) animated:YES];