【问题标题】:How to create a multiline UITextfield?如何创建多行 UITextfield?
【发布时间】:2010-11-23 15:39:29
【问题描述】:

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

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

【问题讨论】:

标签: ios uitextfield uitextview


【解决方案1】:

UITextField 专门只有一行。

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

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

【讨论】:

  • 那么请告诉我本机日历应用程序如何在事件添加屏幕上使用占位符和自动换行查看注释?
  • 如何为 UITextView 设置占位符?
  • TextView 不能添加占位符,但是可以在 TextView 上添加一个灰色标签,如果用户输入一些文本则隐藏它。
  • 请问有人可以帮我解决以下问题吗?如果用户在 UITextView 中写入项目符号文本(多个换行符),如何检测换行符的总数?
  • @Markus 你应该为此打开一个新问题
【解决方案2】:

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

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

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

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

    【讨论】:

    • 我使用了自动布局并将 UITextField 的所有侧面都固定到 UITextView。非常棒的技巧,谢谢!
    • 请@phantmann,你能告诉我们你的自动布局代码吗?
    • 这会创建一个UITextView。拥有 UITextField 的关键在于它的行为与 UITextView 不同。
    • UITextViewUITextfield 之间有很多不同之处:它们继承自 UIScrollView vs UIControl,默认不可编辑 vs. 默认可编辑,多行与单行、不同的委托协议、无占位符与占位符。
    • UITextView 用于文本段落。如果您需要一段文本,请使用它,否则不需要。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      如果您必须有一个包含 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];
      

      【讨论】:

        【解决方案6】:

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

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

        create a data entry screen

        【讨论】:

          【解决方案7】:

          使用 UITextView 代替 UITextField

          【讨论】:

            【解决方案8】:
            '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"
                    }
                }   
            }
            

            【讨论】:

              【解决方案9】:

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

              参考:在这里回答了 Brian:How to set UITextField height?

              【讨论】:

                【解决方案10】:

                使用textView 代替它的委托,在该方法调用tableView.beginUpdates()tableView.endUpdates() 中调用textViewDidChange 方法,不要忘记将rowHeightestimatedRowHeight 设置为UITableView.automaticDimension .

                【讨论】:

                  【解决方案11】:

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

                  继承 UITextField 并覆盖:

                  - (void)drawTextInRect:(CGRect)rect
                  

                  在这个方法中你可以例如:

                      NSDictionary *attributes = @{ NSFontAttributeName : self.font,
                                                    NSForegroundColorAttributeName : self.textColor };
                  
                      [self.text drawInRect:verticalAlignedRect withAttributes:attributes];
                  

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

                  不要使用:

                  self.defaultTextAttributes
                  

                  这将强制渲染一行文本

                  【讨论】:

                    猜你喜欢
                    • 2012-02-19
                    • 2011-09-17
                    • 2011-06-03
                    • 1970-01-01
                    • 2017-10-30
                    • 2014-08-28
                    • 1970-01-01
                    • 2023-03-05
                    • 1970-01-01
                    相关资源
                    最近更新 更多