Autolayout,异步加载图像进入uiimageview(Swift,xCode6)

时间:2015-05-11 12:19:06

标签: ios swift uiimageview autolayout

美好的一天!我有2个问题,希望你能帮助我。

1)我的应用程序中有新闻源,其中包含图像。 我正在使用Autolayout来动态细胞: http://i.stack.imgur.com/DGWua.png

我希望图像保持其比例并完全填充单元格的宽度(使用margins = 12)。 我设置了约束,单元格可自动恢复,但图片没有保存其比例:

http://i.stack.imgur.com/OSMfz.png

我做错了什么?

2)第二个问题,我异步加载图像,这是我的代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell: EventCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as EventCell
    var rowData: NSDictionary = tableData[indexPath.row] as NSDictionary
    cell.titleButton.setTitle(rowData["title"] as? String, forState: UIControlState.Normal)
    cell.titleButton.addTarget(self, action: "openWebSite:", forControlEvents: UIControlEvents.TouchUpInside)
    cell.titleButton.tag = indexPath.row
    cell.descriprionLabel.text = rowData["description"] as? String
    var urlString = rowData["image"] as String
    var image = imageCache[urlString]
    if( image == nil ) {
        var imgURL = NSURL(string: urlString)

        // Download an NSData representation of the image at the URL
        var request: NSURLRequest = NSURLRequest(URL: imgURL!)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
            if error == nil {
                image = UIImage(data: data) // data -> image
                // Store the image in to our cache
                self.imageCache[urlString] = image // save in our dictionary
                if let cellToUpdate : EventCell = tableView.cellForRowAtIndexPath(indexPath) as? EventCell {
                    self.table.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
                }
            }
            else {
                println("Error: \(error.localizedDescription)")
            }
        })
    } else {
        dispatch_async(dispatch_get_main_queue(), {
            if let cellToUpdate : EventCell = tableView.cellForRowAtIndexPath(indexPath) as? EventCell  {
                cellToUpdate.img.image = image
            }
        })
    }
    cell.selectionStyle = UITableViewCellSelectionStyle.None;
    cell.contentView.setNeedsLayout(); // autolayout bug solution
    cell.contentView.layoutIfNeeded(); // autolayout bug solution
    return cell
}

一切似乎都没问题,但UITableViewCell在加载图片时没有调整大小,我正在尝试在索引路径重新加载单元格。 有趣的时刻,如果我向下滚动然后再回到牢房,它将起作用。 我之前有过类似的错误,我修了它,读了这篇文章UITableView layout messing up on push segue and return. (iOS 8, Xcode beta 5, Swift),第三个答案。但它现在对我没有帮助。看起来我需要调用一些方法重新计算UITableViewCell,但我不明白。

2 个答案:

答案 0 :(得分:1)

第一个问题:将UIImageView视图模式从Scale更改为Fill to Aspect Fit(在storyboad中)

第二个问题:如果图像不是nil,则删除dispatch async并使代码看起来像这样:

if( image == nil ) {
...
}
else {
    cell.img.image = image       
}

答案 1 :(得分:0)

对于故事板中的第一个选择图像视图,然后单击图钉图标以设置自动布局约束并检查宽度和高度。 它将保持宽度和高度不变。