web-dev-qa-db-ja.com

目的C:複数行のUITextFieldを作成する方法

可能性のある複製:
複数行UITextfieldの作成方法

IPhoneメッセージングアプリに表示されるような複数行のテキストフィールドを実装するにはどうすればよいですか?

enter image description here

入力の長さが長さを超えると、2行目が自動的に作成されるようです。

編集:UITextViewを使用する際の私の課題を明確にするために更新

私にとっては、UITextViewの感触と外観を以下に示すようにモデル化したいと思います。提案されているようにUITextViewを使用してそれをどのように行うことができるかわかりません。例えば

1)テキストが次の行にオーバーフローする必要がある場合にボックスを動的に拡張する方法

2)下に示すように境界線とスタイルを追加する方法

3)キーボードの真上にテキストボックスを取り付ける方法(ビューではなく)

Instagramにもこれがあることを知っています。誰かが正しい方向を指し示すことができれば、それは素晴らしいことです。事前に感謝します

enter image description here

24
Zhen

これらの回答を確認してください。

複数行のUITextfieldの作成方法

複数行のUITextfieldの作成方法

http://brettschumann.com/blog/2010/01/15/iphone-multiline-textbox-for-sms-style-chat

そして間違いなく Three2 を試してみてください。これはFacebookのような多くのアプリで使用されている素晴らしいライブラリです。


編集:BrettSchumannブログからの抜粋を追加

#import <uikit uikit.h="">
@interface MultilineTextboxViewController : UIViewController {
    IBOutlet UIView *viewTable;
    IBOutlet UIView *viewForm;
    IBOutlet UITextView *chatBox;
    IBOutlet UIButton   *chatButton;
}

@property (nonatomic, retain) UIView *viewTable;
@property (nonatomic, retain) UIView *viewForm;
@property (nonatomic, retain) UITextView *chatBox;
@property (nonatomic, retain) UIButton *chatButton;

- (IBAction)chatButtonClick:(id)sender;
@end
</uikit>

それが完了したら、すべてを設定している間に、メイン(.m)ファイルにアイテムを追加して、同時にそれらの割り当てを解除することも忘れないでください。

@synthesize viewTable;
@synthesize viewForm;
@synthesize chatBox;
@synthesize chatButton;

- (void)dealloc{
    [viewTable release];
    [viewForm release];
    [chatBox release];
    [chatButton release];
    [super dealloc];
}

(void)viewDidLoadメソッドでは、通知オブザーバーを追加して、キーボードが表示または非表示になったとき、およびユーザーがキーボードのキーを押したときを確認できるようにする必要があります。

- (void)viewDidLoad {
    //set notification for when keyboard shows/hides
    [[NSNotificationCenter defaultCenter] addObserver:self 
                        selector:@selector(keyboardWillShow:) 
                        name:UIKeyboardWillShowNotification 
                        object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self 
                        selector:@selector(keyboardWillHide:) 
                        name:UIKeyboardWillHideNotification 
                        object:nil];

    //set notification for when a key is pressed.
    [[NSNotificationCenter defaultCenter] addObserver:self 
                        selector: @selector(keyPressed:) 
                        name: UITextViewTextDidChangeNotification 
                        object: nil];

    //turn off scrolling and set the font details.
    chatBox.scrollEnabled = NO;
    chatBox.font = [UIFont fontWithName:@"Helvetica" size:14]; 

    [super viewDidLoad];
}

テキストビューにフォーカスが設定されると、キーボードが表示されます。テキストビューとボタンはどちらも画面の下部のviewFormにあるため、キーボードはこれらの上に乗って行きます。そのため、viewTableの高さとviewFormの位置を調整します。これは次の方法で行います。

-(void) keyboardWillShow:(NSNotification *)note{
    // get keyboard size and loction
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &keyboardBounds];

    // get the height since this is the main value that we need.
    NSInteger kbSizeH = keyboardBounds.size.height;

    // get a rect for the table/main frame
    CGRect tableFrame = viewTable.frame;
    tableFrame.size.height -= kbSizeH;

    // get a rect for the form frame
    CGRect formFrame = viewForm.frame;
    formFrame.Origin.y -= kbSizeH;

    // animations settings
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3f];

    // set views with new info
    viewTable.frame = tableFrame;
    viewForm.frame = formFrame;

    // commit animations
    [UIView commitAnimations];
}

キーボードが表示され、ビューが調整されたので、ユーザーが入力しているテキストをキャプチャし、chatBoxを調整する必要があるかどうかを確認します。幸いなことに、CGSizeオブジェクトを使用し、テキストを渡して、オブジェクトに高さを計算できるテキストの制限サイズを指示することができます。ラインはフォントのサイズによって異なり、CGSizeオブジェクトの幅はUITextviewの幅によって異なるため、少し実験する必要があります。以下のコードで使用する値12は、chatBoxの開始時の高さと、設定したフォントに基づく行の高さとの高さの差です。

