UITableView中多个UITextField时UITableView的滚动和键盘的隐藏(转)

UITableView中多个UITextField时,编辑textfield 时 UITableView 自动滚动到当前textfield 可见的行即不被键盘遮住,及键盘的显示和隐藏的问题

1、 采用 NSNotificationCenter 方式

在 .h 文件中 添加两个变量后面会用到

int keyboardHeight;
BOOL keyboardIsShowing;

@property (nonatomic, retain) UITextField *currentTextField;

在.m 文件里
@synthesize currentTextField = _currentTextField;

首先,在你的viewWillAppear:订阅到键盘上的通知,让你知道什么时候键盘会显示和隐藏,系统会告诉你的键盘大小,但是不要忘记注销您的viewWillDisappear:

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

实现方法类似下面这样你调整你曾经为tableView匹配的键盘显示可视面积的大小。不要忘了执行keyboardWillHide:

-(void) keyboardWillShow:(NSNotification *)note {

CGRect keyboardBounds;

[[note.userInfo valueForKey:UIKeyboardWillShowNotification] getValue: &keyboardBounds];

keyboardHeight = keyboardBounds.size.height;

if (keyboardIsShowing == NO) {

keyboardIsShowing = YES;
CGRect frame = self.view.frame;
frame.size.height -= keyboardHeight;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.3f];
self.view.frame = frame;
[UIView commitAnimations];
}
}

- (void)keyboardWillHide:(NSNotification*)notification {

if (!keyboardIsShowing) {
return;
}

NSDictionary* userInfo = [notification userInfo];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
[UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];

//CGRect rect = self.view.bounds;
//self.tableView.frame = CGRectMake(0, 0, 320, 416);
NSValue *value = [userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey];
CGSize keyboardSize = [value CGRectValue].size;
CGRect viewFrame = self.view.frame;
viewFrame.size.height +=keyboardSize.height;
keyboardIsShowing = NO;
[UIView commitAnimations];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
self.currentTextField = textField;
NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *) [self.tableView viewWithTag:self.currentTextField.tag]];

UITableViewCell *cell = (UITableViewCell *) [textField superview];
indexPath = [self.tableView indexPathForCell:cell];
//[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
//int currentIndex = textField.tag;
CGRect frame = textField.frame;
CGFloat rowHeight = self.tableView.rowHeight;
//下面的代码只是为了判断是哪一个textField,可以根据自己的情况进行修改,我为了测试加了7个
if (indexPath.row == 0) {
frame.origin.y += rowHeight * 0;
} else if (indexPath.row==1) {
frame.origin.y += rowHeight * 1;
} else if (indexPath.row == 2) {
frame.origin.y += rowHeight * 2;
} else if (indexPath.row ==3){
frame.origin.y += rowHeight * 3;
}else if(indexPath.row==4)
{
frame.origin.y +=rowHeight *4;
} else if(indexPath.row==5)
{
frame.origin.y +=rowHeight *5;
} else if(indexPath.row==6)
{
frame.origin.y +=rowHeight *6;
}
CGFloat viewHeight = self.tableView.frame.size.height;
CGFloat halfHeight = viewHeight / 2;
CGFloat halfh= frame.origin.y +(textField.frame.size.height / 2);

if(halfh<halfHeight){
frame.origin.y = 0;
frame.size.height =halfh;
}else{
frame.origin.y =halfh;
frame.size.height =halfh;
}
[self.tableView scrollRectToVisible:frame animated:YES ];
}

点击done(完成)按钮关闭键盘,可以在UIControlEventEditingDidEndOnExit 响应事件

[textField addTarget:self action:@selector(textFieldDoneEditing:) forControlEvents:UIControlEventEditingDidEndOnExit];

-(IBAction)textFieldDoneEditing:(id)sender
{
self.currentTextField = (UITextField *)sender;
[self.currentTextField resignFirstResponder];
[sender resignFirstResponder];
//[self.tableView scrollRectToVisible:self.currentTextField.frame animated:YES];
}

2、采用 scrollToRowAtIndexPath

点击done(完成)按钮关闭键盘,可以在UIControlEventEditingDidEndOnExit 响应事件

[textField addTarget:self action:@selector(textFieldDoneEditing:)forControlEvents:UIControlEventEditingDidEndOnExit];

