2016-01-20 55 views
1

對於我的問題可能沒有很好的解決方案,但我想問一下以防萬一。圖像和scrollView渲染使我的桌面視圖不連貫

我有一個tableview,其中每個單元格包含可變寬度的水平滾動視圖。每個單元格的滾動視圖的寬度取決於該單元格的圖像的數量和大小。一切工作都很好,但tableview的滾動不如以前那麼流暢。我使用Parse來檢索圖像(和pfquertableviewcontroller),但這個問題應該適用於一般的tableviews。

這裏是我的tableview代碼:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? { 

    if var cell:MainFeedTableViewCell? = tableView.dequeueReusableCellWithIdentifier(self.cellIdentifier) as? MainFeedTableViewCell{ 
    if(cell == nil) { 
     cell = NSBundle.mainBundle().loadNibNamed("MainFeedTableViewCell", owner: self, options: nil)[0] as? MainFeedTableViewCell 
    } 

    cell?.parseObject = object 
    return cell 
    } 
} 

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    if let c = (cell as? MainFeedTableViewCell){ 
     c.setUpObject()//this is where images are set 
    } 
} 


override func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    if let c = (cell as? MainFeedTableViewCell){ 
     c.resetObject() //this sets most of the properties to nil 
    } 
} 

這裏是我的細胞功能,其中圖像設置

func setUpObject(){ 

    //I left out several lines of code where label text is set from the parseObject that is set when the cell is created 

    //setting images **problems here** 

    if let numImages = self.parseObject?["numImages"] as? Int{ 
     self.newWidth1 = self.parseObject?["width1"] as? CGFloat 
     self.newWidth2 = self.parseObject?["width2"] as? CGFloat 
     self.newWidth3 = self.parseObject?["width3"] as? CGFloat 
     self.newWidth4 = self.parseObject?["width4"] as? CGFloat 
     self.newWidth5 = self.parseObject?["width5"] as? CGFloat 
     if numImages == 1{ 
      self.containerView = UIView(frame: CGRect(x: self.scrollView.frame.minX, y: self.scrollView.bounds.minY - 90, width: self.scrollView.frame.width, height: self.scrollView.frame.height)) 
      self.image1 = PFImageView(frame: CGRect(x: self.scrollView.frame.minX , y: self.scrollView.frame.minY, width: self.scrollView.frame.width, height: self.scrollView.frame.height)) 
      self.image1?.contentMode = UIViewContentMode.ScaleAspectFit 

      self.image1!.file = self.parseObject?["image"] as? PFFile 
      self.image1!.loadInBackground() 
      self.containerView!.addSubview(self.image1!) 

      self.scrollView.contentSize = self.containerView!.bounds.size 
      self.scrollView.addSubview(self.containerView!) 
     } 
     else if numImages == 2{ 
      if self.newWidth1 + self.newWidth2 < self.scrollView.frame.width{ 
       self.containerView = UIView(frame: CGRect(x: self.scrollView.frame.midX - (self.newWidth1 + self.newWidth2)/2, y: self.scrollView.bounds.minY - 90, width: (self.newWidth1 + self.newWidth2), height: self.scrollView.frame.height)) 
      } 
      else{ 
       self.containerView = UIView(frame: CGRect(x: self.scrollView.frame.minX, y: self.scrollView.bounds.minY - 90, width: (self.newWidth1 + self.newWidth2), height: self.scrollView.frame.height)) 
      } 
      self.image1 = PFImageView(frame: CGRect(x: self.scrollView.frame.minX , y: self.scrollView.frame.minY, width: self.newWidth1, height: self.scrollView.frame.height)) 

      self.image1!.file = self.parseObject?["image"] as? PFFile 
      self.image1!.loadInBackground() 
      self.containerView!.addSubview(self.image1!) 
      self.image2 = PFImageView(frame: CGRect(x: (self.scrollView.frame.minX + self.newWidth1), y: self.scrollView.frame.minY, width: self.newWidth2, height: self.scrollView.frame.height)) 

      self.image2!.file = self.parseObject?["image2"] as? PFFile 
      self.image2!.loadInBackground() 
      self.containerView!.addSubview(self.image2!) 
      self.subLayer = CALayer() 
      self.subLayer.backgroundColor = UIColor.whiteColor().CGColor 
      self.subLayer.frame = CGRect(x: self.newWidth1, y: self.scrollView.frame.minY, width: 1, height: self.scrollView.frame.height) 
      self.containerView!.layer.addSublayer(self.subLayer) 
      self.scrollView.contentSize = self.containerView!.bounds.size 
      self.scrollView.addSubview(self.containerView!) 
     } 
     //repeat similar code for cases where there are 3, 4, or 5 images 

有可能與動態調整滾動視圖大小的根本問題並及時將其添加到超視圖中,但我試圖按照設計師給我的設計模型。

下面是對細胞滾動視圖看起來像(在用細白線分開滾動視圖的每個圖像)

enter image description here

回答

0

刪除您willDisplayCell和didEndDisplayingCell。當你滾動並且你的setUpObject代碼會觸發,雖然不是很大,但會稍微阻塞主線程。在返回cellForRowAtIndexPath中的單元格之前,請將setUpObject()移至右側。

根據您有多少行和性能要求,您還可以調整viewController以提前下載所有圖像,並將它們傳遞給單元格,而不是將它們加載到單元格內。

+0

對不起,我沒有早點接受 - 我正在做其他事情幾天。無論如何,我的setUpObject()調用先前在cellForRowAtIndexPath中,但我根據別人的建議進行了更改。它把事情平滑一些以便將其切換回來,但它還遠沒有完美。有太多的行可以預加載所有的圖像,但是我可以一次做10-15行。 – LulzCow