- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 UITableView,其中包含可变大小的单元格。高度基于我需要显示的文本 block ,因此我需要测量文本。
我只是在使用一些 Lorem Ipsum 文本:
"Nullam est elit, rutrum volutpat scelerisque eu, tincidunt ut magna. Quisque sit amet odio quis eros lobortis cursus. Phasellus mauris augue, mattis a posuere sit amet, dictum sit amet ipsum. Praesent velit sapien, tristique ut pellentesque eget, venenatis in est. Curabitur accumsan lacus nec ultricies finibus. In commodo, turpis at auctor lobortis, augue ipsum tincidunt lorem, vitae fringilla libero magna eget tortor. Sed et ultrices odio, et viverra diam. Mauris semper non lorem varius sollicitudin. Maecenas nec dui lectus. In hac habitasse platea dictumst. Quisque sapien ex, pretium id vehicula eget, tempus at nisl. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam vel sollicitudin velit, efficitur accumsan sem. Quisque id urna blandit, cursus justo sed, aliquet velit. Nullam id ipsum pellentesque, gravida nulla ut, tempor libero."
当我调用 ceil(text.height())
时,它返回 386.0
高,但是当我将该文本放入 UITextView 并打印出UITextView 它说内容是 422.0
高。 (即我的文本被截断,因为 UITextView 不够高,无法显示所有内容。)
为什么会有差异?
我使用以下字符串扩展来计算文本的高度:
extension String {
func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
return boundingBox.height
}
}
然后在 tableView(heightForRowAt:)
中我计算文本的高度并将其添加到 textview 上方和下方的空间以获得完整的单元格高度(这在我开始调试之前更优雅这个):
let textviewWidth = self.view.frame.size.width-CGFloat(32)
let spaceAboveTextView = CGFloat(45)
let spaceBelowTextView = CGFloat(16)
let textHeight = ceil(text.height(withConstrainedWidth: textviewWidth, font: UIFont.systemFont(ofSize: 17.0)))
let height = spaceAboveTextView + textHeight + spaceBelowTextView
我已验证 UITextView 使用的是 17 号的系统字体,这与我上面的代码相匹配。
我已经验证了 UITextView 的框架(显示后)是 (16.0, 45.0, 382.0, 385.6667)
所以 spaceAboveTextView=45
是准确的并且width=382
是准确的。我还检查了 UITextView 的约束,它的边距底部约束为 8pt,而 spaceBelowTextView
中的边距为 8pt,总共 16pt。
那么,我做错了什么?
最佳答案
您遇到问题很可能是因为您忘记了考虑 textContainerInset
(可能还有 TextView 的其他插图)。
默认从上、左、右依次为8个。
尝试将您的代码更改为:
let textviewWidth = self.view.frame.size.width-CGFloat(32)-textView.textContainerInset.left-textView.textContainerInset.right
let spaceAboveTextView = CGFloat(45)+textView.textContainerInset.top
// bottom space is 0 by default. But lets add it just in case ;)
let spaceBelowTextView = CGFloat(16)+textView.textContainerInset.bottom
let textHeight = ceil(text.height(withConstrainedWidth: textviewWidth, font: UIFont.systemFont(ofSize: 17.0)))
let height = spaceAboveTextView + textHeight + spaceBelowTextView
我刚刚测试了这个解决方案,它适用于 17 号的系统字体。如果这不起作用,请告诉我!
关于ios - 字符串 boundingRect 计算出的高度与 UITextView 内容高度不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43824720/
我有一个程序: [textView setFont:[UIFont fontWithName:@"ArialMT" size:20]]; [textVi
我正在 UITextViewDelegate 中处理代码。那里的每个函数都会接收接收事件的 UITextView 实例,例如: - (void)textViewDidBeginEditing:(UIT
我想在默认图像附件菜单选项(复制图像、保存到相机胶卷)中添加另一个菜单选项。请注意,如果 textView 未处于编辑模式,则当您长按嵌入在 UITextView 中的图像时会显示这些选项。 我已经尝
我想尝试禁用 UITextTapRecognizer,我认为它是 UITextView 的内置属性,因为我怀疑它会干扰我想要实现的点击手势识别器。这怎么可能? 感谢阅读! 最佳答案 我不确定这是否直接
首先我使用这个 UITextView 类 TextView 类.h @interface textViewClass : UITextView TextView 类.m @implementation
我正在开发一个应用程序,我需要为大文本放置一个 UITextView。我有一个尺寸为 180X89 的背景图像(与 UITextView 框架大小相同)。当将图像放在 UITextView 后面时,一
我只是想在 UITextView 中输入一些默认文本。有几个段落,我想用一个新行分隔这些段落。但是,当我按回车时,它只是完成了数据的输入。 在界面生成器中为 UITextView 创建默认文本时,如何
我的 iPhone 应用程序中有两个 UITextView。当用户选择一个 UITextView 时, Controller 会自动转到另一个 UITextView。我在我的项目中尝试了以下方式。但是
我正在使用 UITextView 并在我的代码中分配一些文本,但出于某种原因,它总是在 5-6 行之后开始。 UITextView 是一个 AttributedTextView 或允许属性字符串。
我有一个自定义 UIView,我想在其中布局一组 UITextView 以响应 AJAX 调用。所以我想我需要在代码中创建这些。我目前将位置设置为固定位置,但宁愿将其设置为比前一个位置低 20 像素。
我正在开发一个应用程序,它具有动态添加 TextView 的功能,在我们拖动它时增加和减小它的大小。 我可以根据字符数调整 TextView 大小,方法是将 TextView 的内容大小设置为 Tex
这可能是个愚蠢的问题。我正在尝试像所附图片一样设置左/右页边距。我通过在UIScrollView中添加UITextView成功实现了。但是,我几乎可以单独使用 UITextView 实现我想要的一切。
我有一个 UITextView。我正在根据方法 textViewDidChange 中文本的大小调整 TextView 的大小。这在我打字时工作正常。但是当我粘贴一些东西时,这不会接到电话。这是预期的
我正在开发一个基于消息的 iPhone 应用程序。我有一个屏幕可以回复收到的消息。此屏幕包含两个 UITextView,如 bottomTextView 和 topTextView。 topTextV
我用 View 制作了一个 UITextview 自定义控件。它工作正常。当我输入新行时, TextView 会随着 View (深蓝色)而增加。此后 TextViell 将以滚动的形式工作。 代码是
我想在用户完成编辑并点击屏幕上的其他地方后对我的 UITextView 执行一些处理。最佳做法是什么? 我几乎设法通过 func textViewDidEndEditing(textView: UIT
我想更改富 UITextView (iOS 6) 的部分或全部属性文本,并允许用户撤消更改。 看完NSUndoManager documentation ,我尝试了第一种方法: “Simple und
当我在 IOS7 模拟器上测试我的应用程序时。 有时我在使用 sizeToFit 时发现它很奇怪的 UITextView .sizeToFit后的框架看起来是对的,但文字只能部分显示,就像下面的照片一
我想要一个 tablew View ,其行为类似于 Apple 的 iPhone 联系人应用程序:一个 uitableviewcell,里面有一个 uitextview,这样当我在 uitextvie
我有一个可编辑的 UITextView,然后是一个仅供选择的 UITextView。当我在第一个 UITextView 中写东西时,有时我想引用另一个 UITextView 来复制文本,然后将其粘贴到
我是一名优秀的程序员,十分优秀!