图像和scrollView渲染使我的tableview起伏不定

时间:2016-01-20 16:37:07

标签: ios swift uitableview parse-platform uiscrollview

我的问题可能没有好的解决办法,但我想问一下以防万一。

我有一个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

动态调整scrollview的大小并及时将其添加到superview可能存在一个基本问题,但我正在尝试遵循设计师给我的设计模型。

这是单元格上的滚动视图的样子(滚动视图中的每个图像都用一条细白线隔开)

enter image description here

1 个答案:

答案 0 :(得分:0)

删除你的willDisplayCell和didEndDisplayingCell。滚动时会触发,你的setUpObject代码虽然不大,但会稍微阻塞主线程。而是在返回cellForRowAtIndexPath中的单元格之前将setUpObject()移到右边。

根据您拥有的行数和性能要求,您还可以调整viewController以提前下载所有图像并将其传递到单元格,而不是将它们加载到单元格内。