272

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

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

4

11 回答 11

466

UITextField特别是只有一行。

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

在 Interface Builder 中,添加一个UITextView您想要的位置并选择“可编辑”框。默认情况下它将是多行的。

于 2009-08-28T08:34:18.847 回答
28

您可以使用 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
于 2016-05-12T12:36:37.473 回答
19

好的,我用一些技巧做到了;)首先构建一个UITextField并增加它是size这样的:

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

然后UITextView在你制作我的相同区域建立一个UITextField,并删除它background color。现在看起来你有多行TextField

于 2012-11-20T15:27:04.137 回答
9

除了多行行为之外,UITextView 和 UITextField 之间的主要区别在于 UITextView 不提出占位符。要绕过此限制,您可以使用带有“假占位符”的 UITextView。

有关详细信息,请参阅此 SO 问题:Placeholder in UITextView

于 2010-11-10T14:39:45.233 回答
2

是的,你正在寻找一个 UITextView 。您必须以不同的方式处理一些事情(例如返回键),但您可以向其中添加文本,并且如果里面有太多文本,它可以让您上下滚动。

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

创建数据输入屏幕

于 2009-08-28T08:32:29.443 回答
2

如果您必须有一个包含 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];
于 2013-05-02T16:31:58.993 回答
1

使用 UITextView 而不是 UITextField

于 2016-01-23T20:39:31.200 回答
1
'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 或故事板中设置委托,以使用以下扩展:

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"
        }
    }   
}
于 2020-12-28T00:23:27.093 回答
0

对上面h4xxr的回答的补充,调整UITextField高度的更简单的方法是在属性inspectors->Text Field中选择方形边框样式。(默认情况下,UITextfield 的边框样式是椭圆。)

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

于 2014-02-02T22:43:57.463 回答
0

改为使用textView然后符合其委托,textViewDidChange在该方法调用中调用该方法tableView.beginUpdates()tableView.endUpdates()并且不要忘记设置rowHeightestimatedRowHeightto UITableView.automaticDimension

于 2021-01-31T13:50:42.767 回答
-1

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

子类 UITextField 并覆盖:

- (void)drawTextInRect:(CGRect)rect

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

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

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

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

不使用:

self.defaultTextAttributes

这将强制一行文本呈现

于 2016-12-27T16:35:36.077 回答