swift 按钮图片太大
swift image for button is too big
我正在为这样的按钮设置图像:
let itemImageURL = "\(self.view.getServerPath())image?path=\(league.logo!)"
let url = NSURL(string: itemImageURL )
let data = NSData(contentsOfURL: url!)
button.setImage(UIImage(data: data!), forState: UIControlState.Normal)
它们出现在按钮文本之前,这正是我想要的。
但是我怎样才能把图片变小呢?
将图片调整为按钮大小,并将其添加为背景图片
func resizeImageWithAspect(image: UIImage,size: CGSize)->UIImage
{
let oldWidth = image.size.width;
let oldHeight = image.size.height;
let scaleFactor = (oldWidth > oldHeight) ? size.width / oldWidth : size.height / oldHeight;
let newHeight = oldHeight * scaleFactor;
let newWidth = oldWidth * scaleFactor;
let newSize = CGSizeMake(newWidth, newHeight);
if UIScreen.mainScreen().respondsToSelector(#selector(NSDecimalNumberBehaviors.scale)){
UIGraphicsBeginImageContextWithOptions(newSize,false,UIScreen.mainScreen().scale);
}
else
{
UIGraphicsBeginImageContext(newSize);
}
image.drawInRect(CGRectMake(0, 0, newSize.width, size.height));
let newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
使用:
button.setBackgroundImage(resizeImageWithAspect(UIImage(data: data!)!,size:button.bounds.size), forState: .Normal);
button.contentMode = UIViewContentMode.ScaleAspectFit;
button.clipsToBounds = true;
警告
在你写的代码中
let url = NSURL(string: itemImageURL )
let data = NSData(contentsOfURL: url!)
在 main thread
中这样做是一个非常糟糕的主意!看下一段代码:
let url = NSURL(string: "https://abrahampacana.files.wordpress.com/2013/10/quabbin-11.jpg")
print(NSDate().timeIntervalSince1970) //1463505118
let data = NSData(contentsOfURL: url!)
print(NSDate().timeIntervalSince1970) //1463505138
这次加载用了 20 秒
这是应用程序卡住的 20 秒,用户正在等待,但什么也没有发生,也没有任何响应。
你至少应该使用后台线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)) {
//this is background thread
let url = NSURL(string: "https://abrahampacana.files.wordpress.com/2013/10/quabbin-11.jpg")
let data = NSData(contentsOfURL: url!)
//now return to main thread to update the view
//UI should always update from main thread
dispatch_async(dispatch_get_main_queue()){
button.setImage(...)
}
}
另一个解决方案:使用NSURLSession
答案在 uiimage 的比例参数中:
button.setImage(UIImage(data: data!, scale: 3), forState: UIControlState.Normal)
我正在为这样的按钮设置图像:
let itemImageURL = "\(self.view.getServerPath())image?path=\(league.logo!)"
let url = NSURL(string: itemImageURL )
let data = NSData(contentsOfURL: url!)
button.setImage(UIImage(data: data!), forState: UIControlState.Normal)
它们出现在按钮文本之前,这正是我想要的。 但是我怎样才能把图片变小呢?
将图片调整为按钮大小,并将其添加为背景图片
func resizeImageWithAspect(image: UIImage,size: CGSize)->UIImage
{
let oldWidth = image.size.width;
let oldHeight = image.size.height;
let scaleFactor = (oldWidth > oldHeight) ? size.width / oldWidth : size.height / oldHeight;
let newHeight = oldHeight * scaleFactor;
let newWidth = oldWidth * scaleFactor;
let newSize = CGSizeMake(newWidth, newHeight);
if UIScreen.mainScreen().respondsToSelector(#selector(NSDecimalNumberBehaviors.scale)){
UIGraphicsBeginImageContextWithOptions(newSize,false,UIScreen.mainScreen().scale);
}
else
{
UIGraphicsBeginImageContext(newSize);
}
image.drawInRect(CGRectMake(0, 0, newSize.width, size.height));
let newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
使用:
button.setBackgroundImage(resizeImageWithAspect(UIImage(data: data!)!,size:button.bounds.size), forState: .Normal);
button.contentMode = UIViewContentMode.ScaleAspectFit;
button.clipsToBounds = true;
警告 在你写的代码中
let url = NSURL(string: itemImageURL )
let data = NSData(contentsOfURL: url!)
在 main thread
中这样做是一个非常糟糕的主意!看下一段代码:
let url = NSURL(string: "https://abrahampacana.files.wordpress.com/2013/10/quabbin-11.jpg")
print(NSDate().timeIntervalSince1970) //1463505118
let data = NSData(contentsOfURL: url!)
print(NSDate().timeIntervalSince1970) //1463505138
这次加载用了 20 秒
这是应用程序卡住的 20 秒,用户正在等待,但什么也没有发生,也没有任何响应。 你至少应该使用后台线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)) {
//this is background thread
let url = NSURL(string: "https://abrahampacana.files.wordpress.com/2013/10/quabbin-11.jpg")
let data = NSData(contentsOfURL: url!)
//now return to main thread to update the view
//UI should always update from main thread
dispatch_async(dispatch_get_main_queue()){
button.setImage(...)
}
}
另一个解决方案:使用NSURLSession
答案在 uiimage 的比例参数中:
button.setImage(UIImage(data: data!, scale: 3), forState: UIControlState.Normal)