在UIButton的UIImage像素化与矢量图像

时间:2016-04-27 17:59:26

标签: ios swift uibutton uiimage

我试图用Swift在XCode的UIButton中放入一个图像。按钮是键盘扩展名,我试图输入“Globe”图标,就像iOS已经在内置键盘中一样。我以前使用地球表情符号和unicode(它会自动被作为表情符号拾取),但是看起来不太好。

所以现在,无论我使用哪个文件,我的图像都很模糊。到目前为止,我已经使用了22pt,200pt,600pt,svg和pdf的图像。没有运气。

这就是它的样子: Blurry image

这就是苹果公司的样子,一切都很敏锐:Sharp image

按钮的代码是:

//Set an image to fit inside a button
    let btn = nextKeyboardButton
    let image = UIImage(named: "globe")!
    var scaledImage = image
    var targetWidth : CGFloat = 0
    var targetHeight : CGFloat = 0
    let spacing : CGFloat = 10

    if(btn.frame.width < btn.frame.height){
        targetWidth = round(btn.frame.width - (spacing * 2))
        targetHeight = targetWidth
    } else {
        targetHeight = round(btn.frame.height - (spacing * 2))
        targetWidth = targetHeight
    }

    UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight))
    image.drawInRect(CGRectMake(0, 0, targetWidth, targetHeight))
    scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    btn.setImage(scaledImage, forState: .Normal)
    btn.setTitle("", forState: .Normal)
    btn.tintColor = UIColor.blackColor()

由于图标是1:1,我使用相同的宽度和高度。但我也需要相同的(工作)方法来处理另一个图标/图像。我用于标签栏的25,50和75pts的任何其他图标/图像看起来都很好而且清晰。如果是iPhone 4s或6 Plus,我使用的模拟器也无关紧要。

此外,可能还有其他解决方案吗?我试图使用另一种字体,这是所有地球仪,但XCode不会在编辑器中列出它。我也尝试在地球表情符号上绘画,使用unicode字符,但是它被作为表情符号拾取....所以..有什么帮助吗? :)

2 个答案:

答案 0 :(得分:3)

您的主要问题是UIGraphicsBeginImageContext不执行特定于设备的扩展。在@ 2x屏幕上,每个点由单个像素而不是2x2像素正方形表示;它看起来像是像素化的,因为它是。

切换到UIGraphicsBeginImageContextWithOptions(size, NO, 0)并提供足够大的应该会使其呈现清晰。

需要注意的另一个问题是,PDF资产在构建时而不是在应用程序中呈现为多个PNG文件分辨率,因此如果将22x22图像渲染到20x20(例如)会导致某种程度的模糊你不会期望在设备上渲染矢量图像。

答案 1 :(得分:0)

对于那些可能正在寻找类似问题解决方案的人,或者为图像添加按钮,我已经完成了一个完整的功能,使用@Brian Nickel建议的修复/帮助:)< / p>

该功能只需一个按钮,图像名称,颜色和图像周围的缩进间距。

func setImageForButton(_button : UIButton, _color : UIColor, _imageName : String, _spacing : CGFloat) {
    let btn = _button

    let image = UIImage(named: _imageName)!
    var scaledImage : UIImage

    var targetWidth : CGFloat
    var targetHeight : CGFloat
    let spacing : CGFloat = _spacing

    if(btn.frame.width < btn.frame.height){
        targetWidth = btn.frame.width - (spacing * 2)
        let scale = targetWidth / image.size.width
        targetHeight = round(image.size.height * scale)
        targetWidth = round(targetWidth)
    } else {
        targetHeight = btn.frame.height - (spacing * 2)
        let scale = targetHeight / image.size.height
        targetWidth = round(image.size.width * scale)
        targetHeight = round(targetHeight)
    }

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(targetWidth, targetHeight), false, 0)
    image.drawInRect(CGRectMake(0, 0, targetWidth, targetHeight))
    scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    btn.setImage(scaledImage, forState: .Normal)
    btn.setTitle("", forState: .Normal)
    btn.tintColor = _color
}