我有一个关于在自定义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()
}
}
}
答案 0 :(得分:4)
滞后很可能是由于为UIButton分配新内存,将其添加到单元格的contentView并在重复使用单元格时将图像加载到其中。这是一个问题。 另一个问题是,每次重复使用单元格时都会创建一个按钮。基本上,每次将单元格滚出可见范围并向后滚动时,您都会添加另一个带有另一个图像的按钮,这也会消耗内存和性能。
要使其正常工作,您需要创建一个自定义表格视图单元格,其中包含预渲染的最大图像(按钮)数量,并隐藏您不需要显示的图像。
不要在重复使用表格视图单元格时添加/删除子视图,隐藏并显示它们,它会更快。
答案 1 :(得分:0)
你在哪里删除这些子视图?因为如果您不删除它们,当用户滚动时,您将一遍又一遍地将子视图添加到同一个单元格,从而降低性能。
我的方法通常是在创建单元格而不是cellForRowAtIndexPath
时构建此类视图,但我猜你不能这样做,因为你不知道图像的数量。也就是说,您仍然可以制定一个策略,在创建单元格时添加这些子视图,然后根据您的模型重复使用。
另一个建议是在UIImage
之外同时创建cellForRowAtIndexPath
个对象。