我正在开发一个应用程序,用户必须写一些信息。为此,我需要一个多行UITextField(通常UITextField是单行)。
UITextField
当我在谷歌上搜索时,我找到了一个使用UITextView而不是UITextfield的答案。
UITextView
UITextfield
是的,UITextView就是你要找的。你将不得不处理一些不同的东西(如返回键),但你可以添加文本,它将允许你上下滚动,如果里面有太多的文本。
这个链接有关于制作一个屏幕来输入数据的信息:
创建一个数据输入屏幕
UITextField专门是单行的。
你的谷歌搜索是正确的,你需要使用UITextView而不是UITextField来显示和编辑多行文本。
在Interface Builder中,在你想要的地方添加UITextView,并选择“可编辑”框。默认情况下是多行。
除了多行行为,UITextView和UITextField之间的主要区别是UITextView不建议占位符。为了绕过这个限制,你可以使用带有“假占位符”的UITextView。
有关详细信息,请参阅这个SO问题:UITextView中的占位符。
好吧,我用了一些技巧;)首先构建一个UITextField,并像这样增加它的size:
size
CGRect frameRect = textField.frame; frameRect.size.height = 53; textField.frame = frameRect;
然后在你制作我的UITextField的同一区域构建一个UITextView,并删除它的background color。现在看起来你有了多行TextField !
background color
TextField
如果你必须有一个包含2行文本的UITextField,一种选择是为第二行文本添加一个UILabel作为UITextField的子视图。我在我的应用程序中有一个UITextField,用户通常没有意识到可以通过点击编辑,我想添加一些小的字幕文本,说“点击编辑”到UITextField。
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];
作为上面h4xxr回答的补充,调整UITextField高度的一个更简单的方法是在属性检查器->文本字段中选择方形边框样式。(默认情况下,UITextfield的边框样式是椭圆。)
参考:回答Brian在这里:如何设置UITextField高度?
使用UITextView代替UITextField
你可以使用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
还有另一个选择对我很有效:
子类UITextField并覆盖:
- (void)drawTextInRect:(CGRect)rect
在这个方法中,你可以例如:
NSDictionary *attributes = @{ NSFontAttributeName : self.font, NSForegroundColorAttributeName : self.textColor }; [self.text drawInRect:verticalAlignedRect withAttributes:attributes];
如果rect有足够的空间,这段代码将使用所需的行数来呈现文本。您可以根据需要指定任何其他属性。
请勿使用:
self.defaultTextAttributes
这将强制一行文本渲染
'override func viewDidLoad(){ super.viwDidLoad() YOUR_TEXT_VIEW.textColor = UIColor.gray // YOUR PREFERRED PLACEHOLDER COLOR HERE YOUR_TEXT_VIEW.text = "YOUR DEFAULT PLACEHOLDER TEXT HERE" YOUR_TEXT_VIEW.delegate = self }'
这个代码块就足够了。请不要忘记在使用以下扩展之前在viewDidLoad或通过storyboard设置委托:
extension YOUR_VIEW_CONTROLLER: UITextViewDelegate { func textViewDidBeginEditing (_ textView: UITextView) { if YOUR_TEXT_VIEW.text.isEmpty || YOUR_TEXT_VIEW.text == "YOUR DEFAULT PLACEHOLDER TEXT HERE" { YOUR_TEXT_VIEW.text = nil YOUR_TEXT_VIEW.textColor = .red // YOUR PREFERED COLOR HERE } } func textViewDidEndEditing (_ textView: UITextView) { if YOUR_TEXT_VIEW.text.isEmpty { YOUR_TEXT_VIEW.textColor = UIColor.gray // YOUR PREFERED PLACEHOLDER COLOR HERE YOUR_TEXT_VIEW.text = "YOUR DEFAULT PLACEHOLDER TEXT HERE" } } }
使用textView代替,然后遵循它的委托,调用该方法中的textViewDidChange方法调用tableView.beginUpdates()和tableView.endUpdates(),不要忘记将rowHeight和estimatedRowHeight设置为UITableView.automaticDimension。
textView
textViewDidChange
tableView.beginUpdates()
tableView.endUpdates()
rowHeight
estimatedRowHeight
UITableView.automaticDimension