使用URL中的图像显示UIImage

时间:2016-06-17 02:23:13

标签: ios xcode swift uiimage

我正在尝试显示项目列表。我的最终游戏是在我的IOS应用程序中显示来自一系列字符串的图像网格,这些字符串是URL和文件名。

我有一个CollectionView,它通过一个String文件名数组显示一个图像网格,并且有效:

阵列:

var tableImages: [String] = ["car.jpg", "bus.jpg", "plane.jpg"]

有效的代码:

cell.imgCell.image = UIImage(named: tableImages[indexPath.row])

我的下一步是找出通过String url数组显示图像网格的代码。这是我的问题。如何从网址显示图片?

数组:

var tableImages: [String] = ["http://www.hotelstmarie.com/wp-content/uploads/2014/12/HSM_Guest-Rooms_1500x750-06-02-2015.jpg", "http://media-cdn.tripadvisor.com/media/photo-s/03/4f/b0/58/aviva-by-kameel.jpg"]

有效的代码:

?

注意:

我已经检查过有关此问题的其他stackoverflow问题,但它们来自多年前,而转向swift已经使他们的答案过时了。

在我弄清楚如何显示网址图片之后,我只会制作一些if语句来识别网址或文件名以使其成为我的最终游戏,但这不是这个问题的一部分。

编辑1

围绕我的代码编码:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell: CollViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollViewCell
    cell.labelCell.text = tableData[indexPath.row]
    cell.imgCell.image = UIImage(named: tableImages[indexPath.row])
    return cell
}

编辑2

使用Alamofire:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell: CollViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollViewCell
    cell.labelCell.text = tableData[indexPath.row]
    let imageUrl = NSURL(string: tableImages[indexPath.row])
    cell.imgCell.af_setImageWithUrl(imageUrl, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(0.2))
    return cell
}

给出了这个错误:

Value of type 'UIImageView' has no member 'af_setImageWithUrl'

4 个答案:

答案 0 :(得分:2)

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell: CollViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollViewCell
    cell.labelCell.text = tableData[indexPath.row]

    if let url = NSURL(string: tableImages[indexPath.row])
    {
        if let data = NSData(contentsOfURL: url)
        {
            cell.imgCell.image = UIImage(data: data)
        }
    }

    return cell
}

答案 1 :(得分:1)

你会写:

if let url = NSURL(string: tableImages[indexPath.row]){
    let data = NSData(contentsOfURL: url)
    let image = UIImage(data: data!)
    cell.imgCell.image = image
}

虽然我建议使用现有的Swift库(如Kingfisher)来处理线程管理和缓存,因此您的应用程序在下载时不会内存不足或冻结图片。我目前使用SDWebImage

答案 2 :(得分:1)

您在此处设置图片的方式:

cell.imgCell.image = UIImage(named: tableImages[indexPath.row])

仅适用于项目中的本地图片,因此您的所有人都会尝试在本地查找与您的网址名称相同的图片。

虽然您可以手动加载图像,但最好的替代方法是使用图像加载库来处理常见问题,例如在视图被回收时避免旧图像加载到新图像之上。

在swift中,我使用了AlamofireImage,如此:

let imageUrl = NSURL(string: tableImages[indexPath.row])
cell.imgCell.af_setImageWithURL(imageUrl, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(0.2))

如您所见,此库使用swift的extensions,这极大地简化了它的api。

答案 3 :(得分:0)

我使用了AFNetworking库中的Swift版本的UIImageView + AFNetworking,你可以从github获得。非常好用。只需将文件放入项目中即可开始使用,如下所示:

   cell.imageView.setImageWithUrl(imageUrl!,placeHolderImage: UIImage(named: "placeholder"))