JiongXing / PhotoBrowser

Elegant photo browser in Swift. 图片与视频浏览器。
MIT License
1.32k stars 207 forks source link

原图按钮丢失 #92

Closed shen0607 closed 6 years ago

shen0607 commented 6 years ago

/// 实现本方法以返回高质量图片的 url。可选 func photoBrowser(_ photoBrowser: PhotoBrowser, highQualityUrlForIndex index: Int) -> URL?

/// 实现本方法以返回原图级质量的 url。当本代理方法有返回值时,自动显示查看原图按钮。可选
func photoBrowser(_ photoBrowser: PhotoBrowser, rawUrlForIndex index: Int) -> URL?

当第一个高质量图片没实现,只实现第二个 原图的,会导致没有原图按钮

JiongXing commented 6 years ago

为何跳过高质图,直接要显示原图呢? 这里设计是不太合理,我写的可选其实不太准确,要原图的前提,是先要有高质图。 您的情况我觉得可以只使用highQualityUrlForIndex这个方法就行,不必用到rawUrlForIndex,暂先这样处理试试

shen0607 commented 6 years ago

因为 领导说 会有两个加载进度条,如果只是使用 高清图的话,就没有原图按钮了,

shen0607 commented 6 years ago

领导要的效果就是 类似 微信好友聊天那样,可以查看原图

shen0607 commented 6 years ago

为何跳过高质图,直接要显示原图呢? 这里设计是不太合理,我写的可选其实不太准确,要原图的前提,是先要有高质图。 您的情况我觉得可以只使用highQualityUrlForIndex这个方法就行,不必用到rawUrlForIndex,暂先这样处理试试

因为 领导说 会有两个加载进度条,如果只是使用 高清图的话,就没有原图按钮了,领导需要类似 微信聊天中的那个查看原图按钮, 如果我自己改代码的话,我要在哪个地方改?

JiongXing commented 6 years ago

两个方法,一是改代码,二是不改代码,只扩展:

JiongXing commented 6 years ago

先问下,你是不是有两种不同质量的url?如果是的话,可以这样:

    /// 高清图
    func photoBrowser(_ photoBrowser: PhotoBrowser, highQualityUrlForIndex index: Int) -> URL? {
        return "非原图url"
    }

    /// 原图
    func photoBrowser(_ photoBrowser: PhotoBrowser, rawUrlForIndex index: Int) -> URL? {
        return "原图url"
    }
shen0607 commented 6 years ago

是的 我就是 这样放的

JiongXing commented 6 years ago

这样放都不行吗,不应该啊

shen0607 commented 6 years ago

不可以,我现在的 缩略图和高清图是同个地址,原图一个地址。方便加你QQ么?

JiongXing commented 6 years ago

我还是没看出问题,这周末我重构一下这里,qq很少上

JiongXing commented 6 years ago

如果你有demo复现问题就好了,我可以帮你改好代码

shen0607 commented 6 years ago

主要的代码如下: // 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 ?? "")
}

}

JiongXing commented 6 years ago

原图按钮不出来,看看

URL(string: self.pictureDatasource[index].rawUrl ?? "")

是否为空?

JiongXing commented 6 years ago

周末撸了十几个小时代码重构这个库,还没撸完,明天再抽空搞了...

shen0607 commented 6 years ago

/// 高清图 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 ?? "") 这个是非空的,这样写,原图按钮出不来

JiongXing commented 6 years ago

您好,新版已完成,有空请更新到2.0版本再看看

shen0607 commented 6 years ago

好的,我试试看

shen0607 commented 6 years ago

您好,现在最新版本的pod不下来

JiongXing commented 6 years ago

pod 下载失败?新建个项目测试看看?

JiongXing commented 6 years ago

@shen0607 刚刚发了个小版本,简化了转场动画方法,可以更新下

shen0607 commented 6 years ago

最新的2.0.2的可以pod下来了。现在有个问题,就是 我原来内存占用100M 然后 打开图片预览后,变成 208M了。就 2张图片。

shen0607 commented 6 years ago

最新的2.0.2的可以pod下来了。现在有个问题,就是 我原来内存占用100M 然后 打开图片预览后,变成 208M了。就 2张图片。 这个是模拟器会这样,真机 不会增加这么大的内存。 左右手势滑动有问题,我有4张图,从1滑动到4正常,从4滑动到1的时候,会一下子滑动两张,比如我在第四张滑动的时候,直接跳到第二张;貌似是最后一张的手势向右滑动有问题。

JiongXing commented 6 years ago

滑动的问题,我重现不了。快速滑也只滑一张而已,要怎么操作?

JiongXing commented 6 years ago

你是跑我的例子项目,内存200M吗? Kingfisher框架加载那个gif图,很占内存。Kinfisher是会对图片做内存缓存的。如果对内存有严格要求,只能自己遵循PhotoLoader协议,实现一个图片加载器传进来了

shen0607 commented 6 years ago

是我自己的,如果换成 SDWebview应该没问题吧

shen0607 commented 6 years ago

是我自己的,如果换成 SDWebview应该没问题吧

shen0607 commented 6 years ago

滑动的问题,不需要快速滑动。我描述的再详细一些:首先图片要大于等于3张,然后滑动到最后一张图片之后,无法继续滑动了,然后往回滑动,第一次会 跳过一张(比如,总共3张,会从第3张直接到第1张,总共5张,会从第5张直接到第3张),只有最后一张的滑动才会这样,其他的正常。

JiongXing commented 6 years ago

我没有重现呢,你跑项目例子也会这样吗?

shen0607 commented 6 years ago

Demo的话 我倒是没注意,是我的代码会这样,唯一的区别就是 高清图返回 nil。只有缩略图和原图

shen0607 commented 6 years ago

最容易复现的是,总共 3张,4张,5张图片的 时候 , 再第3张、第4张、第5张这三个顺序的图片最容易出现。

shen0607 commented 6 years ago

而且顺着滑动(1,2,3,4,5)动画也比较正常,逆着滑(5,4,3,2,1)动画比较不顺畅,会突然过渡到前面一张,或者直接给关闭了 图片浏览器。

shen0607 commented 6 years ago

复现:在你的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) }

shen0607 commented 6 years ago

`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) }`

JiongXing commented 6 years ago

修复了,v2.0.4版本已发布,更新看看

shen0607 commented 6 years ago

这个问题修复了!