Метод collectionView (didSelectItemAt ...) не работает в iTunesConnect;Тем не менее, он работает на отладке - PullRequest
1 голос
/ 19 мая 2019

Я обновил свой Xcode до последней версии, в настоящее время это 10.2.1 (10E1001), и перенес свой проект из Swift 4 в Swift 5.

Это доставило мне некоторые неприятности, но, наконец, я построил свой проект, и он корректно работает с отладочной версией на моем iPhone.

После этого у меня было несколько проблем с архивированием моего проекта (возможно, это могло быть причиной)

Я загрузил его в App Store и после этого попробовал мое приложение на TestFlight. Плюс, по некоторым причинам немного кода в моем проекте работает неправильно

Кажется, что collectionView (didSelectItemAtIndexPath ...) не работает (но он отлично работает в XCode), и мой пользовательский макет collectionView тоже не работает (но также работает и в Debug).

Кажется, что верстка работает неправильно, но я не могу понять, в чем разница между отладочной версией и версией выпуска, кроме профиля обеспечения.

Я могу поделиться с вами большим количеством видео, кода, нужных вам, мне действительно нужно решить эту проблему.

Я не нашел в Интернете ничего подобного

Я взял этот код пользовательского макета отсюда https://codereview.stackexchange.com/questions/197017/page-and-center-uicollectionview-like-app-store

    class SnapPagingLayout: UICollectionViewFlowLayout {
    private var centerPosition = true
    private var peekWidth: CGFloat = 0
    private var indexOfCellBeforeDragging = 0

    convenience init(centerPosition: Bool = true, peekWidth: CGFloat = 40, spacing: CGFloat? = nil, inset: CGFloat? = nil) {
        self.init()

        self.scrollDirection = .horizontal
        self.centerPosition = centerPosition
        self.peekWidth = peekWidth

        if let spacing = spacing {
            self.minimumLineSpacing = spacing
        }

        if let inset = inset {
            self.sectionInset = UIEdgeInsets(top: 0, left: inset, bottom: 0, right: inset)
        }
    }

    override func prepare() {
        super.prepare()

        guard let collectionView = collectionView else { return }
        self.itemSize = calculateItemSize(from: collectionView.bounds.size)
    }

    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        guard let collectionView = collectionView,
            !newBounds.size.equalTo(collectionView.bounds.size) else {
                return false
        }

        itemSize = calculateItemSize(from: collectionView.bounds.size)
        return true
    }
}
private extension SnapPagingLayout {

    func calculateItemSize(from bounds: CGSize) -> CGSize {
        return CGSize(
            width: bounds.width - peekWidth * 2,
            height: (bounds.width - peekWidth * 2) / 1.77
        )
    }

    func indexOfMajorCell() -> Int {
        guard let collectionView = collectionView else { return 0 }

        let proportionalOffset = collectionView.contentOffset.x
            / (itemSize.width + minimumLineSpacing)

        return Int(round(proportionalOffset))
    }


}

extension SnapPagingLayout {

    func willBeginDragging() {
        indexOfCellBeforeDragging = indexOfMajorCell()
    }

    func willEndDragging(withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        guard let collectionView = collectionView else { return }

        // Stop scrollView sliding
        targetContentOffset.pointee = collectionView.contentOffset

        // Calculate where scrollView should snap to
        let indexOfMajorCell = self.indexOfMajorCell()

        guard let dataSourceCount = collectionView.dataSource?.collectionView(collectionView, numberOfItemsInSection: 0),
            dataSourceCount > 0 else {
                return
        }

        // Calculate conditions
        let swipeVelocityThreshold: CGFloat = 0.3 // After some trail and error
        let hasEnoughVelocityToSlideToTheNextCell = indexOfCellBeforeDragging + 1 < dataSourceCount && velocity.x > swipeVelocityThreshold
        let hasEnoughVelocityToSlideToThePreviousCell = indexOfCellBeforeDragging - 1 >= 0 && velocity.x < -swipeVelocityThreshold
        let majorCellIsTheCellBeforeDragging = indexOfMajorCell == indexOfCellBeforeDragging
        let didUseSwipeToSkipCell = majorCellIsTheCellBeforeDragging
            && (hasEnoughVelocityToSlideToTheNextCell || hasEnoughVelocityToSlideToThePreviousCell)

        guard didUseSwipeToSkipCell else {
            // Better way to scroll to a cell
            collectionView.scrollToItem(
                at: IndexPath(row: indexOfMajorCell, section: 0),
                at: centerPosition ? .centeredHorizontally : .left, // TODO: Left ignores inset
                animated: true
            )

            return
        }

        let snapToIndex = indexOfCellBeforeDragging + (hasEnoughVelocityToSlideToTheNextCell ? 1 : -1)
        var toValue = CGFloat(snapToIndex) * (itemSize.width + minimumLineSpacing)

        if centerPosition {
            // Back up a bit to center
            toValue = toValue - peekWidth + sectionInset.left
        }

        // Damping equal 1 => no oscillations => decay animation
        UIView.animate(
            withDuration: 0.3,
            delay: 0,
            usingSpringWithDamping: 1,
            initialSpringVelocity: velocity.x,
            options: .allowUserInteraction,
            animations: {
                collectionView.contentOffset = CGPoint(x: toValue, y: 0)
                collectionView.layoutIfNeeded()
        },
            completion: nil
        )
    }
}

Я хочу видеть страницу и центр коллекции, как в App Store. А также я хочу, чтобы мой didSelect-method работал правильно.

1 Ответ

0 голосов
/ 21 мая 2019

Это ошибка компилятора Swift 5.0, связанная с этими ссылками:

https://bugs.swift.org/browse/SR-10257

.

Обновление: Дальнейший поиск нашел временный ответ на этой ссылке в Stackoverflow

Вы можете обойти это, явно пометив его @objc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...