如何创建多行UITextfield?

时间:2009-08-28 07:37:46

标签: ios uitextfield uitextview

我正在开发一个用户必须写一些信息的应用程序。为此,我需要一个多行的UITextField(一般UITextField是一行)。

当我在Google上搜索时,为了这个目的,我找到了使用UITextView代替UITextfield的答案。

11 个答案:

答案 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。你必须以不同的方式处理一些事情(比如返回键),但你可以添加文本,如果内部文本太多,它将允许你上下滚动。

此链接包含有关创建屏幕以输入数据的信息:

create a data entry screen

答案 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 }} 和 rowHeightestimatedRowHeight

答案 10 :(得分:-2)

还有另一种选择对我有用:

子类UITextField和覆盖:

- (void)drawTextInRect:(CGRect)rect

在此方法中,您可以例如:

    NSDictionary *attributes = @{ NSFontAttributeName : self.font,
                                  NSForegroundColorAttributeName : self.textColor };

    [self.text drawInRect:verticalAlignedRect withAttributes:attributes];

如果rect有足够的空间,此代码将使用所需的行数来呈现文本。您可以根据需要指定任何其他属性。

不要使用:

self.defaultTextAttributes

将强制一行文字呈现