当键盘打开时,更改视图的位置 - Objective c

9 浏览
0 Comments

当键盘打开时,更改视图的位置 - Objective c

我正在开发一个聊天应用程序。应用程序工作正常,但是在用户界面设计方面有一些问题。

我在UIview中有一个UiTextField,当用户想要输入消息时,键盘会弹出,UIview会上移。

然后当用户按返回按钮时,我想将其恢复到原始位置。

我尝试过,但它看起来像这样

我希望它能适用于所有设备。

enter image description here

这是我的代码

-(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;
}

有人可以帮助我解决这个问题吗?

0
0 Comments

当键盘打开时,改变视图位置的问题出现的原因是使用了一个订阅通知的方法,但该方法存在主要问题,即每次选择文本字段时都会订阅通知,并且没有展示如何取消订阅这些通知。因此,不建议盲目使用该方法。

那么,有什么更好的解决方法呢?

可以使用以下解决方法来改进这个问题:

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来设置视图的底部约束,使其与键盘底部保持一定的间距。

通过以上方法,可以在键盘打开时改变视图的位置,同时解决了订阅通知的问题。

0
0 Comments

问题原因:

在键盘打开时,视图的位置没有正确调整。可能是由于没有正确设置主视图的尾部约束导致的。因为视图的高度根据设备而定,所以在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;

}

}

通过上述代码中的计算,可以根据键盘的高度和文本框的位置,动态地调整主视图的位置,从而避免键盘遮挡文本框的问题。这样就能确保在所有设备上都能正常工作。

0