我试图用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字符,但是它被作为表情符号拾取....所以..有什么帮助吗? :)
答案 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
}