借鉴图像&为CGRect实现AspectFill。可以吗?

时间:2018-05-18 13:05:31

标签: ios swift swift4 cgrect

以下图片是来自iPad 9.7模拟器的屏幕抓取,显示覆盖在基础实时预览上的圆圈。 (实时摄像头视图不存在,因为它在模拟器上) 在任何类型的iPhone上,圆圈都会在屏幕边缘处剪掉,但在iPad上你可以看到剪辑。我确定这是一个AspectFit或AspectFill问题,但我找不到解决方案。不知何故,代码没有看到正确的iPad屏幕尺寸?

这是执行此操作的代码。首先是通话,然后是功能。这一切都很好,除了剪辑......

        //=======================================
        // draw the circles on the image then return
    imgOverlay.image = self.drawCirclesOnImage(fromImage: nil, targetSize: imgOverlay.bounds.size)

现在我们有两个绘制圆圈的函数。

    func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {

    let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: screenWidth, height: screenHeight))
    UIGraphicsBeginImageContextWithOptions(size, false, 0)
    color.setFill()
    UIRectFill(rect)
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return image
}

func drawCirclesOnImage(fromImage: UIImage? = nil, targetSize: CGSize) -> UIImage? {

    if fromImage == nil && targetSize == CGSize.zero {
        return nil
    }

    var tmpimg: UIImage?

    if targetSize == CGSize.zero {
        tmpimg = fromImage
    } else {
        tmpimg = getImageWithColor(color: UIColor.clear, size: targetSize)
    }
    guard let img = tmpimg else {
        return nil
    }
    let imageSize = img.size

    let scale: CGFloat = 0
    UIGraphicsBeginImageContextWithOptions(imageSize, false, scale)
    img.draw(at: CGPoint.zero)


    let w = imageSize.width
    //let w = screenWidth
    let h = imageSize.height
    //let h = screenHeight
    print("Width 1: \(w) Height 1: \(h)")

    let midX = imageSize.width / 2
    let midY = imageSize.height / 2
    //let midX = screenWidth / 2
    //let midY = screenHeight / 2

    // red circles - radius in %
    let circleRads = [ 0.07, 0.13, 0.17, 0.22, 0.29, 0.36, 0.40, 0.48, 0.60, 0.75 ]

    // center "dot" - radius is 1.5%
    var circlePath = UIBezierPath(arcCenter: CGPoint(x: midX,y: midY), radius: CGFloat(w * 0.010), startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true)

    UIColor.white.setFill()
    circlePath.stroke()
    circlePath.fill()

    lineColor = getLineColor(color: color)
    lineColor?.setStroke()


    for pct in circleRads {

        let rad = w * CGFloat(pct)

        circlePath = UIBezierPath(arcCenter: CGPoint(x: midX, y: midY), radius: CGFloat(rad), startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true)

        circlePath.lineWidth = 2.5
        circlePath.stroke()
    }

    // draw text time stamp on image
    let now = Date()
    let formatter = DateFormatter()
    formatter.timeZone = TimeZone.current
    formatter.dateFormat = "yyyy-MM-dd HH:mm"
    let dateString = formatter.string(from: now)
   // print(dateString)
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = .center
    let attrs = [NSAttributedStringKey.font: UIFont(name: "HelveticaNeue-Thin", size: 26)!, NSAttributedStringKey.paragraphStyle: paragraphStyle]
    let string = dateString
    string.draw(with: CGRect(x: 12, y: 38, width: 448, height: 448), options: .usesLineFragmentOrigin, attributes: attrs, context: nil)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage
}

enter image description here

0 个答案:

没有答案