我试图合并一个UIImage和一个UITextField的文本来创建另一个图像,但是没有成功。
我的应用程序要做什么?还是应该这样?
基本上,它获取由方法快照创建的图像,将该图像与UITextField中的文本合并,创建另一个将被保存并显示在tableView中的图像。
但我很难做到。
当我只拍照片的时候一切都很好。遵循我的准则。

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first, let startPoint = startPoint else {return}
    let currentPoint = touch.location(in: imageView)
    let frame = rect(from: startPoint, to: currentPoint)

    rectShapeLayer.removeFromSuperlayer()


    if frame.size.width < 1{
        tfText.resignFirstResponder()
    } else {
        let memedImage = getImage(frame: frame, imageView: self.imageView)
        save(imageView: imageView, image: memedImage)
    }
}

func getImage(frame: CGRect, imageView: UIImageView) -> UIImage {

    let cropImage = imageView.snapshot(rect: frame, afterScreenUpdates: true)

    return cropImage

但是,当我尝试使用UIGraphicsBeginImageContextWithOptions将图像与文本字段合并时,我失败了。
遵循我的准则
   override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first, let startPoint = startPoint else {return}
    let currentPoint = touch.location(in: imageView)
    let frame = rect(from: startPoint, to: currentPoint)

    rectShapeLayer.removeFromSuperlayer()


    if frame.size.width < 1{
        tfText.resignFirstResponder()
    } else {
        let memedImage = getImage(frame: frame, imageView: self.imageView)
        save(imageView: imageView, image: memedImage)
    }
}

func getImage(frame: CGRect, imageView: UIImageView) -> UIImage {

    let cropImage = imageView.snapshot(rect: frame, afterScreenUpdates: true)

    UIGraphicsBeginImageContextWithOptions(cropImage.size, false, 0.0)

    cropImage.draw(in: frame)
    tfText.drawText(in: frame)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return newImage
}

让我给你们看一些我的应用程序的截图。
首先只创建图像。
swift - 合并图像和文本以快速创建另一个图像4-LMLPHP
swift - 合并图像和文本以快速创建另一个图像4-LMLPHP
swift - 合并图像和文本以快速创建另一个图像4-LMLPHP
现在当我尝试合并文本和图像时。
swift - 合并图像和文本以快速创建另一个图像4-LMLPHP
请看调试区。
图像已创建,但不会显示在tableView上。
我做错什么了?
更新问题
上面的代码是空的。”谢谢罗布”
因此,我将以前的getImage(:)更改为:
   func getANewImage(frame: CGRect, imageView: UIImageView, textField: UITextField) -> UIImage{

    let cropImage = imageView.snapshot(rect: frame, afterScreenUpdates: true)

    let newImageView = UIImageView(image: cropImage)

    UIGraphicsBeginImageContextWithOptions(newImageView.frame.size, false, 0.0)

    let context = UIGraphicsGetCurrentContext()!

    context.translateBy(x: newImageView.frame.origin.x, y: newImageView.frame.origin.y)
    newImageView.layer.render(in: context)
    textField.layer.render(in: context)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return newImage
}

这样我差点。。。我用textField创建了一个新图像,但是textField改变了它的位置,它应该在中间。
swift - 合并图像和文本以快速创建另一个图像4-LMLPHP
使用.draw不起作用,但是使用layer.render效果几乎很好。

最佳答案

我几乎并没有人帮我回答那个问题,只有一点点我朋友罗伯的暗示。再次感谢你,罗布。
很可能,我发现了如何解决TextField位置的问题,我想分享解决方案。

func getImage(frame: CGRect, imageView: UIImageView, textField: UITextField) -> UIImage{

    //Get the new image after snapshot method
    let cropImage = imageView.snapshot(rect: frame, afterScreenUpdates: true)

    //Create new imageView with the cropImage
    let newImageView = UIImageView(image: cropImage)

    //Origin point of the Snapshot Frame.
    let frameOriginX = frame.origin.x
    let frameOriginY = frame.origin.y

    UIGraphicsBeginImageContextWithOptions(newImageView.frame.size, false, cropImage.scale)
    let context = UIGraphicsGetCurrentContext()!

    //Render the "cropImage" in the CGContext
    newImageView.layer.render(in: context)

    //Position of the TextField
    let tf_X = textField.frame.origin.x - frameOriginX
    let tf_Y = textField.frame.origin.y - frameOriginY

    //Context Translate with TextField position
    context.translateBy(x: tf_X, y: tf_Y)

    //Render the "TextField" in the CGContext
    textField.layer.render(in: context)

    //Create newImage
    let newImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return newImage
}

当然这段代码是可以优化的,但对我来说效果很好。

关于swift - 合并图像和文本以快速创建另一个图像4,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54379910/

10-14 22:28
查看更多