Объединить UIImage с UILabel в один UIImage, Swift - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь «объединить» UIImage с UILabel в один UIImage, для этого я написал функцию, все работает отлично, за исключением того, что Label не добавляется в текущий графический контекст. Буду признателен за вашу помощь!

    func textToImage(drawText: String, inImage: UIImage, atPoint: CGPoint) -> UIImage{

    // Setup the image context using the passed image
    UIGraphicsBeginImageContext(inImage.size)

    // Put the image into a rectangle as large as the original image

    inImage.draw(in: CGRect(origin: CGPoint.zero, size: CGSize(width: inImage.size.width, height: inImage.size.height)))

    // Create a point within the space that is as bit as the image
    let rectPos = CGPoint(x: atPoint.x, y: atPoint.y)
    let rectSize = CGSize(width: inImage.size.width, height: inImage.size.height)
    let rect = CGRect(origin: rectPos, size: rectSize)

    // Draw the text into an image
    let label = UILabel()
    label.text = drawText
    label.textColor = .white
    label.font = UIFont(name: "Helvetica Bold", size: 12)!

    label.drawText(in: rect)
    // Create a new image out of the images we have created
    let newImage = UIGraphicsGetImageFromCurrentImageContext()

    // End the context now that we have the image we need
    UIGraphicsEndImageContext()

    //Pass the image back up to the caller
    return newImage!
}

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Хорошо, я понял: изображение было действительно высокого разрешения, поэтому текст был слишком маленьким, чтобы его увидеть.

0 голосов
/ 27 июня 2018

Кажется, проблема здесь UIGraphicsBeginImageContext(inImage.size) Контекст, который вы создаете, - это размер вашего изображения. Вам нужно создать контекст для размера Image + высота метки. Затем вы можете добавить метку соответствующим образом и сможете увидеть метку внутри добавленного изображения.

Также укажите рамку метки let label = UILabel().

Предположим, вы хотите добавить метку внизу изображения. Пусть размер изображения будет 300 * 400, и вы хотите поместить ярлык внизу.

Концепция заключается в создании контекста с высотой 400 + высота метки (предположим, 40). Затем вы устанавливаете рамку метки в y CGRect(0,imagesize.height,100,40).

Надеюсь, это поможет

0 голосов
/ 27 июня 2018

Проблема с вашим кодом в том, что UIKit (использование UILabel) пытается рисовать вещи в своем собственном контексте. Вам нужно нарисовать текст + изображение в том же контексте, чтобы получить желаемый результат.

Попробуйте получить полученное изображение:

func textToImage(drawText text: NSString, inImage image: UIImage) -> UIImage
{

    UIGraphicsBeginImageContext(image.size)
    image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))

    let font=UIFont(name: "Helvetica-Bold", size: 8)!

    let paraStyle=NSMutableParagraphStyle()
    paraStyle.alignment=NSTextAlignment.center

    let attributes = [NSAttributedStringKey.foregroundColor:UIColor.red, NSAttributedStringKey.font:font, NSAttributedStringKey.paragraphStyle:paraStyle]

    let height = font.lineHeight

    let y = (image.size.height-height) / 2

    let strRect = CGRect(x: 0, y: y, width: image.size.width, height: height)

    text.draw(in: strRect.integral, withAttributes: attributes)

    let result=UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return result!
}

@IBAction func touchTest(_ sender: Any)
{
    let button = sender as! UIButton
    let image = self.textToImage(drawText: "my text", inImage: UIImage.init(named: "circle")!)
    button.setBackgroundImage(image, for: UIControlState.normal)
}
0 голосов
/ 27 июня 2018

Вы уверены, что пытаетесь нарисовать этикетку в правильном положении? Прямоугольник, который вы вычисляете как CGRect(origin: CGPoint.zero, size: CGSize(width: inImage.size.width, height: inImage.size.height)), содержит atPoint?

...