当前位置: 首页 > 知识库问答 >
问题:

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

杨志强
2023-03-14

我在UIScrollView中创建了几个UIView,它们根据我在高度和宽度文本字段中键入的值动态调整大小。UIView调整大小后,我将UIScrollView的内容保存为PDF数据。

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

例如:

1.5-

1.75-

每次更新约束之前,我都会检查常量值,它们是准确的。有人能解释一下为什么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个答案

华永新
2023-03-14

您不应该使用图层。渲染(在:)以渲染pdf。它总是第三个的原因是因为您必须在3x设备上(2x设备上是1/2,1x设备上是1),所以每个点有3个像素。当iOS将您的约束转换为像素时,它所能做的最好是四舍五入到最接近的三分之一,因为它选择的是整数像素。pdf可以具有更高的像素密度(或使用无限的矢量艺术)分辨率,因此不必使用图层。渲染(在:)是将栅格化向量层中的像素转储到PDF中,您实际上应该手动将内容绘制到PDF上下文中(即使用UIBezier curve、UIImage.draw等)。这将允许pdf捕获您拥有的任何光栅化图像的完整分辨率,并允许它捕获您使用的任何矢量,而不会将它们降级为受您碰巧所在的设备屏幕限制的光栅化像素。

 类似资料:
  • 在NSLayoutConstraint之前的时间里,这是可能的,因为保留了NSWindow的大小和状态—正在寻找一种优雅的方法来实现这一点 有没有办法在应用程序退出时保存,并在启动时再次恢复它们?

  • 问题内容: 为什么当我这样做: 我得到0,但是当我得到 我有价值吗? 我本来希望更高的精度除法返回更高的精度结果,为什么不是这种情况呢? 问题答案: 发生这种情况的原因是,对于数学运算,使用http://msdn.microsoft.com/zh- cn/library/ms190476.aspx#division中 找到的规则来计算得出的精度和小数位数 操作 e1 / e2 结果精度 p1-s1

  • 问题内容: 有时,我看到用十六进制而不是十进制数字定义的整数常量。这是我从GL10类中学到的一小部分: 显然,用而不是定义起来更简单,那么也许会有一些性能提升吗?我绝对不这么认为,因为那以后更改它应该是编译器的工作。 问题答案: 可能是为了组织和视觉上的清洁。基数16与二进制的关系比基数10更简单,因为在基数16中,每个数字正好对应于四个位。 请注意,在上述常量中,常量是如何与许多数字组合在一起的

  • 十六进制字面量,以关键字hex打头,后面紧跟用单或双引号包裹的字符串。如hex"001122ff"。在内部会被表示为二进制流。通过下面的例子来理解下是什么意思: pragma solidity ^0.4.0; contract HexLiteral{ function test() returns (string){ var a = hex"001122FF"; /

  • 我想知道如何将舞蹈方法的十进制结果包含到灯光方法中。例如,在这个程序中,如果我输入5F,十进制结果将是95。我希望95在light方法中显示为静态int变量,以便转换为二进制数。如果你能告诉我如何将十六进制数限制在2位数以内,那也会很有帮助。感谢阅读! } }

  • 本文向大家介绍Java 程序实现八进制转换为二进制,十进制,十六进制,包括了Java 程序实现八进制转换为二进制,十进制,十六进制的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个八进制数字。要将八进制转换为其他进制,例如二进制,十六进制等,Java代码如下: 示例 输出结果 一个名为Demo的类包含一个名为“base_convert”的函数。此函数将整数从源基解析为目标基,将其转换为字符串