如何实现多行文本字段,就像我在iPhone消息应用程序中看到的那样?
似乎只要输入长度超过长度,就会自动创建第二行。
编辑:更新以澄清我在使用UITextView
时遇到的挑战对我来说,我想将UITextView的感觉和外观建模为如下所示。我不知道如何按照建议使用UITextView。例如
1)如果我的文本需要溢出到下一行,如何动态展开框
2)如何添加边框和样式,如下所示
3)如何在键盘正上方(而不是在视图中)附加文本框
我知道Instagram也有这个,如果有人可以指出我正确的方向,这将是伟大的。在先谢谢你
答案 0 :(得分:28)
检查这些答案:
How to create a multiline UITextfield?
How to create a multiline UITextfield?
http://brettschumann.com/blog/2010/01/15/iphone-multiline-textbox-for-sms-style-chat
并且明确地尝试Three20这是一个很棒的库,在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];
}
在textview上设置焦点时,将显示键盘。因为文本视图和按钮都位于屏幕下方的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将隐藏键盘,然后我们要做的就是将视图和聊天框设置回原始状态。
-(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 :(得分:23)
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;
我没有尝试过这段代码,但过去我已经使用过这样的代码了。 我希望我的信息可能有用:)