如何在tableView上实现平滑滚动?(使用swift)
我现在正在使用TableView。除了tableview的平滑滚动之外,一切都很完美。下面是一个代码:如何在tableView上实现平滑滚动?(使用swift),swift,tableview,smooth,Swift,Tableview,Smooth,我现在正在使用TableView。除了tableview的平滑滚动之外,一切都很完美。下面是一个代码: CommonFunctions.loadImageAsyncAndVignette(link, imageView: cell.imageViewMiddleSize, article: arrayMainPage[indexPath.row], viewContr: self) 此函数用于异步加载图像,并使用CIFilters对其进行格式化 class func loadImageAsy
CommonFunctions.loadImageAsyncAndVignette(link, imageView: cell.imageViewMiddleSize, article: arrayMainPage[indexPath.row], viewContr: self)
此函数用于异步加载图像,并使用CIFilters对其进行格式化
class func loadImageAsyncAndVignette(stringURL: String, imageView: UIImageView, placeholder: UIImage! = nil, article: ArticleInfo, viewContr: UIViewController) {
imageView.image = placeholder
let url = NSURL(string: stringURL)
let requestedURL = NSURLRequest(URL: url!)
NSURLConnection.sendAsynchronousRequest(requestedURL, queue: NSOperationQueue.mainQueue()) {
response, data, error in
if error == nil {
if data != nil {
if let image = UIImage(data: data){
//imageView.image = UIImage(data: data)
let string = stringURL as String
article.updateDictionary(stringURL, image: image)
let qos = Int(QOS_CLASS_USER_INTERACTIVE.value)
dispatch_async(dispatch_get_global_queue(qos, 0), { () -> Void in
let imageEdited = CommonFunctions.vignettePhoto(image, imageViewLocal: imageView)
dispatch_async(dispatch_get_main_queue(), {
imageView.image = imageEdited
})
})
}
else{
println("image is nil")
}
}
}else{
let stringError = error.localizedDescription
CommonFunctions.showAlert("Ошибка", alertText: stringError, alertButtonText: "Закрыть", viewController: viewContr)
}
}
}
在函数loadImageAsyncandVigate中,我加载图像并格式化它。以下是格式化功能:
class func vignettePhoto(inputImage:UIImage, imageViewLocal: UIImageView)->UIImage{
var beginImage = CIImage(image: inputImage)
var vignette = CIFilter(name:"CIVignetteEffect")
vignette.setValue(beginImage, forKey:kCIInputImageKey)
let centerx = (imageViewLocal.frame.width)/2
let centery = (imageViewLocal.frame.height)*2
let center = CIVector(x: centerx, y: centery)
vignette.setValue(center, forKey:"inputCenter")
vignette.setValue( 0.5, forKey:"inputIntensity")
var radius = imageViewLocal.frame.height
vignette.setValue( radius, forKey:"inputRadius")
let newImage = UIImage(CIImage: vignette.outputImage)
return newImage!
}
我使用函数loadImageAsync
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
commonFunction.loadImageAsync....
}
一切正常。结果就是我想要的。但是我没有平滑的滚动表视图。在模拟器上,很难滚动。在设备上可以滚动,但无论如何我可以看到它有点跳跃(不平滑)。那么,有人能告诉我为什么滚动不顺畅吗?我使用了异步加载,但没有帮助 对代码的潜在修复 现在还不清楚为什么要在图像转换函数中插入这么多内容,因为目标(至少对我来说)似乎是将图像转换为样式化的照片。如果IMO函数只接收您想要转换的原始图像并返回转换后的图像,那么它将更加清晰。相反,您的函数是生成一个网络请求,然后转换图像,并将视图中的控制器作为参数。所有这些杂耍似乎会带来问题,但我的观点是 在您的常见函数小插曲照片中,我相信将此函数作为结束返回是最佳做法。如果这是一项计算密集型任务(根据您的问题,听起来是这样的),您可能应该将其视为一个网络请求,这意味着您应该在它自己的托管线程的后台线程或作为一个闭包来处理它 例如:
CommonFunctions.vignettePhoto(image:UIImage, imageViewLocal:UIImageView, completion:(imageView:UIImage?)->Void) {
... your conversion code ...
completion(imageView: theConvertedImage)
}
有一件事我不明白为什么要在这个函数中插入UIIMageView作为参数,因为您返回的是UIImage而不是UIIMageView。这似乎是多余的,但我看不到转换的完整代码,因此我无法确定它实际上是否不是有用的参数
然后,当您转到显示单元格示例时:
无需生成线程,因为它位于闭包中
CommonFunctions.vignettePhoto(image, imageView) { (theConvertedImage)
dispatch_async(dispatch_get_main_queue(), ) {
if let cellToUpdate = tableView.cellForIndex(indexPath) as? YourReusableTableCellClass {
imageView.image = theConvertedImage
}
}
}
但这只是一个建议。试试看它是否适合你。我已经在我的应用程序中多次使用这种方法,我得到了平滑的结果。您可能还想做的一件事是缓存图像转换的结果 你使用可重复使用的电池吗?你好,我不明白。你说可重复使用细胞是什么意思。我很确定问题在于图像的过滤。如果我评论过滤部分,滚动将变得平滑!尽管您正在调度到全局队列,但请注意,该队列可以生成的线程数量有限。我相信上限是64。因此,如果您与其他任务(如系统任务)共享此队列,并且取决于您转换的图像数量,您可能正在填充该队列,因为它是共享的,所以可能会停止其他任务。最好使用dispatch\u queue\u create为类本身创建一个队列。在您的CommonFunctions类中。通过这种方式,您可以控制自己的线程,并保证不会填满共享队列。您可以在CommonFunction中使用的另一种方法是Swift支持的完成块或闭包块。这将允许您在后台分派任务,然后在该函数完成任务时获取主队列并更新UI。