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中。请提供有关使用的布局类型(约束或框架)的更多详细信息,以及完整的委托和流程布局实现代码。