- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前在 UITextField 上有以下扩展来计算给定字符串的边界矩形。
func widthHeight(font: UIFont) -> CGRect {
let constraintRect = CGSize(width: 200, height: 1000)
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
return boundingBox
}
constraintRect
的宽度是我希望框允许的最大宽度。
我这样设置值和单元格:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuse, for: indexPath) as? ChatCollectionViewCell {
let text = self.chatLog[indexPath.row].text
cell.chatTextView.text = text
cell.chatViewWidth = (text?.widthHeight(font: UIFont.systemFont(ofSize: 16)).width)!
return cell
}
return UICollectionViewCell()
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if let text = self.chatLog[indexPath.row].text {
let box = text.widthHeight(font: UIFont.systemFont(ofSize: 16))
return CGSize(width: view.frame.width, height: box.height + 10)
}
return CGSize(width: self.view.frame.width, height: 60)
}
如您所见, View 的框架非常困惑。第一行是“嘿呀”,第二行是“生活过得怎么样”,第三行是“我是订书机,你是教科书”。有些单元格太窄,有些单元格太宽。
这是我的自定义 collectionViewCell 的一些附加代码:
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
}
override func layoutSubviews() {
chatView.frame = CGRect(x: 0, y: 0, width: chatViewWidth, height: frame.height)
chatTextView.frame = CGRect(x: chatView.frame.origin.x + 10, y: 0, width: chatView.frame.width - 20, height: chatView.frame.height)
}
func setupViews() {
if isTextFromCurrentUser {
chatTextView.frame = CGRect(x: 10, y: 0, width: frame.width - 140, height: frame.height)
chatTextView.backgroundColor = .white
} else {
chatTextView.frame = CGRect(x: frame.width - 150, y: 0, width: frame.width - 140, height: frame.height)
chatTextView.backgroundColor = .blue
}
chatTextView.font = UIFont.systemFont(ofSize: 16)
chatTextView.layer.cornerRadius = 9
chatTextView.clipsToBounds = true
chatTextView.autoresizingMask = UIViewAutoresizing.flexibleHeight
chatTextView.isScrollEnabled = false
contentView.addSubview(chatView)
contentView.addSubview(chatTextView)
}
最佳答案
化疗,
因为我相信它是一个聊天气泡,您正试图为其设置高度并且聊天气泡不能在其中有任何滚动确保您的 textView 的滚动被禁用。
其次,聊天气泡应根据内容增加其高度,并且没有高度限制,使用 CGFloat.greatestFiniteMagnitude
作为您在计算 boundingRect 时可以容纳的可能高度
func widthHeight(font: UIFont) -> CGRect {
let constraintRect = CGSize(width: 200, height: CGFloat.greatestFiniteMagnitude)
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
return boundingBox
}
最后确保没有 contentInset
设置到 textView。如果 contentInset
设置为左 5 和右 5,请确保从您可以容纳的最大宽度中减去 10 (5 + 5)。
由于高度是方程式设置中唯一的变量,因此宽度恰好是获得正确高度的关键。确保您设置的行选项正确匹配您的 textViews 属性。
建议:
UITableView
可以利用单元格的自动高度,在 textView 上设置滚动禁用使 textView 根据文本集计算其大小。我的意思是 textView 将遵守隐式大小。
因为我相信你正在创建一个聊天应用程序,其中每个气泡都是一个单元格,请考虑使用 UITableView 的更明智的选择并利用自动单元格高度的好处,然后搞乱 collectionView,它希望你手动提供每个项目的大小.
一点建议 :D
我个人使用了 bounding rect 并在加载试错方法后设法计算出文本的确切高度。我个人建议创建一个 textView 实例,将其属性设置为与您在 Storyboard中拥有的 textView 的属性完全匹配,然后设置您想要显示的文本并使用 sizeThatFits 来获取 textView 的实际大小,这更容易。
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let textView = UITextView(frame: CGRect.zero)
//set textView property here
textView.text = self.chatLog[indexPath.row].text
let size = textView.sizeThatFits(CGSize(width: textView.bounds.width, height: CGFloat.greatestFiniteMagnitude))
return size;
}
关于ios - UITextView 的 boundingRect 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45952612/
我正在编写一个带圆圈的物理模拟。 Ball.cpp 代码: Ball::Ball() { angle = 0; setRotation(angle); //set the
尝试在 opencv 中使用 boundingRect() 函数时出现错误。给出的是点列表 lists = [] for match in enumerate(matches): lists.
我在使用以下代码时遇到了非常奇怪的问题。 extension String { func height(withConstrainedWidth width: CGFloat, fon
我在使用 QFontMetrics 的“boundingRect”函数时遇到问题,它没有返回正确的结果。 mfntArial = QFont("Arial", 12, QFont::Bold)
我有一些代码,我可以在其中绘制符号并将其附加到绘图中。现在我想知道是否有一个用符号自动创建的边界矩形,这样我就可以编写一些代码来选择符号,以便用户可以编辑它 - 例如选择它以便删除它。 我在 qwt_
我试图在用户移动 QGraphicsRectItem 时获取它的子类的 boundingRect() 。但是,随着矩形在场景中移动,boundingRect() 返回的矩形始终返回边界矩形的原始值。下
我有一个 class Edge : public QGraphicsItem,它实现了从一个节点到另一个节点的绘制箭头(下图)。 现在我需要添加在自己身上画箭头的功能 (arc)。 我无法绘制弧线,覆
我像这样计算 NSAttributedString 的高度。 let maxSize = NSSize(width: w, height: CGFloat.greatestFiniteMagnitud
我一直在尝试使用 QGraphicsItemGroup 来获取一组 QGraphicsItem* 的边界矩形。在我看来,当我将所有项目插入组中时,边界矩形已正确确定;但是如果我随后移动组中的项目,边界
QGraphicsItem::boundingRect () 是一个虚函数,所以我重写了它来处理我自己的一些东西,然后我发现它被重复调用,但我从未从我自己的代码中显式调用它。 谁在召唤它?表演或绘画之
我是 OpenCV 和 Python 的新手,我制作了一个程序来查找面积大于 500 的轮廓并将它们保存到新图像中我按照互联网上的建议使用了 boundingRect,它运行并完成了工作但我得到了图像
谷歌搜索 suggests that it should . 但是拖放机器人 example implementation (在父 Robot 对象上)建议不要: QRectF Robot::boun
我想实现一个 QGraphicsElement,它在圆角矩形内“按原样”绘制文本。 为了实现 QGraphicsElement 我需要实现 boundedRect 函数,所以我需要原样的多行消息的 b
当我尝试通过 NSString 函数 boundingRect 包装到盒子中并注意初始插入 (8,0,8,0) 时,我尝试使用以下方法计算文本的每一帧: let size = CGSize(width
在我的应用程序中,我在UITextView中的文本行下绘制自定义背景。为此,我使用boundingRect(forGlyphRange:in:)的NSLayoutManager方法。它适用于LTR语言
Kwadrat 类有什么问题?我有一个错误: Invalid new-expression of abstract class type 'Kwadrat' Kwadrat* kwadrat = ne
我正在使用 Qt 5.2,我目前正在尝试从 QTableView 打印一个表格,但是我在根据内容计算行高时遇到了这个问题。我现在得到的是下面的循环,它循环遍历 QTableView 行并使用 boun
我以为我可以使用下面的代码在它离开场景后删除任何项目,但事实并非如此。在尝试了不同的实现之后,我想我应该尝试另一种方法。有些 QGraphicsItems 实际上是在 boundingRect 之外开
我目前在 UITextField 上有以下扩展来计算给定字符串的边界矩形。 func widthHeight(font: UIFont) -> CGRect { let constraintR
我已经尝试了多种方法来围绕minAreaRect()创建boundingRect(),但是我一直遇到错误。我可以简单地使用原始轮廓,但是,这是要理解为什么与cv2.isContourConvex()和
我是一名优秀的程序员,十分优秀!