-(IBAction)textFieldDoneEditing:(id)sender
{
self.currentTextField = (UITextField *)sender;
[self.currentTextField resignFirstResponder];
[sender resignFirstResponder];
[self.tableView scrollRectToVisible:self.currentTextField.frame animated:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField

{
self.currentTextField = textField;
NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *) [self.tableView viewWithTag:self.currentTextField.tag]];

//这里要看textField 是直接加到cell 上的还是加的 cell.contentView上的

//直接加到cell 上

UITableViewCell *cell = (UITableViewCell *) [textField superview];
indexPath = [self.tableView indexPathForCell:cell];

[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

}

转载于:https://www.cnblogs.com/yaoliang11/archive/2012/11/27/2790817.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的通讯录列表的OC代码实现: ``` // Contact.h #import <Foundation/Foundation.h> @interface Contact : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, copy) NSString *phone; - (instancetype)initWithName:(NSString *)name phone:(NSString *)phone; @end // Contact.m #import "Contact.h" @implementation Contact - (instancetype)initWithName:(NSString *)name phone:(NSString *)phone { self = [super init]; if (self) { self.name = name; self.phone = phone; } return self; } @end // ContactCell.h #import <UIKit/UIKit.h> @interface ContactCell : UITableViewCell @property (nonatomic, strong) UILabel *nameLabel; @property (nonatomic, strong) UILabel *phoneLabel; @end // ContactCell.m #import "ContactCell.h" @implementation ContactCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, 200, 20)]; [self.contentView addSubview:self.nameLabel]; self.phoneLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 35, 200, 20)]; [self.contentView addSubview:self.phoneLabel]; } return self; } @end // ContactListViewController.h #import <UIKit/UIKit.h> @interface ContactListViewController : UITableViewController @end // ContactListViewController.m #import "ContactListViewController.h" #import "Contact.h" #import "ContactCell.h" @interface ContactListViewController () @property (nonatomic, strong) NSMutableArray<Contact *> *contacts; @end @implementation ContactListViewController - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = @"Contacts"; UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addContact)]; self.navigationItem.rightBarButtonItem = addButton; self.contacts = [NSMutableArray array]; Contact *contact1 = [[Contact alloc] initWithName:@"John Smith" phone:@"555-1234"]; [self.contacts addObject:contact1]; Contact *contact2 = [[Contact alloc] initWithName:@"Jane Doe" phone:@"555-5678"]; [self.contacts addObject:contact2]; [self.tableView registerClass:[ContactCell class] forCellReuseIdentifier:@"ContactCell"]; } #pragma mark - Table view data source - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.contacts.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ContactCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ContactCell" forIndexPath:indexPath]; Contact *contact = self.contacts[indexPath.row]; cell.nameLabel.text = contact.name; cell.phoneLabel.text = contact.phone; return cell; } #pragma mark - Actions - (void)addContact { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Add Contact" message:nil preferredStyle:UIAlertControllerStyleAlert]; [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) { textField.placeholder = @"Name"; }]; [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) { textField.placeholder = @"Phone"; }]; UIAlertAction *addAction = [UIAlertAction actionWithTitle:@"Add" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { UITextField *nameField = alert.textFields[0]; UITextField *phoneField = alert.textFields[1]; Contact *contact = [[Contact alloc] initWithName:nameField.text phone:phoneField.text]; [self.contacts addObject:contact]; [self.tableView reloadData]; }]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]; [alert addAction:addAction]; [alert addAction:cancelAction]; [self presentViewController:alert animated:YES completion:nil]; } @end ``` 在这个实现,我们创建了一个`Contact`类来表示每个联系人,一个`ContactCell`类来自定义通讯录列表的单元格,一个`ContactListViewController`类来管理通讯录列表。我们使用`NSMutableArray`来存储所有的联系人,并在视图加载向其添加了一些示例联系人。 在`ContactListViewController`,我们实现了`UITableViewDataSource`协议和`UITableViewDelegate`协议的方法来显示通讯录列表和处理用户添加新联系人的操作。我们还添加了一个`UIBarButtonItem`,当用户点击它会出现一个`UIAlertController`来允许用户输入新联系人的信息。最后,我们在`viewDidLoad`方法注册了`ContactCell`类以供表视图使用。 这只是一个简单的例子,你可以根据自己的需要对其进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值