複数行のUITextfieldを作成するには?


259

ユーザーが情報を書き込む必要のあるアプリケーションを開発しています。この目的のために、UITextField複数行である(通常UITextFieldは単一行です)が必要です。

私がググリングしているときに、この目的UITextViewUITextfieldはなくを使用するという答えを見つけます。


これは、そのために私が正確に記述した小さなコントロールです。複数行のサポートがあり、キーボードを閉じるための[完了]ボタンもあります。それは使用して自由に感じるcode.google.com/p/galtextfield
ギャルの空白

2
このサードパーティのクラスを使用して、xcodeプロジェクトをインポートして使用します。その機能が良すぎるリンクです:github.com/adonoho/HPGrowingTextView
mahesh chowdary 2013年

回答:


435

UITextField 具体的には1行のみです。

あなたのグーグル検索は正しいです、あなたはマルチラインテキストの表示と編集のためにUITextView代わりに使う必要がありUITextFieldます。

Interface Builderで、UITextView必要な場所を追加し、「編集可能」ボックスを選択します。デフォルトでは複数行になります。


7
では、ネイティブカレンダーアプリが、イベント追加画面でのプレースホルダーとメモのワードラップでビューを作成する方法を教えてください。
Gennadiy Ryabkin、2014

3
UITextViewのプレースホルダーを設定する方法
Mani

4
TextViewにプレースホルダーを追加することはできませんが、TextViewの上に灰色のラベルを追加し、ユーザーがテキストを入力した場合は非表示にすることができます。
Andrew Romanov 2015年

誰かが次の質問で私を助けることができますか?ユーザーがUITextViewで箇条書きテキスト(複数の改行)を書き込んだ場合、改行の総数を検出する方法は?
Markus

あなたはそのための新しい質問開く必要が@Markus
ネイサンF.

20

UITextViewを使用して、UITextFieldを偽造できます。発生する問題は、プレースホルダーの機能を失うことです。

UITextViewを使用することを選択し、プレースホルダーが必要な場合は、次のようにします。

viewDidLoadで、色とテキストをプレースホルダーに設定します。

myTxtView.textColor = .lightGray
myTxtView.text = "Type your thoughts here..."

次に、UITextViewが選択されたときにプレースホルダーを非表示にします。

func textViewDidBeginEditing (textView: UITextView) {
    if myTxtView.textColor.textColor == ph_TextColor && myTxtView.isFirstResponder() {
        myTxtView.text = nil
        myTxtView.textColor = .white
    }
}

ユーザーが編集を終えたら、値があることを確認します。ない場合は、プレースホルダーを再度追加します。

func textViewDidEndEditing (textView: UITextView) {
    if myTxtView.text.isEmpty || myTxtView.text == "" {
        myTxtView.textColor = .lightGray
        myTxtView.text = "Type your thoughts here..."
    }
}

偽造する必要のあるその他の機能:

UITextFieldは多くの場合、すべての文字を大文字にします。その機能をUITableViewに追加できます。

myTxtView.autocapitalizationType = .words

UITextFieldは通常はスクロールしません。

myTxtView.scrollEnabled = false

18

さて、私はいくつかのトリックでそれをしました;)最初にa UITextFieldをビルドして、それを次のsizeように増やしました:

CGRect frameRect = textField.frame;
        frameRect.size.height = 53;
        textField.frame = frameRect;

次にUITextView、uが作成したのとまったく同じ領域にを作成し、UITextFieldそのを削除しbackground colorます。今それはあなたが複数の行を持っているようTextFieldです!


2
自動レイアウトを使用して、UITextFieldのすべての側面をUITextViewに固定しました。本当に素晴らしいトリック、ありがとう!
ファットマン2013

@phantmannをお願いします、自動レイアウトのコードを教えていただけますか?
Esteve 2014年

8
これによりが作成されますUITextView。UITextFieldの重要な点は、UITextFieldの動作がとは異なることUITextViewです。
Nate Symer、2015

2
との間には多くの違いがUITextViewありUITextfieldます。それらは、UIScrollViewvs から継承、UIControlデフォルトでは編集不可、デフォルトでは編集可能、複数行と単一行、異なるデリゲートプロトコル、プレースホルダーなしとプレースホルダーです。
Sam Ballantyne 2016年

UITextViewテキストの段落用です。テキストの段落が必要な場合に使用し、それ以外の場合は使用しないでください。
Sam Ballantyne 2016年

9

複数行の動作に加えて、UITextViewとUITextFieldの主な違いは、UITextViewがプレースホルダーを提案しないことです。この制限を回避するには、「偽のプレースホルダー」でUITextViewを使用できます。

詳細については、このSOの質問を参照してください:UITextViewのプレースホルダー


2

2行のテキストを持つUITextFieldが必要な場合、1つのオプションは、2行目のテキストのUITextFieldのサブビューとしてUILabelを追加することです。アプリにUITextFieldがあり、ユーザーがタップしても編集できないことに気づかないことがよくあります。UITextFieldに「Tap to Edit」と書かれた小さな字幕テキストを追加したいと思いました。

CGFloat tapLlblHeight = 10;
UILabel *tapEditLbl = [[UILabel alloc] initWithFrame:CGRectMake(20, textField.frame.size.height - tapLlblHeight - 2, 70, tapLlblHeight)];
tapEditLbl.backgroundColor = [UIColor clearColor];
tapEditLbl.textColor = [UIColor whiteColor];
tapEditLbl.text = @"Tap to Edit";

[textField addSubview:tapEditLbl];

2

はい、UITextViewはあなたが探しているものです。(returnキーのように)いくつかのことを異なる方法で処理する必要がありますが、それにテキストを追加できます。これにより、内部にテキストが多すぎる場合に上下にスクロールできます。

このリンクには、データを入力する画面の作成に関する情報があります。

データ入力画面を作成する



0

上記のh4xxrの回答の補足として、UITextFieldの高さを調整する簡単な方法は、属性インスペクター->テキストフィールドで正方形の境界線スタイルを選択することです。(デフォルトでは、UITextfieldの境界線スタイルは楕円です。)

参照:ここでブライアンと回答:UITextFieldの高さを設定する方法?


-1

私のために働いた別のオプションがあります:

UITextFieldをサブクラス化して上書き:

- (void)drawTextInRect:(CGRect)rect

この方法では、たとえば次のことができます。

    NSDictionary *attributes = @{ NSFontAttributeName : self.font,
                                  NSForegroundColorAttributeName : self.textColor };

    [self.text drawInRect:verticalAlignedRect withAttributes:attributes];

このコードは、rectに十分なスペースがある場合、必要な数の行を使用してテキストをレンダリングします。必要に応じて、他の属性を指定できます。

使ってはいけません:

self.defaultTextAttributes

1行のテキストレンダリングを強制します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.