-(void) keyPressed: (NSNotification*) notification{
    // get the size of the text block so we can work our magic
    CGSize newSize = [chatBox.text 
                sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14] 
                constrainedToSize:CGSizeMake(222,9999) 
                lineBreakMode:UILineBreakModeWordWrap];
    NSInteger newSizeH = newSize.height;
    NSInteger newSizeW = newSize.width;

    // I output the new dimensions to the console 
    // so we can see what is happening
    NSLog(@"NEW SIZE : %d X %d", newSizeW, newSizeH);
    if (chatBox.hasText)
    {
        // if the height of our new chatbox is
        // below 90 we can set the height
        if (newSizeH <= 90)
        {
            [chatBox scrollRectToVisible:CGRectMake(0,0,1,1) animated:NO];

            // chatbox
            CGRect chatBoxFrame = chatBox.frame;
            NSInteger chatBoxH = chatBoxFrame.size.height;
            NSInteger chatBoxW = chatBoxFrame.size.width;
            NSLog(@"CHAT BOX SIZE : %d X %d", chatBoxW, chatBoxH);
            chatBoxFrame.size.height = newSizeH + 12;
            chatBox.frame = chatBoxFrame;

            // form view
            CGRect formFrame = viewForm.frame;
            NSInteger viewFormH = formFrame.size.height;
            NSLog(@"FORM VIEW HEIGHT : %d", viewFormH);
            formFrame.size.height = 30 + newSizeH;
            formFrame.Origin.y = 199 - (newSizeH - 18);
            viewForm.frame = formFrame;

            // table view
            CGRect tableFrame = viewTable.frame;
            NSInteger viewTableH = tableFrame.size.height;
            NSLog(@"TABLE VIEW HEIGHT : %d", viewTableH);
            tableFrame.size.height = 199 - (newSizeH - 18);
            viewTable.frame = tableFrame;
        }

        // if our new height is greater than 90
        // sets not set the height or move things
        // around and enable scrolling
        if (newSizeH > 90)
        {
            chatBox.scrollEnabled = YES;
        }
    }
}

ユーザーが送信ボタンを押すと、テキストで何かを実行したいので、キーワードが消え、ビューを元の状態に戻したいと思います。それではどうすればいいのでしょうか?

- (IBAction)chatButtonClick:(id)sender{
    // hide the keyboard, we are done with it.
    [chatBox resignFirstResponder];
    chatBox.text = nil;

    // chatbox
    CGRect chatBoxFrame = chatBox.frame;
    chatBoxFrame.size.height = 30;
    chatBox.frame = chatBoxFrame;
    // form view
    CGRect formFrame = viewForm.frame;
    formFrame.size.height = 45;
    formFrame.Origin.y = 415;
    viewForm.frame = formFrame;

    // table view
    CGRect tableFrame = viewTable.frame;
    tableFrame.size.height = 415;
    viewTable.frame = tableFrame;
}

ResignFirstResponderはキーボードを非表示にし、ビューとchatBoxを元の状態に戻すだけです。

-(void) keyboardWillHide:(NSNotification *)note{
    // get keyboard size and loction

    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &keyboardBounds];

    // get the height since this is the main value that we need.
    NSInteger kbSizeH = keyboardBounds.size.height;

    // get a rect for the table/main frame
    CGRect tableFrame = viewTable.frame;
    tableFrame.size.height += kbSizeH;

    // get a rect for the form frame
    CGRect formFrame = viewForm.frame;
    formFrame.Origin.y += kbSizeH;

    // animations settings
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3f];

    // set views with new info
    viewTable.frame = tableFrame;
    viewForm.frame = formFrame;

    // commit animations
    [UIView commitAnimations];
}

そして、1行で始まり、ユーザーがスクロールテキストビューになる前にテキストを最大サイズまで入力するとサイズが大きくなるテキストビューです。

28
Nicolas S

UITextFieldでは複数行を記述できませんが、代わりにUITextViewを使用し、NSString -sizeWithFont必要なスペースを理解する機能。

このような:

CGSize size = [yourTextView.text sizeWithFont:yourTextView.font];
CGRect f = yourTextView.frame;
f.size.height = ceil(size.width/f.size.width)*size.height
yourTextView.frame = f;

私はこのコードを試しませんでしたが、過去にそのようなコードをすでに使用していました。私の情報が役に立つことを願っています:)

23
mt81