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)