1

我已将我的 Xcode 更新到最新版本,目前是 10.2.1(10E1001),并将我的项目从 Swift 4 迁移到 Swift 5。

这给我带来了一些麻烦,但最后我已经构建了我的项目,并且它可以在我的 iPhone 上的调试版本中正常工作。

之后我在归档我的项目时遇到了一些麻烦(也许这可能是一个原因)

我已经在 App Store 中上传了它,然后在 TestFlight 上尝试了我的应用程序。另外,由于某种原因,我的项目中很少有代码出错。

似乎collectionView( didSelectItemAtIndexPath...) 不起作用(但它在 Xcode 中完美运行)并且我的自定义布局collectionView也不起作用(但也适用于调试)。

似乎布局工作错误,但除了配置文件之外,我无法理解调试和发布版本之间的区别。

我可以根据您的需要与您分享更多视频、代码,我真的需要解决这个问题。

我在网上没有找到类似的东西

我从这里获取了自定义布局代码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工作正确。

4

1 回答 1

0

这是与此引用相关的 Swift 5.0 编译器的错误:

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

.

更新:进一步搜索在 Stackoverflow 上的此链接上找到了一个临时答案

您现在可以通过使用 @objc 显式标记它来解决它。

于 2019-05-21T03:48:42.750 回答