代码之家  ›  专栏  ›  技术社区  ›  T .

iPhone-让键盘从右侧滑入视图,就像在“联系人”中编辑注释一样。

  •  19
  • T .  · 技术社区  · 15 年前

    我正在寻找一种从右边将键盘滑入视图的方法,就像在“联系人”应用程序中编辑便笺时发生的情况一样。

    我的问题是,当我在视图中调用[SomeTextView BecomeFirstResponder]时,键盘立即弹出,没有动画。当我在viewdidAppear中调用它时,视图首先从右侧滑入(uinavigationcontroller进行滑动),然后键盘从底部滑入。

    是否可以从右侧将键盘与视图一起滑入?

    5 回复  |  直到 10 年前
        1
  •  11
  •   ma11hew28    10 年前

    您需要做的就是告诉相关的文本视图成为 viewDidLoad 您要推到导航堆栈上的视图控制器的方法:

    override func viewDidLoad() {
        super.viewDidLoad()
        someTextView.becomeFirstResponder()
    }
    

    这在iOS 8中有效。键盘随视图从右侧滑入。

        2
  •  17
  •   ma11hew28    11 年前

    解决方案

    在iOS 7中,拨打 becomeFirstResponder _textView 在里面 viewDidLayoutSubviews 作品。

    - (void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
        [_textView becomeFirstResponder];
    }
    

    注意:在 viewWillLayoutSubviews 也可以工作。

    解释

    阅读文档中的讨论 becomeFirstResponder .

    可以调用此方法使响应者对象(如视图)成为第一个响应者。但是,如果它是视图层次结构的一部分,则只应在该视图上调用它。如果视图 window 财产持有 UIWindow 对象,它已安装在视图层次结构中;如果它返回 nil ,视图将从任何层次结构中分离。

    当使用导航控制器将自定义视图控制器推到屏幕上时, self.view.window 仍然是 在任何时候 viewDidLoad viewWillAppear: 被称为。所以, _textView.window 也是 用同样的方法,因为 文本视图 是一个子视图 self.view 也就是说,它们都在同一个窗口中。无论您如何展示自定义视图控制器, self.view.window窗口 (因此) _文本视图.窗口 也是 在里面 initWithNibName:bundle: . self.view.window窗口 按时间设置 viewDidAppear: 被调用,但为时已晚,因为到那时,导航控制器已经完成了将视图推到屏幕上的动画。

    self.view.window窗口 也由时间设置 视图将显示在子视图之外 视图diDrayOutSubview 在导航控制器的“推”动画开始之前调用这些方法。所以,这就是为什么当你用这些方法中的任何一种做的时候,它都会起作用。

    不幸的是, 视图将显示在子视图之外 视图diDrayOutSubview 不仅仅是在最初的导航控制器的推动下被调用。但是, navigationController:willShowViewController: willMoveToParentViewController: 打电话太快(之后 可视负载 但以前 self.view.window窗口 设置) navigationController:didShowViewController: didMoveToParentViewController: 被调用太晚(推动画之后)。

    我唯一能想到的另一种方法就是观察 窗口 性质 文本视图 所以当它改变的时候你会得到通知,但是我不知道怎么做,因为 窗口 readonly .

        3
  •  3
  •   malex    11 年前

    在iOS 7(或以前的任何版本)中,您可以在 加载视图 , 可视负载 视图将出现

    [yourTextView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
    

    在这种情况下,您将得到从左到右的键盘外观与按下视图控制器的运动对齐。

        4
  •  3
  •   stewart715    10 年前

    对于iOS 7,我发现以下解决方案最适合我:

    -进口 UIResponder-KeyboardCache 到你的项目。

    -添加 [UIResponder cacheKeyboard:YES]; viewDidLoad 键盘视图之前的视图。当应用程序加载时,或者在您负担得起的方便时间内(例如,在HTTP请求期间),最好立即这样做。在大多数情况下,仅仅从以前的观点来看就足够了。

    -将以下内容添加到 可视负载 键盘视图。

    dispatch_async(dispatch_get_main_queue(), ^{
      [_textField becomeFirstResponder];
    });
    

    解释一下,这将预加载键盘视图,这将消除第一次调用键盘视图时的延迟。打电话 becomeFirstResponder 在主队列中的文本字段上,使其随视图一起滑入,而不是在视图滑入之前向上动画。

        5
  •  0
  •   Tim Bowen    15 年前

    您可以尝试在将BecomeFirstResponder消息推送到堆栈之前将其发送到新的视图控制器。例如:

    -(void)functionWhereYouPushTheNewViewController {
      yourNewViewController *newVC = [[yourNewViewController alloc] init];
      [newVC.yourTextView becomeFirstResponder];
      [self.navigationController pushViewController:newVC animated:YES];
    }
    

    我发现,改变键盘之类的东西上的动画是相当困难的,如果你阅读了《人机界面指南》,苹果明确表示,他们希望某些东西一直以某种方式行动。有些方法可以改变某些动画的行为,但它们通常涉及未记录的API调用,并且是应用程序商店拒绝的理由。例如,将视图从底部向上推是违反hig的。

    希望这有帮助。