2013-11-20 5 views
5

私は、メッセージがiOS 7と同じようなキーボードのやりとりを実現しようとしています。UIViewにはUITextViewが含まれていて、ユーザーが入力を開始すると、このUIViewinputAccessoryViewです。これは私のためのアニメーションの世話をするだろう、と同様にUITextViewが、私はそのinputAccessoryViewに既にある親UIView(に設定しようとしている、編集を開始すると、新しいUIScrollViewキーボードは、iOS 7にUITextViewの親をinputAccessoryViewにする

を相互作用を却下しますビュー階層)。キーボードは表示されますが、アクセサリビューは表示されません。

この作業を行うには、UITextFieldのデュオを使用している人もいますが、これは悪い方法です。

提案がありますか?

答えて

0

これを動作させる唯一の方法は、2番目のテキストフィールドを使用することです。アイデアは、それをサブビューにすることですが、見えません(狂った矩形のため)。 firstResponderをデリゲートメソッドを取得しながら、実際のテキストフィールドとの間で切り替えます。私は(あなたがペーストをコピーして、時間の約2分で動作を確認することができます)いくつかのいずれかのViewControllerのテストプロジェクトを作成し、これをした:

@implementation ViewController 
{ 
    UITextField *field; 
    UITextField *dummyView; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    field = [[UITextField alloc] initWithFrame:CGRectMake(0, 460, 320, 20)]; 
    field.borderStyle = UITextBorderStyleRoundedRect; 
    field.delegate = self; 
    //field.inputAccessoryView = field; 
    field.text = @"FOO"; 
    [self.view addSubview:field]; 

    dummyView = [[UITextField alloc] initWithFrame:CGRectMake(0, 40000, 320, 20)]; 
    dummyView.delegate = self; 
    [self.view addSubview:dummyView]; 
} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    if(textField == field && textField.superview == self.view) { 
     [field removeFromSuperview]; 
     dummyView.inputAccessoryView = field; 

     [dummyView becomeFirstResponder]; 
    } 
    return YES; 
} 

@end 

私はiOSの4以降出荷のアプリでこの技術を使用しました追加する必要があります。

EDIT:他のアイデアのカップルので:

1)、キーボードが少し良く見て移動を開始するとき、あなたはあなたのTextViewのスナップショットを取ることができるグリッチを作るUIImageViewにそれを置く、とするにはテキストビューをプライマリビューから削除し、UIImageViewで置き換えます。今、外観は同じです。画像にアニメーションを追加して、50msの間にノーテイングが起こると、アルファは0になります。実際のテキストビューに同様のアニメーションを追加して、0のアルファ値が50msになるようにします。これを微調整することができれば、移行は良好です(ただし、それほど優れているわけではありません)。

2)Appleがおそらくそうする方法は、キーボードの移動通知からアニメーションカーブとタイミングを取得することです。この場合、最初は高さ0のアクセサリビューを追加し、キーボードを追跡するようにtextFieldをアニメートしますが、その上に表示されます。両方とも同時に同じ距離を移動します。アニメーションの最後では、textFieldがself.viewから引き出され、アクセサリビューのフレームはtextFieldの高さに変更され、textFieldはアクセサリコンテナビューのサブビューとして配置されます。これはうまくいくはずですが、それはちょっと複雑です。あなたが誰かにコード化してもらうためには、あなたは100ポイントの賞金を提供します。最初のレスポンダを辞めてしまうので、テキストフィールドを最後に移動して移動するときには、ダミーのテキストフィールドが必要です。だから最後に、ダミーフィールドを最初のレスポンダにし、テキストフィールドを移動してから、実際のテキストフィールドを最初のレスポンダに再び設定します。

+0

デビッドありがとうございます。私はこれを試し、私ができる時に更新します。 Appleがこれを行うためのより良い方法を提供していないことは残念です。 – Ricky

+0

私の個人的な意見は、それほどコードではなく、OSXで頻繁に使用されていたプリンシパルを使用しており、率直に言えば、他のバグや機能がありました。私は徐々に更新することはできません(クラッシュする)複雑なコレクションビューを持っているので、すべての変更を行うにはすべてをリロードする必要があります! –

+0

私はこれをUITextViewsで動作させることができましたが、UIKeyboardは画面の下部からinputAccessoryViewでアニメーション化されています。非常に短時間の間に、一方のビューが他方のビューを上に向くのを見ることができます。あなたはこれに気づいたことがありますか? – Ricky

0

.inputAccessoryViewをまったく使用せず、代わりにキーボードの開閉に合わせてUIViewという親の位置をアニメートすると、これが最も効果的です。 Here is an answer describing the process step-by-step with all the code.

+0

このアプローチの問題は、インタラクティブなキーボード解読では機能しないということです。これは、通常のキーボードの外観/消失にのみ有効です。 – greenisus

7

Aはるかに簡単に解決策は、あなたの入力フィールドビューコントローラの入力アクセサリビューを作ることです。

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

- (UIView *)inputAccessoryView 
{ 
    return self.yourInputField; 
} 

ビューが画面の下部に、画面上にあるとするとき、それはでファーストレスポンダになりますユーザがそれをタップすると、キーボードが提示される。ビューはアニメーション化され、キーボードのすぐ上に残ります。

関連する問題