有关 网路上下载 图片 完后,tableivewcell 自动修正高度问题

我抓到一个方法,可以在网路上下载图片

 func loadImageFromUrl(url: String, view:UIImageView ,Location:String){
    
    // Create Url from string
    let url = NSURL(string: url)!
    // Download task:
    // - sharedSession = global NSURLCache, NSHTTPCookieStorage and NSURLCredentialStorage objects.
    let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (responseData, responseUrl, error) -> Void in
        // if responseData is not null...
        if let data = responseData{
            
            // execute in UI thread
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                view.image = UIImage(data: data)
                
                
            })
        }
        
        }
    }
    
    // Run task
    task.resume()
    
    //return UIImageView(image: tmpImg)
}

当然,这个func并不是即时的 ,因为下载要时间

那我的 tableview delegate

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
    let newsImageView = UIImageView(frame: CGRectMake(0, 0, frameWidth,140 ))
   //先给他一个临时的图片
    newsImageView.image = UIImage(named: "tnews")
    //之后再下载图片
    MyFunc.loadImageFromUrl(webImageURL + "news/" + (Data[indexPath.row]["iphoto"] as! String) ,view: newsImageView, Location: "newslist")
    let newTitlelabelFont = UIFont(name: "Heiti TC", size: 16)
    let newsTitleLabelHight = MyFunc.heightForView(Data[indexPath.row]["Subject"] as! String, font: newTitlelabelFont!, width: 16)
    let newsTitlelabel = UILabel(frame: CGRectMake(0,newsImageView.frame.height + 5 ,frameWidth,newsTitleLabelHight ))

    newsTitlelabel.numberOfLines = 0
    newsTitlelabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
    newsTitlelabel.font = newTitlelabelFont
    newsTitlelabel.text = Data[indexPath.row]["Subject"] as! String
    newsTitlelabel.textColor = MyFunc.colorHex("#ff69b4")
    newsTitlelabel.sizeToFit()
    cell.addSubview(newsImageView)
    cell.addSubview(newsTitlelabel)
    return cell
}

可是在这样的情况之下,我就没办法去自动修正高度了?像这样的东西应该要怎么作修正 (这种code应该有很多人写过吧....)

问2

也是类似以上的问的,我一样用上面的方式在网路上下载图片
我在下载完 json后,执行以下的func

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
    do {
        
        //JSON资料处理
        let dataDic = try NSJSONSerialization.JSONObjectWithData(NSData(contentsOfURL: location)!, options: NSJSONReadingOptions.MutableContainers)
        
        if dataDic.count <= 0 {
            MyFunc.showAlertWithMessage("没有资料")
            return
        }
        
        pushOtherView(dataDic as! NSMutableArray)
        
        
        
    } catch {
        MyFunc.showAlertWithMessage("网路错误!")
    }
}

func pushOtherView(Data:NSMutableArray){
    let tmpViewController:newsListViewController = newsListViewController()
           
    self.dismissViewControllerAnimated(true) { () -> Void in
        if self.transManager == nil {
            self.transManager = TransitionManager()
        }
        let transition = CATransition()
        transition.duration = 1
        transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault)
        transition.type = kCATransitionFade
        self.mainVC.navigationController?.view.layer.addAnimation(transition, forKey: nil)
        tmpViewController.refreshWithFrame(CGRectMake(0, 0, self.frameWidth, self.frameHeight), newListArray: Data)
        self.mainVC.navigationController!.pushViewController(tmpViewController, animated: true)
    }
    
}

因为 session 的 delegatge 是下载json完成后,才会执行以上的func
现我想要 把所有的图片(每一笔array就有一张图,以十笔来说好了) ,存在一个 [UIImageView]的array里

有没有方法,所有的图片都存在 array里后,再执pushOtherView

(我发现我的表达能力很差,不知道各位大大能不能了解我想表达的意思, 突然觉得我很 烦人)

阅读 3.1k
2 个回答

简单,提前将一部分图片下载好,然后计算好对应每个cell的高度,然后再reloadData
可以通过上拉刷新,预加载来下载其他部分的图片并计算好高度,数组形式缓存好

// 返回对应的高度
tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{
    //  在返回对应的cell高度
}

我在swift里面没接触过自动修复高度
PS:方法很多,要非常流畅的tableView要做的还很多
问题2,回调是异步的无法确定顺序

题主问题一的关键在于 reloadData, 异步加载好之后在完成后调用的闭包里面调用tableview.reloadData()刷新一下数据就可以了.
不过要注意的是,如果比如载入图片之前比之后cell数量多,当你滑到比如第10个cell了,然而刷出来只有5个cell,程序可能会崩溃了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进