2014-10-01 48 views
0

我有一个关于在我的自定义TableViewCells中使用子视图的问题。在某些行,我想一个或多个图像,以及我与编程这样做:带有图像子视图性能的TableView问题

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,它涉及到一个图像的行,有一个小的“滞后”。通常情况下它是完全平滑的,但是当他试图加载这个单元格时,软件会有一个(可能是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() 

      } 

     } 

    } 

回答

3

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

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

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

+0

谢谢。这是我很久以前的一种方式。但是:我有大约7种不同的Layouts for Cells(这是一个包含大约100个问题的复杂表单) - 我可以动态地为每个单元添加通告和图像。如果我为例子创建通知(这也是一个带文本的UIButton),那么就没有滞后。仅限图像。但如果这是解决这个问题的唯一方法,而不会失去表现,我会这样做。 – derdida 2014-10-01 12:02:14

+0

所以你的意思是我应该在“prepareForReuse”中只隐藏和显示按钮,而不是从我的Cell子视图中删除它? – derdida 2014-10-01 12:04:11

+2

重复使用tableview单元格时添加或删除子视图会导致性能大幅下降。它可能在iPhone模拟器或最新的iPhone 6 Plus手持设备上运行速度很快,但在较旧的设备上运行速度会较慢。我并不完全了解你的单元格的布局和垂直约束,所以很难说你应该如何构建它们。为每个单元布局创建xib +不同的重用标识符(即使您有8个)将是一个好的第一步,至少看看隐藏/显示子视图而不是添加/删除子视图对您的性能有任何积极影响。 – Eugene 2014-10-01 12:20:48

0

你在哪里删除这些子视图?因为如果你不删除它们,当用户滚动时,你会继续向同一个单元格重复添加子视图,从而降低性能。

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

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

+0

谢谢你的回答。计数的图像是非常动态的 - 所以我能够在运行时创建新的图像。 Ill将图像保存在Core Data中(其中一个具有全尺寸和一个小缩略图,以防止缩小时的时间损失) - 您是否认为当我创建图像并将图像保存在UIImage Array中可以提升性能?这很容易(我想我应该试试) – derdida 2014-10-01 11:59:25