TableView与Image SubView性能问题

时间:2014-10-01 11:37:12

标签: ios uitableview swift

我有一个关于在自定义TableViewCells中使用subView的问题。在某些行上,我想要一个或多个图像,我正在以编程方式执行此操作:

func addImageToCell(image: UIImage, initialYCoordinate: CGFloat, initialHeight: CGFloat, initialXCoordinate: CGFloat,imageUUID: String) {
    imageButton = UIButton.buttonWithType(UIButtonType.Custom) as? UIButton
    .....
    imageButton!.addTarget(formVC, action: "imageButtonPressed:", forControlEvents: .TouchUpInside)
    self.contentView.addSubview(imageButton!)
}

工作正常。但是,当我滚动我的TableView并且它带有一个Image的行时,会出现一个小的"滞后"。通常它是完全平滑的,但是当他试图加载这个单元时,软件中有一个(可能是0,1秒)延迟。

有没有更好的方法以编程方式执行此操作而没有任何滞后?在从CoreData Fetch初始化UITableViewController时加载我的图像。

这是我的cellForRowAtIndexPath

if(cellObject.hasImages == true) {

  cell.qIndex = indexPath.row

  var initialXCoordinate:CGFloat = 344.0

  let questionImages = formImages[cellObject.qIndex] as [String: Images]!

  for (key,image) in questionImages {

       let thumbnailImage = UIImage(data: image.image)

       cell.addImageToCell(thumbnailImage, initialYCoordinate: 44.00 ,initialHeight: cellObject.rowheight + cellObject.noticeHeight!, initialXCoordinate: initialXCoordinate, imageUUID: image.imageUUID)

       initialXCoordinate += 130
  }

}

任何想法?提前致谢

编辑:我使用它来防止按钮重复使用:

 override func prepareForReuse() {

    super.prepareForReuse()

    if(self.reuseIdentifier != "CraftInit") {

        for item in self.contentView.subviews {

            if(item.isKindOfClass(UIButton)) {

                item.removeFromSuperview()

            }

        }

    }

2 个答案:

答案 0 :(得分:4)

滞后很可能是由于为UIButton分配新内存,将其添加到单元格的contentView并在重复使用单元格时将图像加载到其中。这是一个问题。 另一个问题是,每次重复使用单元格时都会创建一个按钮。基本上,每次将单元格滚出可见范围并向后滚动时,您都会添加另一个带有另一个图像的按钮,这也会消耗内存和性能。

要使其正常工作,您需要创建一个自定义表格视图单元格,其中包含预渲染的最大图像(按钮)数量,并隐藏您不需要显示的图像。

不要在重复使用表格视图单元格时添加/删除子视图,隐藏并显示它们,它会更快。

答案 1 :(得分:0)

你在哪里删除这些子视图?因为如果您不删除它们,当用户滚动时,您将一遍又一遍地将子视图添加到同一个单元格,从而降低性能。

我的方法通常是在创建单元格而不是cellForRowAtIndexPath时构建此类视图,但我猜你不能这样做,因为你不知道图像的数量。也就是说,您仍然可以制定一个策略,在创建单元格时添加这些子视图,然后根据您的模型重复使用。

另一个建议是在UIImage之外同时创建cellForRowAtIndexPath个对象。