JiongXing / PhotoBrowser

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

加载网络图片reloadCellAtIndex方法触发三次问题 #197

Open ETmanwenhan opened 3 years ago

ETmanwenhan commented 3 years ago

相册只要一张图片,但是加载网络图片reloadCellAtIndex方法触发三次问题。导致一张图片同时下载三次哦。怎么解决该问题呢?

屏蔽JXPhotoBrowser中viewDidLoad方法中的两行代码,就只会重复调用两次,请问这个问题怎么只控制调用一次呢?:

//        view.setNeedsLayout()
//        view.layoutIfNeeded()
JiongXing commented 3 years ago

谢反馈,我找时间看下

ETmanwenhan commented 3 years ago

谢反馈,我找时间看下 问题解决了!!! 在JXPhotoBrowser中的viewDidLoad方法调用browserView.reloadData(),只会调用一次reloadCellAtIndexJXPhotoBrowserView的reloadItems方法中需要调用cell.layoutIfNeeded()强制更新Cell布局!丝滑动画也正常。感谢🙏

调整的代码如下:

JXPhotoBrowser.m

    open override func viewDidLoad() {
        super.viewDidLoad()

        automaticallyAdjustsScrollViewInsets = false
        hideNavigationBar(true)

        browserView.photoBrowser = self
        transitionAnimator.photoBrowser = self

        view.backgroundColor = .clear
        maskView.frame = view.bounds
        browserView.frame = view.bounds
        view.addSubview(maskView)
        view.addSubview(browserView)

        browserView.didChangedPageIndex = { [weak self] index in
            guard let `self` = self else { return }
            self.pageIndicator?.didChanged(pageIndex: index)
            self.didChangedPageIndex(index)
        }

        view.setNeedsLayout()
        view.layoutIfNeeded()

        self.reloadData()
    }

    open override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        maskView.frame = view.bounds
        browserView.frame = view.bounds
        pageIndicator?.reloadData(numberOfItems: numberOfItems(), pageIndex: pageIndex)
    }
JXPhotoBrowserView.m

    open override func layoutSubviews() {
        super.layoutSubviews()
        print("====>>>layoutSubviews...")
        if scrollDirection == .horizontal {
            scrollView.frame = CGRect(x: 0, y: 0, width: bounds.width + itemSpacing, height: bounds.height)
        } else {
            scrollView.frame = CGRect(x: 0, y: 0, width: bounds.width, height: bounds.height + itemSpacing)
        }
        // reloadData()
    }

       /// 刷新所有Cell的数据
    open func reloadItems() {
        visibleCells.forEach { [weak self] index, cell in
            guard let `self` = self else { return }
            self.reloadCellAtIndex((cell, index, self.pageIndex))
            cell.setNeedsLayout()
            cell.layoutIfNeeded() // 调用该方法强制更新Cell布局
        }
        if let cell = visibleCells[pageIndex] {
            cellWillAppear(cell, pageIndex)
        }
    }
TML007 commented 2 years ago

谢反馈,我找时间看下

不知道作者有时间修复这问题不?

ETmanwenhan commented 2 years ago

这是来自QQ邮箱的假期自动回复邮件。   您好,谢谢你联系我。我会尽快给您回复。

shywoody commented 1 year ago

相册只要一张图片,但是加载网络图片reloadCellAtIndex方法触发三次问题。导致一张图片同时下载三次哦。怎么解决该问题呢?

屏蔽JXPhotoBrowser中viewDidLoad方法中的两行代码,就只会重复调用两次,请问这个问题怎么只控制调用一次呢?:

//        view.setNeedsLayout()
//        view.layoutIfNeeded()

现在这个demo跑在iOS 15.5的模拟器上会出现滑动不到下一张图也无法滑动关闭, 楼主有遇到么?

ioslhf commented 8 months ago

谢反馈,我找时间看下

请问一下大佬,这个问题解决了吗