Рисование на изображении и реализация AspectFill для CGRect.Это можно сделать? - PullRequest
0 голосов
/ 18 мая 2018

На следующем изображении показан снимок экрана симулятора 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

...