- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要在我的 UILabel 中找到我的角色位置(它有 ParagraphLineSpacing 和带多行的 AttributedText),
我有我的角色的索引,但现在我无法从我的索引中获取 X 和 Y 坐标。
我翻译成我的 Swift 3.1 代码
func boundingRect(forCharacterRange range: NSRange) -> CGRect {
let textStorage = NSTextStorage(attributedString: self.attributedText!)
let layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
let textContainer = NSTextContainer(size: bounds.size)
textContainer.lineFragmentPadding = 0
layoutManager.addTextContainer(textContainer)
var glyphRange: NSRange
// Convert the range for glyphs.
layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: glyphRange)
return layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
}
但是,不幸的是,我不能真正使用这段代码,因为 actualGlyphRange 询问 NSRangePointer,而不是 NSRange,所以我将翻译后的代码更改为
func boundingRect(forCharacterRange range: NSRange) -> CGRect {
let textStorage = NSTextStorage(attributedString: self.attributedText!)
let layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
let textContainer = NSTextContainer(size: bounds.size)
textContainer.lineFragmentPadding = 0
layoutManager.addTextContainer(textContainer)
//var glyphRange: NSRange
let a = MemoryLayout<NSRange>.size
let pointer:NSRangePointer = NSRangePointer.allocate(capacity: a)
layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: pointer)
return layoutManager.boundingRect(forGlyphRange: range, in: textContainer)
}
我不明白什么
var glyphRange: NSrange
用法,所以我删除了它,现在代码可以工作了,但结果是 60% 不准确,尤其是当我的角色位于第二行或第三行时。我搞砸了这里的翻译吗?或者有没有更好的方法来准确获取我的角色坐标?
我用
NSMakeRange(index, 1)
让我的参数定位一个特定的字符
=======已更新=======
我已经尝试自定义 UITextView 来访问它的布局管理器,但不幸的是,如果有 2 行或更多行,位置仍然不准确。 (仅当我的 textView 中只有 1 行时才准确)
class LyricTextView: UITextView {
func boundingRect(forCharacterRange range: NSRange) -> CGRect {
let inset = self.textContainerInset
let rect = self.layoutManager.boundingRect(forGlyphRange: range, in: textContainer).offsetBy(dx: inset.left, dy: inset.top)
return rect
}
}
我在这个新代码中遗漏了什么吗?快完成了
最佳答案
一个更简单的修复编译错误的方法是使用这个:
var glyphRange = NSRange()
layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: &glyphRange)
但是,当我尝试时,我也只能在第一行得到正确的文本矩形。
如果您可以使用 UITextView
,您可以访问其布局管理器和文本容器:
@IBOutlet var textView: UITextView!
...
let rect = textView!.layoutManager.boundingRect(
forGlyphRange: glyphRange, in: textView!.textContainer)
看来您还需要考虑 TextView 的文本容器插图,因此以下内容对我有用,可以在第二行获得文本的边界矩形:
let inset = textView!.textContainerInset
let rect = textView!.layoutManager.boundingRect(
forGlyphRange: glyphRange, in: textView!.textContainer)
.offsetBy(dx: inset.left, dy: inset.top)
如果有人找到适用于 UILabel
的解决方案,我会很感兴趣。
关于ios - 使用 attributedText 在自定义 UILabel 中定位字符坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44200232/
我有一个包含属性文本的 UITextView。我试图将它居中(因为文本是属性的,textView.TextAlignment 不起作用)。 我该怎么办?我试过这个: var attributes =
我需要在UITableViewCell中显示文字,需要设置tableView的高度。我使用以下方法动态计算行高。但实际高度却比实际高度高很多。 + (CGFloat)getquestionLabelH
在某些情况下,我必须使用 UITextView 而不是 UILabel(使链接属性可点击)。这是我的代码: let attributedString = NSMutableAttributed
我需要显示带有两种不同样式(不同颜色,部分文本加粗)的文本的 UILabel。使用 attributedText 属性很容易解决这个问题。 我的问题是文本可能会或可能不会超过我可以放入标签的长度。当使
我发现绘制边框是在 DTCoreText 中实现的。但是找不到任何关于如何做到这一点的资源。我收到一些 html 文本,对其进行修改,然后使用 DTAttributedTextContentView
Heloo..我是 ios、swift 和 xcode 的新手... 我在 swift 文件中有这样的逻辑: class ExpandableHeaderView: UITableViewHeader
我有一个表格 View 。 tableview 的目的是显示源自 UISearchBar 用户输入的搜索结果。 tableview 有一个自定义的 tableview 单元格,其中有一个标签和 UIT
我使用的是 Swift 4 和 Xcode 9.2。 我有一个 UILabel,在它们的 .attributedText 属性中我关联了一个 NSMutableAttributedString。事实上
这个问题在这里已经有了答案: Replace UITextViews text with attributed string (4 个答案) 关闭 6 年前。 我有一个 textView,我想给它一
我正在尝试将属性文本设置为基本 UITableViewCell 中“textlabel”的值。但是,单元格显示为空白!这是代码 UITableViewCell *cell = [tableView d
我的应用程序中有一个 View Controller ,用于调试以显示应用程序的一些内部结构(仅适用于本地 xcode 构建,应用程序商店版本没有此 Controller )。 在这个 Control
我需要在 TextView 中使用两种不同的字体,所以我在 textViewDidChange 中设置了属性文本。但是对于日文键盘,输入的字符是重复输入的。 它适用于英文键盘。当您使用普通文本而不是属
在 interfaceBuilder 中,我创建了一个简单的 UILabel。它里面有文本,我将它设置为 attributedText。我无法更改字体大小。每次我尝试更改字体并运行程序时,字体都保持不
我创建了一个可处理 RTF 文件的小型文本编辑器。该文件被读入用户可以编辑的 UITextView 中。 UITextView 使用 目前,当选择一定范围的文本并按下粗体按钮时,我会执行以下操作: N
我需要在我的 UILabel 中找到我的角色位置(它有 ParagraphLineSpacing 和带多行的 AttributedText), 我有我的角色的索引,但现在我无法从我的索引中获取 X 和
几个星期以来,我一直在断断续续地研究一个错误(因为它让我发疯),但我似乎无法深入了解它,所以我正在伸出援手希望有人能为我阐明这一点...... 我在 XIB 文件中有一个基本的 UITextView
我正在尝试将撤消 和重做 功能添加到我的UITextView 实现中。我使用的是 attributedText 而不仅仅是 UITextView 的 text 属性。我尝试使用 undoManager
你好我正在做一个 Twitter 应用程序,我想给主题标签、用户名和 URL 上色这是我的手机上的课 class TweetTableViewCell: UITableViewCell { var t
我有一个 UITextView,当键入某些字符时,它会被解析并更改其属性。文本未更改,仅更改描述文本格式的属性。 如果我对每个字符条目进行解析,我实际上是在抓取 text,创建具有正确格式的属性字符串
有什么方法可以判断 UILabel 是否使用 label.attributedText 或 label.text 属性设置了文本? 问题是当您设置 attributedText 时,text 也会更新
我是一名优秀的程序员,十分优秀!