NSLayoutConstraints可以用十进制常量呈现吗?

时间:2019-04-09 18:30:48

标签: ios swift uiview pdf-generation nslayoutconstraint

我在UIScrollView内创建了多个UIView,这些UIView根据我在“高度”和“宽度”文本字段中键入的值来动态调整大小。调整UIView的大小后,我将UIScrollView的内容另存为PDF数据。

我发现PDF中UIView的尺寸(在Adobe Illustrator中测量时)总是四舍五入。

例如:

1.5-> 1.333

1.75-> 1.666

我每次在约束更新之前检查常量值,它们都是准确的。谁能解释一下为什么将UIViews渲染为PDF后尺寸不正确?

@IBAction func updateDimensions(_ sender: Any) {

        guard let length = NumberFormatter().number(from:
            lengthTextField.text ?? "") else { return }

        guard let width = NumberFormatter().number(from:
            widthTextField.text ?? "") else { return }

        guard let height = NumberFormatter().number(from:
            heightTextField.text ?? "") else { return }

        let flapHeight = CGFloat(truncating: width)/2

        let lengthFloat = CGFloat(truncating: length)
        let widthFloat = CGFloat(truncating: width)
        let heightFloat = CGFloat(truncating: height)

        UIView.animate(withDuration: 0.3) {
            self.faceAWidthConstraint.constant = lengthFloat
            self.faceAHeightConstraint.constant = heightFloat
            self.faceBWidthConstraint.constant = widthFloat
            self.faceA1HeightConstraint.constant = flapHeight
            self.view.layoutIfNeeded()
        }
    }

    func createPDFfrom(aView: UIView, saveToDocumentsWithFileName fileName: String)
    {
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil)
        UIGraphicsBeginPDFPage()

        guard let pdfContext = UIGraphicsGetCurrentContext() else { return }

        aView.layer.render(in: pdfContext)
        UIGraphicsEndPDFContext()

        if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
            let documentsFileName = documentDirectories + "/" + fileName
            debugPrint(documentsFileName)
            pdfData.write(toFile: documentsFileName, atomically: true)
        }
    }

1 个答案:

答案 0 :(得分:1)

您不应使用layer.render(in :)来呈现pdf。之所以总是三分之一,是因为您必须在3x设备上(在2x设备上为1/2,而在1x设备上仅为1),因此每个点有3个像素。当iOS将您的约束转换为像素时,最好的做法是将其舍入到最接近的三分之一,因为它选择的是整数像素。 pdf可以具有更高的像素密度(或使用无限的矢量艺术)分辨率,因此,与其使用layer.render(in:)(而不是将光栅化的矢量层中的像素转储到PDF中),您实际上应该将内容绘制到手动创建PDF上下文(即使用UIBezier曲线,UIImage.draw等)。这将使pdf能够捕获您所拥有的任何光栅化图像的全分辨率,并使其能够捕获您使用的任何矢量,而不会将其降级为恰好在设备屏幕上受到约束的光栅化像素。