有没有一种很好的方法来调整 UITextView
的大小以符合其内容?比方说我有 UITextView
,其中包含一行文字:
"Hello world"
然后我添加另一行文字:
"Goodbye world"
在Cocoa Touch中有一个很好的方法来获取 rect
,它将保存文本视图中的所有行,以便我可以相应地调整父视图吗?
作为另一个示例,请查看日历应用程序中事件的注释字段 - 注意单元格(及其包含的 UITextView
)如何扩展以包含注释字符串中的所有文本行 .
30 回答
在我(有限)的经历中,
不尊重换行符,因此最终可能比实际需要的要短很多
CGSize
.确实似乎尊重新线 .
此外,文本实际上并未呈现在
UITextView
的顶部 . 在我的代码中,我将UITextView
的新高度设置为比sizeOfFont
方法返回的高度大24个像素 .这适用于iOS 6.1和iOS 7:
或者在Swift中(与iOS 11中的Swift 4.1一起使用)
如果您想要支持iOS 6.1,那么您还应该:
这不再适用于iOS 7或更高版本
实际上有一种非常简单的方法可以将
UITextView
的大小调整为其正确的内容高度 . 可以使用UITextView
contentSize
完成 .需要注意的一点是,正确的
contentSize
仅可用 afterUITextView
已添加到视图中addSubview
. 在此之前它等于frame.size
如果自动布局为ON,则无效 . 使用自动布局时,一般方法是使用
sizeThatFits
方法并更新高度约束上的constant
值 .heightConstraint
是您通常通过将属性链接到故事板中创建的高度约束来通过IBOutlet设置的布局约束 .只是为了增加这个惊人的答案,2014年,如果你:
仅与 iPhone6+ 的行为有所不同:
仅使用6(不是5或6),它确实为UITextView添加了“一个空白行” . “RL解决方案”完美地解决了这个问题:
它解决了6上的“额外线”问题 .
为了在
UITableViewCell
中动态调整大小UITextView
,我发现以下组合在Xcode 6中与iOS 8 SDK一起使用:将
UITextView
添加到UITableViewCell
并将其约束到两侧将
UITextView
的scrollEnabled
属性设置为NO
. 启用滚动后,UITextView
的框架与其内容大小无关,但在禁用滚动的情况下,两者之间存在关系 .如果您的表使用原始默认行高44,那么它将自动计算行高,但如果您将默认行高更改为其他行,则可能需要在
viewDidLoad
中手动启用行高的自动计算:对于只读动态调整大小
UITextView
,就是这样 . 如果您允许用户编辑UITextView
中的文本,您还需要:UITextViewDelegate
协议的textViewDidChange:
方法,并在每次编辑文本时告诉tableView
重绘自身:Storyboard
或tableView:cellForRowAtIndexPath:
中的某处设置UITextView
委托Swift :
使用代码和故事板的非常简单的工作解决方案 .
按代码
通过故事板
取消选中 Scrolling Enable
除此之外无需做任何事情 .
在iOS6中,您可以在设置文本后立即检查UITextView的
contentSize
属性 . 在iOS7中,这将不再有效 . 如果要为iOS7恢复此行为,请将以下代码放在UITextView的子类中 .我将在页面底部发布正确的解决方案,以防有人勇敢(或绝望)阅读到这一点 .
对于那些不想阅读所有文本的人来说,这是gitHub回购:resizableTextView
This works with iOs7 (and I do believe it will work with iOs8) and with autolayout. You don't need magic numbers, disable layout and stuff like that. 简短而优雅的解决方案 .
我认为,所有与约束相关的代码都应该转到
updateConstraints
方法 . 那么,让我们自己制作ResizableTextView
.我们在这里遇到的第一个问题是在
viewDidLoad
方法之前不知道真正的内容大小 . 我们可以采取漫长而错误的道路并根据字体大小,换行符等计算它 . 但我们需要强大的解决方案,因此我们将:CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
所以现在我们知道真正的contentSize,无论我们在哪里:在
viewDidLoad
之前或之后 . 现在在textView上添加高度约束(通过故事板或代码,无论如何) . 我们将使用contentSize.height
调整该值:最后要做的是告诉超类
updateConstraints
.现在我们的 class 看起来像:
ResizableTextView.m
漂亮干净吧?而且您不必在 controllers 中处理该代码!
But wait! Y NO ANIMATION!
您可以轻松地为更改设置动画,以使
textView
平滑拉伸 . 这是一个例子:你试过
[textView sizeThatFits:textView.bounds]
吗?编辑:sizeThatFits返回大小但实际上并未调整组件大小 . 我想要你想要什么,或者
[textView sizeToFit]
是你想要的更多 . 在任何一种情况下,我都不知道它是否完全符合你想要的内容,但这是第一个尝试的东西 .另一种方法是使用
NSString
方法查找特定字符串将占用的大小:-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
这将返回适合给定字符串的矩形的大小 . 传递具有所需宽度和最大高度的大小,然后您可以查看返回的高度以适合文本 . 有一个版本可以让你指定换行模式 .
然后,您可以使用返回的大小来更改视图的大小以适应 .
如果你没有
UITextView
方便(例如,你必须通过测量字符串来计算尺寸,那么在UITextView
的每一边都要考虑8磅的填充 . 例如,如果你知道所需的宽度您的文本视图,并想要找出相应的高度:这里,每个8占据了四个填充边缘之一,而100000只是一个非常大的最大尺寸 .
在实践中,您可能希望在高度上添加额外的
font.leading
;这会在文本下方添加一个空白行,如果文本视图正下方有视觉上很重的控件,则可能看起来更好 .以下内容就足够了:
UITextView
设置 scrolling enabled 为 NO :你甚至可以使用
UITableViewAutomaticDimension
.我们可以通过约束来实现 .
2.为该高度约束创建IBOutlet .
3.不要忘记为你的textview设置代理 .
4 .
然后像这样更新你的约束:)
结合Mike McMaster的回答,您可能想要做以下事情:
我发现了一种根据文本字段内部文本调整文本字段高度的方法,并根据文本字段的高度在其下方排列标签!这是代码 .
使用autolayout和你的sizetofit的人不起作用,请检查你的宽度约束一次 . 如果您错过了宽度约束,那么高度将是准确的 .
无需使用任何其他API . 只需一行即可解决所有问题 .
在这里,我只关心高度,保持宽度固定,并错过了我的TextView在故事板中的宽度约束 .
这是为了显示来自服务的动态内容 .
希望这可能有所帮助..
从iOS 8开始,可以使用UITableView的自动布局功能自动调整UITextView的大小,而根本不需要自定义代码 . 我在github中放了一个项目来演示这个,但这里有关键:
UITextView必须禁用滚动,您可以通过编程方式或通过界面构建器执行此操作 . 如果启用滚动,则不会调整大小,因为滚动可让您查看更大的内容 .
在UITableViewController的viewDidLoad中,必须为estimatedRowHeight设置一个值,然后将
rowHeight
设置为UITableViewAutomaticDimension
.当我需要在适合特定区域的文本中创建文本时,这很有效:
这是@jhibberd的快速版本
对于iOS 7.0,而不是将
frame.size.height
设置为contentSize.height
(当前无效)使用[textView sizeToFit]
.见this question .
我查看了所有答案,并且都保持固定宽度并仅调整高度 . 如果您还想调整宽度,您可以非常轻松地使用此方法:
所以在配置文本视图时,请设置滚动禁用
然后在委托方法
func textViewDidChange(_ textView: UITextView)
添加此代码:输出:
禁用滚动
添加constaints
并添加你的文字
如果您使用
UIScrollView
,您也应该添加它;希望这可以帮助:
如果有其他人到这里,这个解决方案适合我,1“Ronnie Liew”4“user63934”(我的文字来自网络服务):注意1000(在我的情况下没有什么可以这么大“)
那就是......干杯
我发现根据文本大小重新调整UITextView高度的最佳方法 .
或者你可以使用
对于那些希望textview实际向上移动并保持底线位置的人
唯一可行的代码是使用'SizeToFit'的那个,如上面的jhibberd答案,但实际上除非你在 ViewDidAppear 中调用它或将其连接到UITextView文本更改事件,否则它将不会被接收 .
基于Nikita Took的回答我来自Swift的以下解决方案在iOS 8上使用autolayout:
Swift回答:以下代码计算textView的高度 .
现在您可以将textView的高度设置为
myTextHeight
如果您需要在
staticTableView
中动态调整textView
和tableViewCell
,这是答案[https://stackoverflow.com/a/43137182/5360675][1]