搜索文本字段和tableview的问题

时间:2014-12-04 18:32:55

标签: ios uitableview

我有一个视图,其中有一个桌面视图,一个搜索文本字段(带一个按钮)位于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是包含文本字段和按钮的视图。 非常感谢任何帮助。

1 个答案:

答案 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];
}