使用renderInContext将UILabel添加到UIImage

时间:2015-02-15 15:14:57

标签: ios swift uiimageview uitextfield uilabel

我一直在努力寻找将UILabel及其背景颜色添加到UIImage的最佳方法。我需要在屏幕上显示标签的精确副本,如果这对你有意义的话。

我发现这样做的绝对最简单的方法是使用这样的renderInContext:

    UIGraphicsBeginImageContext(self.view.bounds.size)
    self.view.layer.renderInContext(UIGraphicsGetCurrentContext())
    let resultingImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
    self.imageViewer.image = resultingImage
    UIGraphicsEndImageContext()

但是这会使得到的图像像素化。我也知道你可以像这样使用写文字:

func addTextToImage(image:UIImage, text:NSString, pointof: CGPoint) -> UIImage{

    let font:UIFont = UIFont.boldSystemFontOfSize(14)
    let color: UIColor = UIColor.whiteColor()
    let attributeDict:NSDictionary = [NSFontAttributeName : font, NSForegroundColorAttributeName : color]

    UIGraphicsBeginImageContext(image.size)
    image.drawInRect(CGRectMake(0, 0, image.size.width, image.size.height))

    let rect: CGRect = CGRectMake(pointof.x, pointof.y, image.size.width, image.size.height)


    text.drawInRect(CGRectIntegral(rect), withAttributes:attributeDict as [NSObject : AnyObject])

    let contxt:CGContextRef = UIGraphicsGetCurrentContext()

    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

但我认为这是一种“杂乱”的方式,特别是因为某些原因的字体大小与标签中的字体大小不匹配。

所以我的问题如下:有没有办法让我使用第一种方法得到的图像更少像素化?或者有没有更简单的方法来实现我想要的效果?

我想要这个的原因是因为我有一个UITextField,我在图像上写文字,但我想将标签添加到图像比文本字段更容易。

有关如何实现这一目标的任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

您没有将比例因子纳入帐户。使用

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size,YES,0.0)

而不是

UIGraphicsBeginImageContext(self.view.bounds.size)

后者假设比例因子为1,这几乎不再是这种情况,因为所有当前设备都有视网膜显示。

使用比真实比例更小的比例因子会导致较小的图像在视网膜屏幕上显示时看起来像素化。