如果键盘已经显示,如何根据键盘显示/隐藏调整视图大小

时间:2012-04-07 04:02:34

标签: ios keyboard

在视图A中,我有一个文本字段。我点击一个控件来推入一个新的视图控制器B.视图B只有一个文本视图,其框架应该调整以适应键盘,我总是将文本视图设置为第一个响应者,键盘应该立即显示B被推入。

我在视图控制器B中执行常用的键盘通知处理。因此,如果在按下视图B之前未显示键盘,则没有问题。但是,如果视图A中的文本字段是第一个响应者,并且当我按下视图控制器B时键盘已经显示,我将不会收到UIKeyboardWillShowNotification / UIKeyboardDidShowNotification。有任何处理这种情况的建议吗?

6 个答案:

答案 0 :(得分:1)

我之前没有遇到过这个问题,但我有一个建议。也许在View B中,您可以让textView resignFirstResponder然后becomeFirstResponder强制键盘通知出来。以下示例:

[textView resignFirstResponder];
[textView becomeFirstResponder];

还有另一种行走方式,也许你可以在推送之前在视图A中resignFirstResponder,然后在视图B becomeFirstResponder之后viewDidAppear

希望它有所帮助。

答案 1 :(得分:0)

你可以将键盘状态信息传递给viewController B ...这不是一个好方法,但是我在viewController A的viewWillDisappear中尝试了一些其他方法,比如调用[textView resignFirstResponder],所有这些都无法正常工作。

答案 2 :(得分:0)

辞职第一响应者然后再次成为第一响应者并不是我第一次想到它时立即放弃的好解决方案。当键盘已经存在时,强制键盘隐藏并立即再次显示 - 这是不对的事情 - 这是浪费并打破平稳过渡。

通过打破B的封装,从视图A向视图B发送键盘状态在软件工程中是不可接受的。

所以我相信它值得一个bug报告,我做了一个 - #11205521

答案 3 :(得分:0)

您应该尝试UITouch

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
  // Detect touch anywhere
  UITouch *touch = [touches anyObject];

  // Get the point that was touched
  CGPoint point = [touch locationInView:self.view];
  NSLog(@"pointx: %f pointy:%f", point.x, point.y);

  // Check if the point touched is within these rectangular bounds
  if (CGRectContainsPoint(CGRectMake(5, 5, 40, 130), point))
  {
    //do something...
  } 
}

答案 4 :(得分:0)

嗨,根据键盘调整视图大小,我使用类似的东西

- (void) animateView: (BOOL) up
{
    CGRect rect = self.view.frame;

    if(up)
    {
        float movement = (up ? 264 : 416);
        rect.size.height = movement;
        self.view.frame = rect;
    }
    else
    {
        rect.size.height = 480;
        self.view.frame = rect;
    }
}

BOOL变量up用于指示键盘是否显示

希望这有帮助!

的问候, 乔治

答案 5 :(得分:0)

您可以在应用程序的某个中心位置监控键盘状态,例如appDelegate,并让所有组件从中获取当前的键盘信息。