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

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


当前回答

还有另一个选择对我很有效:

子类UITextField并覆盖:

- (void)drawTextInRect:(CGRect)rect

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

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

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

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

请勿使用:

self.defaultTextAttributes

这将强制一行文本渲染

其他回答

使用UITextView代替UITextField

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

好吧,我用了一些技巧;)首先构建一个UITextField,并像这样增加它的大小:

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

然后在你创建UITextField的同一区域建立一个UITextView,并删除它的背景颜色。现在看起来,你有一个多行TextField !

还有另一个选择对我很有效:

子类UITextField并覆盖:

- (void)drawTextInRect:(CGRect)rect

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

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

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

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

请勿使用:

self.defaultTextAttributes

这将强制一行文本渲染

除了多行行为,UITextView和UITextField之间的主要区别是UITextView不建议占位符。为了绕过这个限制,你可以使用带有“假占位符”的UITextView。

详情请看这个SO问题:UITextView中的占位符。