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 上的绘制方法

如何在 PDFView 中移动 PDFPage 上的 PDFAnnotation?

如何在pdfkit swift中添加圆形注释?

swift: 可以同时下载的文件数

为多个变量创建和填充页面 Swift 4.0

在 Swift 中访问自定义 UITableViewCell UILabel 文本会引发错误