Ios scrollToItemAt方法已停止滚动UICollectionView

Ios scrollToItemAt方法已停止滚动UICollectionView,ios,swift,uicollectionview,uikit,Ios,Swift,Uicollectionview,Uikit,我有两个UICollectionView,只需按一下按钮即可滚动 pictureCollectionView.scrollToItem(at: IndexPath(item: currentItem, section: 0), at: .centeredHorizontally, animated: true) textCollectionView.scrollToItem(at: IndexPath(item: currentItem, section: 0), at: .centeredHo

我有两个
UICollectionView
,只需按一下按钮即可滚动

pictureCollectionView.scrollToItem(at: IndexPath(item: currentItem, section: 0), at: .centeredHorizontally, animated: true)
textCollectionView.scrollToItem(at: IndexPath(item: currentItem, section: 0), at: .centeredHorizontally, animated: true)
他们的委托流布局设置如下

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    if collectionView === textCollectionView {
        return CGSize(width: textCollectionView.frame.width, height: textCollectionView.frame.height)
    } else {
        return CGSize(width: pictureCollectionView.frame.width, height: pictureCollectionView.frame.height)
    }
}
此代码用于滚动到正确的项目,但在某个点上刚刚停止工作。它们都停留在第一项上,即使
currentItem
正在更改并且
.scrollToItem
肯定正在被调用

我尝试了
DispatchQueue.main.async
layoutifneed
,但似乎没有任何帮助

完整代码

class OnboardingViewController: UIViewController {
    private var imageArray = [ #imageLiteral(resourceName: "Group 325"), #imageLiteral(resourceName: "Group 326"), #imageLiteral(resourceName: "Group 327")]
    private var textArray = [
        L10n.Onboarding.Array._1,
        L10n.Onboarding.Array._2,
        L10n.Onboarding.Array._3
    ]
    private var currentItem = 0
    private lazy var gradientLayer: CAGradientLayer = {
           let layer = CAGradientLayer()
           layer.colors = [
               //swiftlint:disable object_literal
             UIColor(red: 0.286, green: 0.301, blue: 0.321, alpha: 1).cgColor,
             UIColor(red: 0.05, green: 0.054, blue: 0.062, alpha: 1).cgColor
           ]
           layer.locations = [0, 1.5]
           layer.startPoint = CGPoint(x: 0.25, y: 0.5)
           layer.endPoint = CGPoint(x: 0.75, y: 0.5)
           layer.frame = view.layer.bounds
           return layer
       }()
    @IBOutlet private var skipButton: UIButton!
    @IBOutlet private var nextButton: UIButton!
    @IBOutlet private var pictureCollectionView: UICollectionView!
    @IBOutlet private var textCollectionView: UICollectionView!
    @IBOutlet private var pageControl: UIPageControl!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupCollectionViews()
        setupBackground()
        skipButton.setTitle(L10n.Global.skip, for: .normal)
        nextButton.setTitle(L10n.Global.next, for: .normal)
    }

    @IBAction private func nextButtonPressed(_ sender: UIButton) {
        currentItem += 1
        if currentItem >= 3 {
            let storyboard = UIStoryboard(name: "PasswordCreationViewController", bundle: nil)
            let passwordCreationViewController = storyboard.instantiateViewController(withIdentifier: "PasswordCreationViewController")
            passwordCreationViewController.modalPresentationStyle = .fullScreen
            present(passwordCreationViewController, animated: true)
            UserDefaults.standard.set(true, forKey: "ONBOARDING_SEEN")
            return
        }
        pageControl.currentPage = currentItem
        pictureCollectionView.scrollToItem(at: IndexPath(item: currentItem, section: 0), at: .centeredHorizontally, animated: true)
        textCollectionView.scrollToItem(at: IndexPath(item: currentItem, section: 0), at: .centeredHorizontally, animated: true)
    }

    @IBAction private func skipButtonPressed(_ sender: UIButton) {
        let storyboard = UIStoryboard(name: "PasswordCreationViewController", bundle: nil)
        let passwordCreationViewController = storyboard.instantiateViewController(withIdentifier: "PasswordCreationViewController")
        passwordCreationViewController.modalPresentationStyle = .fullScreen
        present(passwordCreationViewController, animated: true)
        UserDefaults.standard.set(true, forKey: "ONBOARDING_SEEN")
    }

    func setupCollectionViews() {
        pictureCollectionView.dataSource = self
        pictureCollectionView.delegate = self
        textCollectionView.dataSource = self
        textCollectionView.delegate = self
        textCollectionView.register(UINib(nibName: "OnboardingViewTextCell", bundle: nil), forCellWithReuseIdentifier: "OnboardingViewTextCell")
        pictureCollectionView.register(UINib(nibName: "OnboardingViewImageCell", bundle: nil), forCellWithReuseIdentifier: "OnboardingViewImageCell")
        textCollectionView.layoutIfNeeded()
        pictureCollectionView.layoutIfNeeded()
    }

    private func setupBackground() {
        if #available(iOS 13, *) {
            if traitCollection.userInterfaceStyle == .dark {
                if gradientLayer.superlayer == nil {
                    view.layer.insertSublayer(gradientLayer, at: 0)
                }
            }
        }
    }

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)

        if #available(iOS 13.0, *) {
            if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
                if traitCollection.userInterfaceStyle == .dark {
                   view.layer.insertSublayer(gradientLayer, at: 0)
                } else {
                    gradientLayer.removeFromSuperlayer()
                }
            }
        }
    }
}

// MARK: - UICollectionViewDataSource
extension OnboardingViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        3
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if collectionView == pictureCollectionView {
            guard let cell = pictureCollectionView.dequeueReusableCell(
                withReuseIdentifier: "OnboardingViewImageCell",
                for: indexPath
                ) as? OnboardingViewImageCell else {
                return UICollectionViewCell()
            }
            cell.setup(with: imageArray[indexPath.row])
            return cell
        } else {
            guard let cell = textCollectionView.dequeueReusableCell(
                withReuseIdentifier: "OnboardingViewTextCell",
                for: indexPath
                ) as? OnboardingViewTextCell else {
                return UICollectionViewCell()
            }
            cell.setup(with: textArray[indexPath.row])
            return cell
        }
    }
}

// MARK: - UICollectionViewDelegate
extension OnboardingViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        if collectionView === textCollectionView {
            return CGSize(width: textCollectionView.frame.width, height: textCollectionView.frame.height)
        } else {
            return CGSize(width: pictureCollectionView.frame.width, height: pictureCollectionView.frame.height)
        }
    }
}

问题是否可能发生在XCode 12 | ios14上?绝对没有。您可以尝试将它们移动到viewWillAppear()中吗?如果不在其中,则它们位于按钮按下的iAction中。请提供有关使用的布局类型(约束或框架)的更多详细信息,以及完整的委托和流程布局实现代码。