当键盘打开时,更改视图的位置 - Objective c
当键盘打开时,更改视图的位置 - Objective c
我正在开发一个聊天应用程序。应用程序工作正常,但是在用户界面设计方面有一些问题。
我在UIview中有一个UiTextField,当用户想要输入消息时,键盘会弹出,UIview会上移。
然后当用户按返回按钮时,我想将其恢复到原始位置。
我尝试过,但它看起来像这样
我希望它能适用于所有设备。
这是我的代码
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; return YES; } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; [self.view endEditing:YES]; return YES; } - (void)keyboardDidShow:(NSNotification *)notification { // 为您的视图分配新的框架 [self.view setFrame:CGRectMake(0,-145,320,460)]; // 这里以 -110 为例,即您的视图将滚动到 -110。根据您的需求更改其值。 } -(void)keyboardDidHide:(NSNotification *)notification { [self.view setFrame:CGRectMake(0,0,320,460)]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.tv_Message resignFirstResponder]; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"selected index : %ld", (long)indexPath.row); } - (BOOL)textFieldShouldReturn:(UITextField *)aTextField { [aTextField resignFirstResponder]; [self.view setFrame:CGRectMake(0,0,320,460)]; return YES; }
有人可以帮助我解决这个问题吗?
当键盘打开时,改变视图位置的问题出现的原因是使用了一个订阅通知的方法,但该方法存在主要问题,即每次选择文本字段时都会订阅通知,并且没有展示如何取消订阅这些通知。因此,不建议盲目使用该方法。
那么,有什么更好的解决方法呢?
可以使用以下解决方法来改进这个问题:
1. 首先,在视图控制器的头文件中添加一个属性,用于保存键盘高度:
@property (nonatomic, assign) CGFloat keyboardHeight;
2. 在视图控制器的实现文件中,添加以下方法来处理键盘的显示和隐藏:
- (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 name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
- (void)keyboardWillShow:(NSNotification *)notification {
NSDictionary *userInfo = [notification userInfo];
NSValue *keyboardFrameValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardFrame = [keyboardFrameValue CGRectValue];
self.keyboardHeight = keyboardFrame.size.height;
[self adjustViewForKeyboard];
}
- (void)keyboardWillHide:(NSNotification *)notification {
self.keyboardHeight = 0;
[self adjustViewForKeyboard];
}
- (void)adjustViewForKeyboard {
// 根据键盘高度调整视图位置
// ...
}
3. 在adjustViewForKeyboard方法中,可以根据键盘高度来调整视图的位置。例如,可以使用Auto Layout来设置视图的底部约束,使其与键盘底部保持一定的间距。
通过以上方法,可以在键盘打开时改变视图的位置,同时解决了订阅通知的问题。
问题原因:
在键盘打开时,视图的位置没有正确调整。可能是由于没有正确设置主视图的尾部约束导致的。因为视图的高度根据设备而定,所以在keyboardDidShow(:)方法中动态地将主视图上移,为了使其在所有设备上都能正常工作,需要根据文本框和键盘高度计算出主视图的位置,并相应地设置视图的框架。
解决方法:
在keyboardDidShow(:)方法中,根据文本框和键盘高度计算出主视图应该上移的位置,然后设置主视图的框架,以实现视图位置的调整。具体操作如下:
- (void)keyboardDidShow:(NSNotification *)notification {
CGRect keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat keyboardHeight = keyboardFrame.size.height;
CGRect textFieldFrame = self.textField.frame;
CGFloat textFieldBottom = textFieldFrame.origin.y + textFieldFrame.size.height;
CGFloat viewBottomOffset = textFieldBottom - (self.view.frame.size.height - keyboardHeight);
if (viewBottomOffset > 0) {
CGRect viewFrame = self.view.frame;
viewFrame.origin.y -= viewBottomOffset;
self.view.frame = viewFrame;
}
}
通过上述代码中的计算,可以根据键盘的高度和文本框的位置,动态地调整主视图的位置,从而避免键盘遮挡文本框的问题。这样就能确保在所有设备上都能正常工作。