我有一个视图,其中有一个桌面视图,一个搜索文本字段(带一个按钮)位于tableview的底部。我正在尝试实现动态搜索,以便在用户类型重新加载tableview时。搜索字段很好地位于键盘顶部并进行搜索。但在某些情况下,当用户仍在键入时,它会低于键盘。这通常发生在搜索返回0结果时,表示tableview为空或者tableview具有恰好适合分配给tableview的高度的行。我不知道为什么tableview重新加载会使搜索字段返回到页面底部,即使搜索字段不是tableview的一部分。
以下是我用于根据键盘状态移动搜索字段的代码:
- (void)adjustView:(NSNotification *)notification {
CGRect keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardFrame = [self.view convertRect:keyboardFrame fromView:self.view.window];
CGRect viewFrame = self.searchView.frame;
viewFrame.origin.y = keyboardFrame.origin.y - viewFrame.size.height;
self.searchView.frame = viewFrame;
}
此处searchView是包含文本字段和按钮的视图。 非常感谢任何帮助。
答案 0 :(得分:0)
我不确定这是否正是您正在寻找的,但您可以设置UITextField委托并使用这些委托方法。它们来自我的代码,但它们会在键盘出现时为视图框架设置动画,然后在完成后再返回。
#pragma mark - Text Editing functions
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
CGRect viewFrame = self.frame;
viewFrame.origin.y += animatedDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
self.frame = viewFrame;
[UIView commitAnimations];
}
- (void) textFieldDidBeginEditing:(UITextField*) textField {
CGRect textFieldRect = [self.window convertRect:textField.bounds fromView:textField];
CGRect viewRect = [self.window convertRect:self.bounds fromView:self];
CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height;
CGFloat numerator = midline - viewRect.origin.y - MINIMUM_SCROLL_FRACTION * viewRect.size.height;
CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION) * viewRect.size.height;
CGFloat heightFraction = numerator / denominator;
if (heightFraction < 0.0) {
heightFraction = 0.0;
} else if (heightFraction > 1.0) {
heightFraction = 1.0;
}
animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction);
CGRect viewFrame = self.frame;
viewFrame.origin.y -= animatedDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
self.frame = viewFrame;
[UIView commitAnimations];
}