Сегодня я нашел странную ошибку. Вот гифка
И для хорошей меры изображение показывает это ясно.
Как вы можете видеть, UICollectionView
в topViewController
получает странное изменчивое поведение смещения перед тем, как перейти к следующему контроллеру представления.
Я подозреваю, что проблема может заключаться в пользовательском представлении UINavigationController
, в котором представлены горизонтальные карты, с которых я нажимаю.
Вот пользовательский код того, как это происходит. Глюки контроллера вида - это просто обычный navigationController?.pushViewController(viewController, animated: true)
, выдвинутый из контроллера вида сверху.
Фрагмент A - Презентация
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let viewModel = viewModel else { return }
// V This is a UINavigationController
let viewController = viewModel.getViewController(displayingOfferAt: indexPath.item)
viewController.modalPresentationStyle = .custom
viewController.transitioningDelegate = self
present(viewController, animated: true)
}
Фрагмент B - Переходящий делегат
extension StorefrontViewController: UIViewControllerTransitioningDelegate {
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
switch presented {
case is CashStore.FullNavigationController:
return CashStore.FullPresentationController(presentedViewController: presented, presenting: presenting)
default:
return nil
}
}
}
Фрагмент кода C - контроллер представления
class FullPresentationController: UIPresentationController {
// MARK: Outlets
private lazy var backgroundView: UIView = {
$0.isUserInteractionEnabled = true
$0.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.8016641695)
return $0
}(UIView())
// MARK: Overrides
override func containerViewDidLayoutSubviews() {
super.containerViewDidLayoutSubviews()
presentedView?.frame = frameOfPresentedViewInContainerView
backgroundView.frame = containerView!.bounds
}
override func presentationTransitionWillBegin() {
backgroundView.alpha = 0.0
containerView?.addSubview(backgroundView)
presentedViewController.transitionCoordinator?.animate(alongsideTransition: { context in
self.backgroundView.alpha = 1.0
})
}
override func dismissalTransitionWillBegin() {
presentedViewController.transitionCoordinator?.animate(alongsideTransition: { context in
self.backgroundView.alpha = 0.0
}, completion: { context in
self.backgroundView.removeFromSuperview()
})
}
// MARK: Actions
@objc func dismiss() {
presentingViewController.dismiss(animated: true)
}
}
class FullNavigationController: TiseNavigationController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .clear
}
}
Фрагмент D - Пользовательский макет представления коллекции для привязки
class ProductFlowLayout: UICollectionViewFlowLayout {
override init() {
super.init()
scrollDirection = .horizontal
}
required init?(coder _: NSCoder) {
return nil
}
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
guard let collectionView = collectionView else {
return super.targetContentOffset(forProposedContentOffset: proposedContentOffset, withScrollingVelocity: velocity)
}
var offsetAdjustment = CGFloat.greatestFiniteMagnitude
let horizontalOffset = proposedContentOffset.x + collectionView.contentInset.left
let targetRect = CGRect(x: proposedContentOffset.x, y: 0, width: collectionView.bounds.size.width, height: collectionView.bounds.size.height)
let layoutAttributesArray = super.layoutAttributesForElements(in: targetRect) ?? []
for attributes in layoutAttributesArray where fabsf(Float(attributes.frame.origin.x - horizontalOffset)) < fabsf(Float(offsetAdjustment)) {
offsetAdjustment = attributes.frame.origin.x - horizontalOffset
}
let flowDelegate = collectionView.delegate as? UICollectionViewDelegateFlowLayout
let leftInset = flowDelegate?.collectionView?(collectionView, layout: self, insetForSectionAt: 0).left ?? 0.0
let targetOffset = CGPoint(x: proposedContentOffset.x + offsetAdjustment - leftInset, y: proposedContentOffset.y)
return targetOffset
}
}
Я попытался отключить настройку смещения контента, которая ничего не изменила. Я также попытался отключить maskToBounds
как на контроллере представления с картами, так и на сборе, но безрезультатно. Извините за длинный вопрос, я надеюсь, что кто-то может помочь мне с этим странным сбоем!