Объединить изображение и текст, создав другое изображение в Swift 4 - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь объединить 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 для объединения его с textField, у меня не получается.

Следуйте за моим кодом

   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
}

Позвольте мне показать вам несколько скриншотов моего приложения.

Сначала создается только изображение. enter image description here

enter image description here

enter image description here

Теперь, когда я пытаюсь объединить текст и изображение. enter image description here

Пожалуйста, посмотрите на область отладки.

Изображения созданы, но они не отображаются в tableView.

Что я делаю не так?

ОБНОВЛЕНИЕ ВОПРОСА

С кодом выше мой memedImage пуст. "Спасибо, Роб"

Итак, я изменил свой предыдущий 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 изменил свою позицию, он должен быть в центре.

enter image description here

С .draw не работает, но с layer.render работает почти хорошо.

1 Ответ

0 голосов
/ 30 января 2019

У меня почти не было помощи в этом вопросе, только небольшой намек моего друга Роба. Еще раз спасибо, Роб.

Вероятно, я узнал, как исправить проблему с позицией 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
}

Конечно, этот код можно оптимизировать, но он работал очень хорошо для меня.

...