如何解决scrollToItemAt方法停止滚动UICollectionView
我有两个UICollectionView
,只需按下一个按钮即可滚动
pictureCollectionView.scrollToItem(at: IndexPath(item: currentItem,section: 0),at: .centeredHorizontally,animated: true)
textCollectionView.scrollToItem(at: IndexPath(item: currentItem,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
,layoutIfNeeded
,但似乎无济于事
完整代码
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,animated: true)
textCollectionView.scrollToItem(at: IndexPath(item: currentItem,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",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,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)
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。