2009-05-26 12 views
13

UITextFieldに入力中にポップアップする自動の正しいビューの位置を制御する方法はありますか?iPhoneでオートコレクトビューの位置を制御する

デフォルトでは、常にテキストフィールドの下に表示されます。しかし、SMSのようなAppleのアプリでは、テキストフィールドの上に表示されることがあります。

キーボードの真上に位置するテキストフィールドの場合、自動修正はキーボードによってブロックされ、使用できません。

+0

Bump! 1年後の回答は? –

+0

技術的には不可能で、これを可能にする公開APIはありません。ただし、修正ポップアップの位置を変更することができます。ポップアップはテキスト領域のサブビューであるため、サブビューを反復することで見つけることができます。あなたはそれが元の位置でどこにでも移動できることがわかります。このロジックをメソッドに入れ、テキストフィールドの "layoutSubviews"が呼び出されるたびに呼び出す...私はまだクリーナーソリューションを見ています – Nick

答えて

1

自動修正プロンプトの位置は、UITextInputプロトコルのfirstRect ...メソッドによって決まります。残念なことに、UITextFieldはプライベートクラスをこのプロトコルのデリゲートとして使用するため、サブクラス化してオーバーライドすることはできません。

しかし、独自のUITextFieldの置き換えは、CoreTextのように自分で描画して独自の選択とルーペの処理を実装することで実装できます。自動補正プロンプトの位置に影響を与えることができます。それは編集されたテキストの下に常にあるように設計されているので、本質的にfirstRect ...メソッドに置かなければなりません。

長いストーリーの短い:あまりにも面倒です。

0

私のために働いた答えは、textview/textviewのsetInputAccessoryViewメソッドを使用することです。 私は、textViewを含むツールバーを持っています。 ツールバーをテキストフィールドのinputaccessoryviewとして設定し、ツールバーのNO clipsToBoundプロパティに設定した場合、その理由はわかりませんが、キーボードの上にバルーンが表示されます

+0

これをフィールド上に表示する方法を理解できましたか?下の代わりに編集されていますか?ありがとうございました! –

0

ここではプライベートAPIを使用したソリューションですパブリックAPIを使用してこれを行う方法はありません。

  • アプリケーションの-windowsプロパティをハントして、プライベートUITextEffectsWindowウィンドウを見つけ、そのフレームを見つけます。これはキーボードです
  • TextViewのサブビューをハントしてプライベートUIAutocorrectInlinePromptビューを検索します。これはバグです。
  • 別のラッパービュー(TextViewに追加)にそのサブビューを移動し、そのラッパービューを上記のキーボードウィンドウの上に移動します。詳細checkについてスウィズルlayoutSubViewsを使用

- (void) moveSpellingCorrection { 
for (UIView *view in self.subviews) 
{ 
    if ([[[view class] description] isEqualToString:@"UIAutocorrectInlinePrompt"]) 
    { 
     UIView *correctionShadowView = nil; // [view correctionShadowView]; 

     for (UIView *subview in view.subviews) 
     { 
      if ([[[subview class] description] isEqualToString:@"UIAutocorrectShadowView"]) 
      { 
       correctionShadowView = subview; 
       break; 
      } 
     } 

     if (correctionShadowView) 
     { 
      UIView *typedTextView = nil; //[view typedTextView]; 
      UIView *correctionView = nil; //[view correctionView]; 

      for (UIView *subview in view.subviews) 
      { 
       if ([[[subview class] description] isEqualToString:@"UIAutocorrectTextView"]) 
       { 
        if (CGRectContainsRect(correctionShadowView.frame,subview.frame)) 
        { 
         correctionView = subview; 
        } 
        else 
        { 
         typedTextView = subview; 
        } 
       } 

      } 
      if (correctionView && typedTextView) 
      { 

       CGRect textRect = [typedTextView frame]; 
       CGRect correctionRect = [correctionView frame]; 
       if (textRect.origin.y < correctionRect.origin.y) 
       { 
        CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0,-50.0); 
        [correctionView setTransform: moveUp]; 
        [correctionShadowView setTransform: moveUp]; 

        CGRect windowPos = [self convertRect: view.frame toView: nil ]; 
        [view removeFromSuperview]; 
        [self.window addSubview: view]; 
        view.frame = windowPos; 
       } 

      } 
     } 

    } 

} 

}

関連する問題