【问题标题】:Issue with search textfield and tableview搜索文本字段和表格视图的问题
【发布时间】:2015-02-02 18:23:00
【问题描述】:

我有一个视图,它在顶部有一个 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 是包含文本字段和按钮的视图。 非常感谢任何帮助。

【问题讨论】:

  • 文本字段实际上是表格视图的一部分吗?就像在它的一个牢房里一样?
  • 不,不是。主视图有一个 tableview 和一个有 2 个小部件的视图 - textview 和一个按钮。
  • 您能发布用于上下移动 UITextField 的代码吗?
  • 添加了我用来移动 UITextField 的代码。但是请注意,当文本字段自动执行时,不会调用此方法。仅当我单击文本字段并想要输入内容或单击键盘上的完成按钮时才会调用此方法。
  • 除了adjustView: 方法之外,问题发生在代码中的其他地方。我在下面的回答中解释了原因。在您的代码中(例如在viewDidLayoutSubviews)中是否还有其他地方完全设置了self.searchView.frame.height

标签: ios uitableview


【解决方案1】:

我不确定这是否正是您要寻找的,但您可以设置 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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多