Closed shen0607 closed 6 years ago
为何跳过高质图,直接要显示原图呢? 这里设计是不太合理,我写的可选其实不太准确,要原图的前提,是先要有高质图。 您的情况我觉得可以只使用highQualityUrlForIndex这个方法就行,不必用到rawUrlForIndex,暂先这样处理试试
因为 领导说 会有两个加载进度条,如果只是使用 高清图的话,就没有原图按钮了,
领导要的效果就是 类似 微信好友聊天那样,可以查看原图
为何跳过高质图,直接要显示原图呢? 这里设计是不太合理,我写的可选其实不太准确,要原图的前提,是先要有高质图。 您的情况我觉得可以只使用highQualityUrlForIndex这个方法就行,不必用到rawUrlForIndex,暂先这样处理试试
因为 领导说 会有两个加载进度条,如果只是使用 高清图的话,就没有原图按钮了,领导需要类似 微信聊天中的那个查看原图按钮, 如果我自己改代码的话,我要在哪个地方改?
两个方法,一是改代码,二是不改代码,只扩展:
先问下,你是不是有两种不同质量的url?如果是的话,可以这样:
/// 高清图
func photoBrowser(_ photoBrowser: PhotoBrowser, highQualityUrlForIndex index: Int) -> URL? {
return "非原图url"
}
/// 原图
func photoBrowser(_ photoBrowser: PhotoBrowser, rawUrlForIndex index: Int) -> URL? {
return "原图url"
}
是的 我就是 这样放的
这样放都不行吗,不应该啊
不可以,我现在的 缩略图和高清图是同个地址,原图一个地址。方便加你QQ么?
我还是没看出问题,这周末我重构一下这里,qq很少上
如果你有demo复现问题就好了,我可以帮你改好代码
主要的代码如下: // MARK: - <#PhotoBrowserDelegate#> extension DynamicDetailViewController : PhotoBrowserDelegate {
func numberOfPhotos(in photoBrowser: PhotoBrowser) -> Int {
return self.pictureDatasource.count
}
func photoBrowser(_ photoBrowser: PhotoBrowser, thumbnailImageForIndex index: Int) -> UIImage? {
guard index < self.myView.picturesView.subviews.count else {
return nil
}
if let imgView = self.myView.picturesView.subviews[index] as? UIImageView {
return imgView.image
}
return nil
}
/// 高清图
func photoBrowser(_ photoBrowser: PhotoBrowser, highQualityUrlForIndex index: Int) -> URL? {
return URL(string: self.pictureDatasource[index].highQualityUrl ?? "")
}
/// 原图
func photoBrowser(_ photoBrowser: PhotoBrowser, rawUrlForIndex index: Int) -> URL? {
return URL(string: self.pictureDatasource[index].rawUrl ?? "")
}
}
原图按钮不出来,看看
URL(string: self.pictureDatasource[index].rawUrl ?? "")
是否为空?
周末撸了十几个小时代码重构这个库,还没撸完,明天再抽空搞了...
/// 高清图 func photoBrowser(_ photoBrowser: PhotoBrowser, highQualityUrlForIndex index: Int) -> URL? {
return nil
}
/// 原图
func photoBrowser(_ photoBrowser: PhotoBrowser, rawUrlForIndex index: Int) -> URL? {
return URL(string: self.pictureDatasource[index].rawUrl ?? "")
}
URL(string: self.pictureDatasource[index].rawUrl ?? "") 这个是非空的,这样写,原图按钮出不来
您好,新版已完成,有空请更新到2.0版本再看看
好的,我试试看
您好,现在最新版本的pod不下来
pod 下载失败?新建个项目测试看看?
@shen0607 刚刚发了个小版本,简化了转场动画方法,可以更新下
最新的2.0.2的可以pod下来了。现在有个问题,就是 我原来内存占用100M 然后 打开图片预览后,变成 208M了。就 2张图片。
最新的2.0.2的可以pod下来了。现在有个问题,就是 我原来内存占用100M 然后 打开图片预览后,变成 208M了。就 2张图片。 这个是模拟器会这样,真机 不会增加这么大的内存。 左右手势滑动有问题,我有4张图,从1滑动到4正常,从4滑动到1的时候,会一下子滑动两张,比如我在第四张滑动的时候,直接跳到第二张;貌似是最后一张的手势向右滑动有问题。
滑动的问题,我重现不了。快速滑也只滑一张而已,要怎么操作?
你是跑我的例子项目,内存200M吗?
Kingfisher框架加载那个gif图,很占内存。Kinfisher是会对图片做内存缓存的。如果对内存有严格要求,只能自己遵循PhotoLoader
协议,实现一个图片加载器传进来了
是我自己的,如果换成 SDWebview应该没问题吧
是我自己的,如果换成 SDWebview应该没问题吧
滑动的问题,不需要快速滑动。我描述的再详细一些:首先图片要大于等于3张,然后滑动到最后一张图片之后,无法继续滑动了,然后往回滑动,第一次会 跳过一张(比如,总共3张,会从第3张直接到第1张,总共5张,会从第5张直接到第3张),只有最后一张的滑动才会这样,其他的正常。
我没有重现呢,你跑项目例子也会这样吗?
Demo的话 我倒是没注意,是我的代码会这样,唯一的区别就是 高清图返回 nil。只有缩略图和原图
最容易复现的是,总共 3张,4张,5张图片的 时候 , 再第3张、第4张、第5张这三个顺序的图片最容易出现。
而且顺着滑动(1,2,3,4,5)动画也比较正常,逆着滑(5,4,3,2,1)动画比较不顺畅,会突然过渡到前面一张,或者直接给关闭了 图片浏览器。
复现:在你的demo中,RawImageViewController 里面的 最后一个方法改成如下就可以复现了:
override func openPhotoBrowser(with collectionView: UICollectionView, indexPath: IndexPath) { // 网图加载器 let loader = JXPhotoBrowser.KingfisherLoader() // 数据源 let dataSource = JXPhotoBrowser.RawImageDataSource(photoLoader: loader, numberOfItems: { () -> Int in return self.dataSource.count }, localImage: { index -> UIImage? in let cell = collectionView.cellForItem(at: indexPath) as? BaseCollectionViewCell return cell?.imageView.image }, autoloadURLString: { index -> String? in return self.dataSource[index].secondLevelUrl }) { index -> String? in return self.dataSource[index].thirdLevelUrl }
// 视图代理,实现了数字型页码指示器
let delegate = JXPhotoBrowser.NumberPageControlDelegate()
// 打开浏览器
JXPhotoBrowser(dataSource: dataSource, delegate: delegate).show(pageIndex: indexPath.item)
// 视图代理,实现了光点型页码指示器
// let delegate = JXPhotoBrowser.DefaultPageControlDelegate() // 转场动画 // let trans = JXPhotoBrowser.ZoomTransitioning(presentingStartView: { (, ) -> UIView? in // return collectionView.cellForItem(at: indexPath) // }, dismissingEndView: { (browser, _) -> UIView? in // let indexPath = IndexPath(item: browser.pageIndex, section: 0) // return collectionView.cellForItem(at: indexPath) // }) // 打开浏览器 // JXPhotoBrowser(dataSource: dataSource, delegate: delegate, transDelegate: trans) // .show(pageIndex: indexPath.item) }
`override func openPhotoBrowser(with collectionView: UICollectionView, indexPath: IndexPath) { // 网图加载器 let loader = JXPhotoBrowser.KingfisherLoader() // 数据源 let dataSource = JXPhotoBrowser.RawImageDataSource(photoLoader: loader, numberOfItems: { () -> Int in return self.dataSource.count }, localImage: { index -> UIImage? in let cell = collectionView.cellForItem(at: indexPath) as? BaseCollectionViewCell return cell?.imageView.image }, autoloadURLString: { index -> String? in return self.dataSource[index].secondLevelUrl }) { index -> String? in return self.dataSource[index].thirdLevelUrl }
// 视图代理,实现了数字型页码指示器
let delegate = JXPhotoBrowser.NumberPageControlDelegate()
// 打开浏览器
JXPhotoBrowser(dataSource: dataSource, delegate: delegate).show(pageIndex: indexPath.item)
// 视图代理,实现了光点型页码指示器
// let delegate = JXPhotoBrowser.DefaultPageControlDelegate() // 转场动画 // let trans = JXPhotoBrowser.ZoomTransitioning(presentingStartView: { (, ) -> UIView? in // return collectionView.cellForItem(at: indexPath) // }, dismissingEndView: { (browser, _) -> UIView? in // let indexPath = IndexPath(item: browser.pageIndex, section: 0) // return collectionView.cellForItem(at: indexPath) // }) // 打开浏览器 // JXPhotoBrowser(dataSource: dataSource, delegate: delegate, transDelegate: trans) // .show(pageIndex: indexPath.item) }`
修复了,v2.0.4版本已发布,更新看看
这个问题修复了!
/// 实现本方法以返回高质量图片的 url。可选 func photoBrowser(_ photoBrowser: PhotoBrowser, highQualityUrlForIndex index: Int) -> URL?
当第一个高质量图片没实现,只实现第二个 原图的,会导致没有原图按钮