Swift 4 - PDFAnnotation 文本(或 UITextField)是文本的大小
Posted
技术标签:
【中文标题】Swift 4 - PDFAnnotation 文本(或 UITextField)是文本的大小【英文标题】:Swift 4 - PDFAnnotation text (or UITextField) to be the size of the text 【发布时间】:2019-07-19 14:49:42 【问题描述】:我创建了一个 PDFAnnotation 文本小部件,一切正常,它的多行,所以我想要做的是将这个注释的大小设置为文本的大小......这有意义吗?我该怎么做?
这是我的注释:
let page = pdfView.currentPage
textAnnotation = PDFAnnotation(bounds: CGRect(x: 300, y: 200, width: 600, height: 100), forType: PDFAnnotationSubtype(rawValue: PDFAnnotationSubtype.widget.rawValue), withProperties: nil)
textAnnotation.widgetFieldType = PDFAnnotationWidgetSubtype(rawValue: PDFAnnotationWidgetSubtype.text.rawValue)
textAnnotation.font = UIFont.systemFont(ofSize: 80)
textAnnotation.fontColor = .red
textAnnotation.isMultiline = true
textAnnotation.widgetStringValue = "Text Here"
page!.addAnnotation(textAnnotation)
如何使文本的大小与本机工具中的一样?或者我如何对 UITextField 执行此操作,因为我可能或多或少可以做同样的事情。
在这方面仍然一无所获......它超级难。
更新
仍然没有对此进行任何处理。但是在查看了原生 ios PDF Annotations 之后,它似乎并没有使文本字段的宽度变长,而是转到下一行并使文本区域的高度更大......我将我的 PDFAnnotation 设置为 isMultiline,但是当我转到下一行时,我看不到它,因为我的身高只有 100.0....那么如何转到下一行并增加文本区域的高度?
更新
我创建了自己的自定义 PDFAnnotation
class TextAnnotation: PDFAnnotation
var currentText: String?
override init(bounds: CGRect, forType annotationType: PDFAnnotationSubtype, withProperties properties: [AnyHashable : Any]?)
super.init(bounds: bounds, forType: annotationType, withProperties: properties)
self.widgetFieldType = PDFAnnotationWidgetSubtype(rawValue: PDFAnnotationWidgetSubtype.text.rawValue)
self.font = UIFont.systemFont(ofSize: 80)
self.isMultiline = true
self.widgetStringValue = "Text Here"
self.currentText = self.widgetStringValue!
override func draw(with box: PDFDisplayBox, in context: CGContext)
UIGraphicsPushContext(context)
context.saveGState()
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
let attributes: [NSAttributedString.Key: Any] = [
.paragraphStyle: paragraphStyle,
.font: UIFont.systemFont(ofSize: 80),
.foregroundColor: UIColor.red
]
widgetStringValue!.draw(in: pageBounds, withAttributes: attributes)
context.restoreGState()
UIGraphicsPopContext()
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
我注意到每次输入内容时都会调用 draw 方法,所以我尝试将 self.widgetStringValue 与变量 currentText 进行比较,但是当我尝试更改宽度时,如果它们不相等,它不会什么都不做。
也许我可以创建一个委托方法并在我的 ViewController 中调用它以再次删除/添加注释......或者尝试从那里更改边界。
【问题讨论】:
我不是 PDFKit 专家,所以我会问一下 UITextField:对于 UITextField,你到底想要什么?您有文本消息,并且您希望 UITextField 的大小与消息完全匹配。对吗? 是的,我希望文本的 PDFAnnotation 小部件在我尝试或换行时适合消息。 小部件与您的应用相关的用途是什么?拥有一些您想要/期望的行为与您不想要的行为的屏幕截图/视频将非常有帮助。 文本小部件的目的是为PDF添加文本,让用户编辑文本。 【参考方案1】:您可以使用简单的辅助函数来计算高度
/*
- Parameters:
- constrainedWidth: The max width of the label
- fontSize: Font size used for the UILabel
- text: The String used in the calculations
- Returns: CGFLoat which is the height of the label
*/
func estimatedHeight(constrainedWidth width: CGFloat, fontSize: CGFloat, text:String) -> CGFloat
let tempLabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: .greatestFiniteMagnitude))
tempLabel.text = text
tempLabel.lineBreakMode = .byWordWrapping
tempLabel.numberOfLines = 0
tempLabel.font.withSize(fontSize)
tempLabel.sizeToFit()
return tempLabel.frame.height
通过该函数,您将收到 UILabel 的高度,然后您可以简单地将任何填充或边距添加到所需的注释高度。
【讨论】:
我认为这不适用于 PDFAnnotation 小部件文本。 就像我现在开始想的那样,我无法访问注释内的 UITextField 为什么无法访问?我没有更改您的代码,而是为您提供了一种仅获取文本估计高度的方法。不要使用 UILabel,我只是根据您想要的文本宽度来估计容器的高度以上是关于Swift 4 - PDFAnnotation 文本(或 UITextField)是文本的大小的主要内容,如果未能解决你的问题,请参考以下文章
如何覆盖 PDFAnnotation IOS-PDFKIT 上的绘制方法