Swift 3 - NSString.draw(in:rect,withAttributes :) - 未在预期点绘制文本

时间:2017-08-09 01:17:26

标签: ios swift3 nsstring

开始这个非常有帮助的Stackoverflow post,我已经能够成功地将文字绘制到全屏图像上(我用预先设定的短字符串标记图像,例如, “垃圾”)。但是,文本没有出现在我想要的位置,而是以用户点击的确切点为中心。这是我的代码,基于上面的帖子中的一些代码,但更新为Swift3 -

    func addTextToImage(text: NSString, inImage: UIImage, atPoint:CGPoint)     -> UIImage{

    // Setup the font specific variables
    let textColor: UIColor = UIColor.red
    let textFont: UIFont = UIFont(name: "Helvetica Bold", size: 80)!

    //Setups up the font attributes that will be later used to dictate how the text should be drawn
    let textFontAttributes = [
        NSFontAttributeName: textFont,
        NSForegroundColorAttributeName: textColor,
        ]

    // Create bitmap based graphics context
    UIGraphicsBeginImageContextWithOptions(inImage.size, false, 0.0)

    //Put the image into a rectangle as large as the original image.
    inImage.draw(in: CGRect(x:0, y:0, width:inImage.size.width, height: inImage.size.height))

    // Create the rectangle where the text will be written
    let rect: CGRect = CGRect(x:atPoint.x, y:atPoint.y, width:inImage.size.width, height: inImage.size.height)

    // Draft the text in the rectangle
    text.draw(in: rect, withAttributes: textFontAttributes)

    // Get the image from the graphics context
    let newImag = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImag!
}

在上文中,atPoint是用户点击的位置。这是我想要绘制文本的地方。但是,文本始终写在图像的左上角。例如,在附图中,我已经在瀑布的一半处轻敲,因为这是我想要写入文本字符串“Trash”的地方。但相反,你可以看到它是在左上角写的。我已经尝试了很多东西,但无法得到解决方案。我感谢任何帮助。 enter image description here

TrashShouldBeInMiddleOfWaterfallButIsNot

1 个答案:

答案 0 :(得分:1)

您如何设置atPoint?如果你使用与屏幕相同的坐标空间,那将无法正常工作......这是我怀疑正在发生的事情。

假设您的图片为1000 x 2000,并且您在UIImageView 100 x 200中展示了该图片。如果您点击视图中的x: 50 y: 100(位于中心),然后将该点发送到您的函数,它将在图像的x: 50 y: 100处绘制文本 - 这将位于上方 - 左角,而不是在中心。

因此,您需要在调用函数之前将您的点从图像视图大小转换为实际图像大小。或者通过修改函数来处理它。

一个例子(不一定是最好的方法):

    // assume:
    //    View Size is 100 x 200
    //    Image Size is 1000 x 2000
    //    tapPoint is CGPoint(x: 50, y: 100)

    let xFactor = image.size.width / imageView.frame.size.width
    // xFactor now equals 10

    let yFactor = image.size.height / imageView.frame.size.height
    // yFactor now equals 10

    let convertedPoint = CGPoint(x: tapPoint.x * xFactor, y: tapPoint.y * yFactor)

convertedPoint现在等于CGPoint(x:500,y:1000),您可以在atPoint的通话中将其作为addTextToImage值发送。