如何创建一个多行的UITextfield?

290

我正在开发一个应用程序,用户需要写一些信息。为此,我需要一个多行的 UITextField(通常情况下,UITextField 只有单行)。

通过谷歌搜索,我发现可以使用 UITextView 代替 UITextfield 实现这个目的。


这是我为此目的编写的小控件。 它支持多行,并且有一个“完成”按钮来关闭键盘。 请随意使用它 https://code.google.com/p/galtextfield/ - Gal Blank
2
使用这个第三方类库,导入你的 Xcode 项目并使用它,它的效果非常好。链接:https://github.com/adonoho/HPGrowingTextView。 - mahesh chowdary
11个回答

491

UITextField 是仅限单行的。

你的 Google 搜索是正确的,你需要使用 UITextView 来显示和编辑多行文本。

在 Interface Builder 中,将 UITextView 添加到需要的位置并选择 "editable" 复选框。它将默认为多行。


9
请告诉我原生的日历应用如何在添加事件时制作带占位符和自动换行的注释视图? - Henadzi Rabkin
5
如何为UITextView设置占位符? - Thamilan S
6
TextView无法添加占位符,但可以在其上方添加一个灰色标签,并在用户输入文本后隐藏它。 - Andrew Romanov
请问有谁能帮我回答以下问题吗?如果用户在UITextView中写了一个带项目符号的文本(多行换行符),如何检测总换行符数量? - Markus
@Markus,你应该为此开一个新的问题。 - Nathan F.

35

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

19

好的,我用一些技巧做到了 ;) 首先建立一个 UITextField ,并增加它的 size 如下:

Ok,我使用了一些技巧;) 首先构建一个UITextField并将其size增加如下:

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

接下来在与你创建的UITextField相同的区域内创建一个UITextView,并删除它的background color。现在看起来就像你拥有了一个多行的TextField


2
我使用自动布局将UITextField的所有边缘固定到UITextView上。真是个很棒的技巧,谢谢! - phatmann
请问 @phantmann,你能给我们展示一下你的自动布局代码吗? - Esteve
9
这是创建一个UITextView。使用UITextField的原因在于它的行为与UITextView不同。 - Nate Symer
2
UITextViewUITextfield之间有很多区别:它们继承自UIScrollViewUIControl,默认情况下不可编辑与可编辑,多行与单行,不同的委托协议,没有占位符与有占位符。 - Sam Ballantyne
UITextView 用于文本段落。如果您需要一个文本段落,就使用它,否则不要使用。 - Sam Ballantyne
1
这个黑客技巧是无用的。 - OhhhThatVarun

9
除了多行行为外,UITextView和UITextField的主要区别在于UITextView没有提供占位符。为了绕过这个限制,您可以使用带有“假占位符”的UITextView。
详细信息请参见此SO问题:Placeholder in 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而不是UITextField。

2

是的,UITextView 是您要寻找的内容。您需要以不同的方式处理一些事情(例如换行键),但您可以向其添加文本,并且如果文本过多,则允许您向上和向下滚动。

此链接提供有关创建输入数据屏幕的信息:

创建数据输入屏幕


2
'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"
        }
    }   
}

0
在h4xxr的回答中,有一个补充。调整UITextField高度的更简单方法是在属性检查器->文本字段中选择方形边框样式。(默认情况下,UITextfield的边框样式为椭圆形。)
参考:Brian在这里回答:如何设置UITextField高度?

0
使用textView,然后符合其代理,调用textViewDidChange方法,将其放在方法调用内tableView.beginUpdates()tableView.endUpdates(),并不要忘记将rowHeightestimatedRowHeight设置为UITableView.automaticDimension

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接