0

私は UITextview を持っており、ファーストレスポンダーになり、キーボードが表示されます。現在、inputAccessoryView ツールバーに、文字列の配列を介して前後にテキストを交換するボタンがあります。私はプロセスを問題なく動作させているので、もちろん私はそれを壊す傾向があります. 私の願いは、テキストビューをカルーセルのように左右にスライドさせて、次または前の文字列が行き来していることをユーザーに明確にすることです。現在のシステムは、テキストをアニメーションなしで置き換えるだけです。

私が最初に考えたのは、UINavigationController を作成し、それに UITextviews を表示する UIViewControllers の配列を与えることでした。ナビゲーション コントローラー ビューは textview と同じくらいの大きさであり、フル ビュー (それ自体がナビゲーション コントローラーにあります) にサブビューとして追加します。私はこれをかなり完全に機能させました.ナビゲーションバーは非表示になっており、押しているかポップしているかに応じて、テキストビューが右または左にスライドすることを除いて、元のテキストビューと同じように見えます. それに関する問題は、閉じられたView Controllerとともにキーボードが滑り落ち、新しいコントローラーの新しいテキストビューが最初のレスポンダーになり、キーボードが戻ることです。閉じますが、葉巻はありません。

ページ ビュー コントローラーの使用を検討しましたが、同じ問題が発生するようです。単一のテキストビューに戻って、プロセス全体を静的な画面グラブで直接アニメーション化する必要があると思います。それは私の経験レベルを完全に超えており、もっと簡単な方法が必要だと思います。

説明されているようにビューが交換されている間、そのキーボードを表示したままにする簡単な方法を誰かが提案できますか? これを攻撃する他の角度についての提案はありますか?

4

1 に答える 1

0

単純なアニメーションのオーバーヘッドが非常に大きいようです。

次のようなことを試してください(ARCを想定):

typedef enum _eDirection
{
    rightToLeft = -1,
    leftToRight = 1
} eDirection;

- (void) animateTextFields:(eDirection)direction
{
    CGFloat distance = self.window.bounds.size.width;
    UITextField *oldTextField = thisView.textField;
    CGRect oldTFRect = oldTextField.frame;
    CGRect newTFRect = CGRectOffset(oldTFRect, -direction * distance, 0);
    UITextField *newTextField = [[UITextField alloc] initWithFrame:newTFRect];
    [newTextField setText:@"whatever"];
    [self addSubview:newTextField];
    [UIView animateWithDuration:0.3f
                     animations:^{
                         [oldTextField setFrame:CGRectOffset(oldTextField.frame, direction * distance, 0)];
                         [newTextField setFrame:CGRectOffset(newTextField.frame, direction * distance, 0)];
                     } completion:^(BOOL finished) {
                         [self setTextField:newTextField];
                         [self removeSubview:oldTextField];
                         [newTextField becomeFirstResponder];
                     }];
 }

(免責事項: 頭のてっぺんからタイプされたすべてのコードと同様に、など)

このメソッドは、新しい textField を作成し、画面上で水平方向にアニメートしながら、指定した方向に既存の textField を画面外に移動し、新しい textField を現在の textField として割り当て、それを firstResponder にします。

于 2012-09-30T20:04:09.787 に答える