如何创建多行UITextfield?


259

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

在我进行谷歌搜索时,我找到了使用UITextView而不是UITextfield为此目的的答案。


这是我为此专门编写的小控件。它具有多行支持,还具有“完成”按钮以关闭键盘。随时使用它code.google.com/p/galtextfield
Gal Blank

2
使用此第三方类导入您的xcode项目并使用它,它的工作效果很好:github.com/adonoho/HPGrowingTextView
mahesh chowdary

Answers:


435

UITextField 特别是仅一行。

您的Google搜索是正确的,您需要使用UITextView而不是UITextField显示和编辑多行文本。

在Interface Builder中,在所需UITextView位置添加一个,然后选择“可编辑”框。默认情况下它将是多行。


7
所以,请告诉我,本机Calendar应用程序如何在添加事件的屏幕上使用占位符和自动换行功能为笔记添加View?
Gennadiy Ryabkin 2014年

3
如何为UITextView设置占位符?
玛尼2014年

4
您不能在TextView中添加占位符,但是可以在TextView上添加灰色标签,并在用户输入一些文本时将其隐藏。
Andrew Romanov

请有人可以帮助我解决以下问题吗?如果用户在UITextView中写项目符号文本(多个换行符),如何检测换行总数?
马库斯

@Markus你应该打开一个新的问题
弥敦道F.

20

您可以使用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

18

好吧,我做了一些技巧;)首先构建一个UITextField并增加它,size就像这样:

CGRect frameRect = textField.frame;
        frameRect.size.height = 53;
        textField.frame = frameRect;

然后UITextView在与您制作我的作品相同的区域中建立一个UITextField,并删除其内容background color。现在看来,您有多行TextField


2
我使用自动布局并将UITextField的所有侧面固定到UITextView。真的很棒,谢谢!
phatmann

请@phantmann,您能告诉我们您的自动布局代码吗?
Esteve 2014年

8
这将创建一个UITextView。拥有UITextField的意义在于它的行为不同于UITextView
Nate Symer

2
UITextView和之间有很多区别UITextfield:它们继承自UIScrollViewvs UIControl,默认情况下不可编辑vs.默认情况下可编辑,多行与单行,不同的委托协议,无占位符与占位符。
山姆·巴兰坦

UITextView用于文本段落。如果需要一段文字,请使用它,否则不需要。
山姆·巴兰坦

9

除了多行行为之外,UITextView和UITextField之间的主要区别在于UITextView不建议使用占位符。要绕过此限制,可以将UITextView与“假占位符”一起使用。

有关详细信息,请参见此SO问题:UITextView中的占位符


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];

2

是的,您正在寻找UITextView。您必须以不同的方式处理某些事情(例如回车键),但是您可以向其中添加文本,并且如果其中包含过多的文本,它将允许您上下滚动。

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

创建一个数据输入屏幕



0

作为上述h4xxr答案的补充,一种更简单的调整UITextField高度的方法是在属性检查器->文本字段中选择方形边框样式。(默认情况下,UITextfield的边框样式为椭圆。)

参考:Brian在这里回答:如何设置UITextField的高度?


-1

还有一个对我有用的选择:

子类化UITextField并覆盖:

- (void)drawTextInRect:(CGRect)rect

在这种方法中,您可以例如:

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

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

如果rect有足够的空间,则此代码将根据需要使用多行显示文本。您可以根据需要指定其他任何属性。

不使用:

self.defaultTextAttributes

这将强制渲染一行文本

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.