2016-11-20 2 views
0

Ich verwende die Antwort von SO POST, um Text auf einem Bild zu zeichnen. Das Problem, das ich habe, ist, wenn der CGPoint in der Nähe der rechten Kante des Bildes eingestellt ist, erstreckt sich der Text aus dem Bild. Ich versuche, einen Weg zu finden, nach links anstatt nach rechts vom CGPoint zu zeichnen oder irgendwie die Größe in Punkten des Textes zu berechnen, der gezeichnet wird, und dann den Zeichenpunkt zu verschieben, um diese Größe zu berücksichtigen.Text auf Bild zeichnen aus dem Bild

Hier ist der Code, den ich verwende.

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

    let color = UserDefaults.standard.colorForKey(key: "color")! 
    let font = UserDefaults.standard.value(forKey: "font") as! String 
    let size = UserDefaults.standard.value(forKey: "size") as! Int 
    let fontAndSize = UIFont(name: font, size: CGFloat(size))! 

    let scale = UIScreen.main.scale 
    UIGraphicsBeginImageContextWithOptions(image.size, false, scale) 

    let textFontAttributes = [ 
     NSFontAttributeName: fontAndSize, 
     NSForegroundColorAttributeName: color, 
     ] as [String : Any] 
    image.draw(in: CGRect(origin: CGPoint.zero, size: image.size)) 

    let rect = CGRect(origin: point, size: image.size) 
    text.draw(in: rect, withAttributes: textFontAttributes) 

    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return newImage! 
    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    if let mediaType = info[UIImagePickerControllerMediaType] as? String { 
     if mediaType.isEqual((kUTTypeImage as String)) { 
     if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      let width = pickedImage.size.width 
      let height = pickedImage.size.height 
      // this puts the point in the bottom right of the image which then causes the text drawn to extend off of the image 
      let point = CGPoint(x: width - 20, y: height - 50) 
      let timestampText = getTimestampText() as NSString 
      let timestampImage = textToImage(drawText: timestampText, inImage: pickedImage, atPoint: point) 
      if newMedia { 
      UIImageWriteToSavedPhotosAlbum(timestampImage, nil, nil, nil) 
      } 
     } 

Antwort

2

mit der Wenn Sie nach links ziehen möchten, können Sie in der Tat „die Größe in Punkten des Textes berechnen, wird gezeichnet werden, dann verschiebe den Zeichenpunkt, um diese Größe anzupassen "mit boundingRectWithSize:options:attributes:context:. Bsp .:

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

    let color = UserDefaults.standard.colorForKey(key: "color")! 
    let font = UserDefaults.standard.value(forKey: "font") as! String 
    let size = UserDefaults.standard.value(forKey: "size") as! Int 
    let fontAndSize = UIFont(name: font, size: CGFloat(size))! 

    let scale = UIScreen.main.scale 
    UIGraphicsBeginImageContextWithOptions(image.size, false, scale) 

    let textFontAttributes = [ 
     NSFontAttributeName: fontAndSize, 
     NSForegroundColorAttributeName: color, 
     ] as [String : Any] 

    // Calculate text size 
    let rectSize = text.boundingRect(with: CGSize(width:CGFloat(MAXFLOAT), height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: textFontAttributes, context: nil).size 

    // Subtract the text width from the x origin 
    let rect = CGRect(x:point.x-rectSize.width, y:point.y, width:rectSize.width, height: rectSize.height) 
    text.draw(in: rect, withAttributes: textFontAttributes) 
} 
+0

Danke! Das hat funktioniert. Ich versuche auch herauszufinden, wie man in der Mitte zeichnet. Dafür habe ich die Eigenschaft rect folgendermaßen geändert: let rect = CGRect (x: point.x- (rectSize.width/2), y: point.y, width: rectSize.width, height: rectSize.height). Dies gibt mir die korrekte x-Position, aber die Y-Position ist nicht genau zentriert, stattdessen liegt sie etwas unterhalb der Mitte des Bildes. Irgendwelche Vorschläge, warum es nicht genau zentriert ist? – chickenparm

+1

Nevermind! Ich änderte es in let rect = CGRect (x: point.x- (rectSize.width/2), y: point.y- (rectSize.height/2), Breite: rectSize.width, height: rectSize.height) und es funktioniert. – chickenparm

+0

@chickenparm Froh zu hören :) –

0

Sie können versuchen, den Text auf der rechten Seite das Ausrichten des NSParagraphStyleAttributeName

let textStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as NSMutableParagraphStyle 
textStyle.alignment = NSTextAlignment.rightTextAlignment 

let textFontAttributes = [ 
    NSFontAttributeName: fontAndSize, 
    NSForegroundColorAttributeName: color, 
    NSParagraphAttributeStyleName: textStyle 
    ] as [String : Any] 
+0

Als Sie für die Antwort. Ich konnte es mit deiner Antwort nicht so machen, wie ich es wollte, aber ich konnte es mit Lyndseys Antwort arbeiten lassen. – chickenparm