19

メモを編集するときに連絡先アプリケーションで何が起こるかのように、キーボードを右からスライドして表示する方法を探しています。

私の問題は、viewWillAppear で [someTextView becomeFirstResponder] を呼び出すと、アニメーションなしでキーボードがすぐにポップアップすることです。そして、viewDidAppear で呼び出すと、ビューは最初に右からスライドインし (UINavigationController がスライドします)、次にキーボードが下からスライドインします。

ビューと一緒に、キーボードを右からスライドさせることは可能ですか?

4

5 に答える 5

17

解決

iOS 7 では、呼び出しbecomeFirstResponderが機能_textViewviewDidLayoutSubviewsます。

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

注: で実行することviewWillLayoutSubviewsもできます。

説明

becomeFirstResponderのドキュメントの議論を読んでください。

このメソッドを呼び出して、ビューなどのレスポンダー オブジェクトをファーストレスポンダーにすることができます。ただし、ビュー階層の一部である場合にのみ、そのビューで呼び出す必要があります。ビューのwindowプロパティがUIWindowオブジェクトを保持している場合、そのオブジェクトはビュー階層にインストールされています。が返された場合nil、ビューは階層から切り離されています。

ナビゲーション コントローラーを使用してカスタム ビュー コントローラーを画面上にプッシュする場合、self.view.windowまだ呼び出さnilれているかviewDidLoadviewWillAppear:呼び出されています。は のサブビューなので、_textView.windownil同じメソッドにあります。つまり、両方とも同じウィンドウにあるということです。カスタム ビュー コントローラーをどのように提示しても(したがって) も含まれます。が呼び出されるまでに設定されますが、それでは遅すぎます。その時までに、ナビゲーション コントローラーはビューを画面にプッシュするアニメーションを既に完了しているからです。_textViewself.viewself.view.window_textView.windownilinitWithNibName:bundle:self.view.windowviewDidAppear:

self.view.windowviewWillLayoutSubviewsまた、またはviewDidLayoutSubviewsが呼び出されるまでに設定され、これらのメソッドは、ナビゲーション コントローラーのプッシュ アニメーションが開始する前に呼び出されます。そのため、これらの方法のいずれかで実行すると機能します。

残念ながら、最初のナビゲーション コントローラーのプッシュ以外にも多くの呼び出しが行われますviewWillLayoutSubviewsviewDidLayoutSubviewsしかし、navigationController:willShowViewController:呼び出さwillMoveToParentViewController:れるのが早すぎる (設定後、設定viewDidLoadself.view.window) とnavigationController:didShowViewController:didMoveToParentViewController:呼び出されるのが遅すぎる (プッシュ アニメーションの後)。

私が考えることができる唯一の他の方法は、プロパティが変更されたときに通知されるように何らかの形でwindowプロパティを観察することですが、それを行う方法はわかりません._textViewwindowreadonly

于 2013-10-25T04:03:08.287 に答える
11

viewDidLoad問題のテキスト ビューに、ナビゲーション スタックにプッシュするビュー コントローラーのメソッドでファーストレスポンダーになるように指示するだけです。

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

これは iOS 8 で機能します。キーボードはビューに沿って右側からスライドします。

于 2009-07-18T20:43:59.043 に答える
3

iOS 7 の場合、次のソリューションが最適であることがわかりました。

-プロジェクトにインポートUIResponder-KeyboardCacheします。

-キーボード ビューの前のビューに追加[UIResponder cacheKeyboard:YES];します。viewDidLoadこれは、アプリケーションがロードされたらすぐに実行するか、余裕のある時間 (たとえば、HTTP 要求中) に実行する方がよい場合があります。ほとんどの場合、前のビューで十分です。

viewDidLoad・キーボードビューの に以下を追加。

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

説明すると、これはキーボード ビューをプリロードし、キーボード ビューの最初の呼び出しからの遅延を取り除きます。メイン キューでテキスト フィールドを呼び出すbecomeFirstResponderと、ビューがスライド インする前に上向きにアニメーション化されるのではなく、ビューと共にスライド インします。

于 2014-02-18T23:51:39.350 に答える
0

スタックにプッシュする前に、becomeFirstResponder メッセージを新しいビュー コントローラーに送信してみてください。例えば:

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

キーボードのようなものでアニメーションを変更するのは非常に難しいことがわかりました。ヒューマン インターフェイス ガイドラインを読むと、Apple は、常に特定のものを特定の方法で動作させたいと考えていることを明確に示しています。特定のアニメーションの動作を変更する方法はありますが、多くの場合、文書化されていない API 呼び出しが含まれており、アプリ ストアから拒否される理由となっています。たとえば、ビューを下から上にスライドさせると、HIG に違反します。

お役に立てれば。

于 2009-07-15T21:02:46.820 に答える