将 MBProgressHUD 添加到 SDWebImage 和 UICollectionView
Add MBProgressHUD into SDWebImage and UICollectionView
我一直在尝试在单元格加载时显示进度 HUD,它应该会显示下载进度。所以我将代码放在 SDWebimage 进度块中以获取下载进度并将其传递到 MBProgress HUD 中以工作,但我不知道我在这里做错了什么!
let url = NSURL(string: (array[indexPath.row][0] as? String)!)
cell.imageView.sd_setImageWithURL(url, placeholderImage: nil, options: nil, progress: { (value1, value2) -> Void in
self.HUD = MBProgressHUD(view: self.mycollectionView)
self.view.addSubview(self.HUD)
self.HUD.mode = MBProgressHUDMode.AnnularDeterminate
self.HUD.delegate = self
self.HUD.show(true)
var x : Float = Float(value1)
self.HUD.progress = x
println(value1)
println(value2)
}, completed: block)
我也收到一条错误消息:'MBProgressHUD needs to be accessed on the main thread.'
我认为这个附件是在后台线程上调用的,你需要在
中包装有关代码的 HUD
dispatch_async(dispatch_get_main_queue()) {
// hud here
}
因为 UI 更改应在主线程上执行。
其次,我认为 enclosure 会被调用很多次(因为它正在显示进度)并且每次都会将 HUD 视图添加到子视图中,因此您也需要注意这一点。
您只能从主线程更新 UI,正如您的错误所说。下载图像是不在主线程上执行的异步操作,因此回调块无法更新 UI - 除非您在主线程上执行 UI 更新。为此,您必须使用 gcd 在主线程上执行代码,试试这个:
let url = NSURL(string: (array[indexPath.row][0] as? String)!)
cell.imageView.sd_setImageWithURL(url, placeholderImage: nil, options: nil, progress: { (value1, value2) -> Void in
dispatch_async(dispatch_get_main_queue(), {
self.HUD = MBProgressHUD(view: self.mycollectionView)
self.view.addSubview(self.HUD)
self.HUD.mode = MBProgressHUDMode.AnnularDeterminate
self.HUD.delegate = self
self.HUD.show(true)
var x : Float = Float(value1)
self.HUD.progress = x
})
println(value1)
println(value2)
}, completed: block)
如果您要重复使用单元格,那么您可以在 IB 中添加 activity 指示器,然后将其 class 设置为 HUDview 或您想要的指示器。
然后在 collectionView cellForItemAtIndexPath 方法中,当您创建单元格时添加 startAnimating 方法,然后在分配图像后检查完成关闭,您可以停止动画。
我一直在尝试在单元格加载时显示进度 HUD,它应该会显示下载进度。所以我将代码放在 SDWebimage 进度块中以获取下载进度并将其传递到 MBProgress HUD 中以工作,但我不知道我在这里做错了什么!
let url = NSURL(string: (array[indexPath.row][0] as? String)!)
cell.imageView.sd_setImageWithURL(url, placeholderImage: nil, options: nil, progress: { (value1, value2) -> Void in
self.HUD = MBProgressHUD(view: self.mycollectionView)
self.view.addSubview(self.HUD)
self.HUD.mode = MBProgressHUDMode.AnnularDeterminate
self.HUD.delegate = self
self.HUD.show(true)
var x : Float = Float(value1)
self.HUD.progress = x
println(value1)
println(value2)
}, completed: block)
我也收到一条错误消息:'MBProgressHUD needs to be accessed on the main thread.'
我认为这个附件是在后台线程上调用的,你需要在
中包装有关代码的 HUDdispatch_async(dispatch_get_main_queue()) {
// hud here
}
因为 UI 更改应在主线程上执行。
其次,我认为 enclosure 会被调用很多次(因为它正在显示进度)并且每次都会将 HUD 视图添加到子视图中,因此您也需要注意这一点。
您只能从主线程更新 UI,正如您的错误所说。下载图像是不在主线程上执行的异步操作,因此回调块无法更新 UI - 除非您在主线程上执行 UI 更新。为此,您必须使用 gcd 在主线程上执行代码,试试这个:
let url = NSURL(string: (array[indexPath.row][0] as? String)!)
cell.imageView.sd_setImageWithURL(url, placeholderImage: nil, options: nil, progress: { (value1, value2) -> Void in
dispatch_async(dispatch_get_main_queue(), {
self.HUD = MBProgressHUD(view: self.mycollectionView)
self.view.addSubview(self.HUD)
self.HUD.mode = MBProgressHUDMode.AnnularDeterminate
self.HUD.delegate = self
self.HUD.show(true)
var x : Float = Float(value1)
self.HUD.progress = x
})
println(value1)
println(value2)
}, completed: block)
如果您要重复使用单元格,那么您可以在 IB 中添加 activity 指示器,然后将其 class 设置为 HUDview 或您想要的指示器。 然后在 collectionView cellForItemAtIndexPath 方法中,当您创建单元格时添加 startAnimating 方法,然后在分配图像后检查完成关闭,您可以停止动画。