可能性のある複製:
複数行UITextfieldの作成方法
IPhoneメッセージングアプリに表示されるような複数行のテキストフィールドを実装するにはどうすればよいですか?
入力の長さが長さを超えると、2行目が自動的に作成されるようです。
編集:UITextViewを使用する際の私の課題を明確にするために更新
私にとっては、UITextViewの感触と外観を以下に示すようにモデル化したいと思います。提案されているようにUITextViewを使用してそれをどのように行うことができるかわかりません。例えば
1)テキストが次の行にオーバーフローする必要がある場合にボックスを動的に拡張する方法
2)下に示すように境界線とスタイルを追加する方法
3)キーボードの真上にテキストボックスを取り付ける方法(ビューではなく)
Instagramにもこれがあることを知っています。誰かが正しい方向を指し示すことができれば、それは素晴らしいことです。事前に感謝します
これらの回答を確認してください。
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行で始まり、ユーザーがスクロールテキストビューになる前にテキストを最大サイズまで入力するとサイズが大きくなるテキストビューです。
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;
私はこのコードを試しませんでしたが、過去にそのようなコードをすでに使用していました。私の情報が役に立つことを願っています:)