我正在开发一个用户必须写一些信息的应用程序。为此,我需要一个多行的UITextField
(一般UITextField
是一行)。
当我在Google上搜索时,为了这个目的,我找到了使用UITextView
代替UITextfield
的答案。
答案 0 :(得分:407)
UITextField
仅限于一行。
您的Google搜索是正确的,您需要使用UITextView
代替UITextField
来显示和修改多行文字。
在Interface Builder中,在您想要的位置添加UITextView
,然后选择“可编辑”框。它默认为多行。
答案 1 :(得分:20)
好的我用一些技巧做到了;)首先构建一个UITextField
并将其size
增加为:{/ p>
CGRect frameRect = textField.frame;
frameRect.size.height = 53;
textField.frame = frameRect;
然后在与UITextView
相同的区域内构建UITextField
,并删除其background color
。现在看起来你有多行TextField
!
答案 2 :(得分:12)
您可以使用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
答案 3 :(得分:7)
除了多行行为之外,UITextView和UITextField之间的主要区别在于UITextView没有提出占位符。要绕过此限制,您可以将UITextView与“假占位符”一起使用。
详情请参阅此问题:Placeholder in UITextView。
答案 4 :(得分:2)
是的,您正在寻找UITextView。你必须以不同的方式处理一些事情(比如返回键),但你可以添加文本,如果内部文本太多,它将允许你上下滚动。
此链接包含有关创建屏幕以输入数据的信息:
答案 5 :(得分:2)
如果你必须有一个包含2行文本的UITextField,一个选项是添加UILabel作为第二行文本的UITextField的子视图。我的应用程序中有一个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];
答案 6 :(得分:0)
上述h4xxr答案的补充,调整UITextField高度的一种更简单的方法是在属性inspectors-> Text Field中选择方形边框样式。 (默认情况下,UITextfield的边框样式为椭圆形。)
参考:在这里回答Brian:How to set UITextField height?
答案 7 :(得分:0)
使用UITextView而不是UITextField
答案 8 :(得分:0)
这个代码块就够了。请不要忘记在使用以下扩展之前在 viewDidLoad 或故事板中设置委托:
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"
}
}
}
答案 9 :(得分:0)
使用 textView
代替,然后符合其委托,在该方法调用中调用 textViewDidChange
方法调用 tableView.beginUpdates()
和 tableView.endUpdates()
并且不要忘记设置 {{1 }} 和 rowHeight
到 estimatedRowHeight
。
答案 10 :(得分:-2)
还有另一种选择对我有用:
子类UITextField和覆盖:
- (void)drawTextInRect:(CGRect)rect
在此方法中,您可以例如:
NSDictionary *attributes = @{ NSFontAttributeName : self.font,
NSForegroundColorAttributeName : self.textColor };
[self.text drawInRect:verticalAlignedRect withAttributes:attributes];
如果rect有足够的空间,此代码将使用所需的行数来呈现文本。您可以根据需要指定任何其他属性。
不要使用:
self.defaultTextAttributes
将强制一行文字呈现