【问题标题】:Swift swipe-able views快速滑动视图
【发布时间】:2014-10-31 23:00:39
【问题描述】:

我是 Swift 和 iOS 开发的新手,我希望设置一系列可以左右滑动的视图或“卡片”,下一张/上一张卡片保留在边缘以表明他们在那里。这是在 iOS App Store 预览中完成的:

到目前为止,我真正找到的只是这篇 Medium 文章:iOS Swift: Swipe View。但是,我不确定这是否是执行我上面要求的正确方法,而且我也不知道如何让下一张/上一张卡片在每次滑动时保持在边缘。

有没有人有任何实现这一点的提示?

【问题讨论】:

    标签: ios uiview swift


    【解决方案1】:

    最简单的方法是使用UICollectionViewUICollectionViewFlowLayoutUICollectionViewFlowLayout 是开箱即用的,非常强大。

    基本上你需要:

    1. UICollectionView 添加到您的视图控制器。
    2. 默认情况下,UICollectionView 会选择 Flow 布局。
    3. 配置UICollectionViewFlowLayout
      • 将滚动方向设置为水平
      • 定义项目大小和间距。请记住,您只需要一项即可完全可见;此外,左右两侧的空格也应该是可见的;此外,您还需要显示上一张和下一张牌,所以一些基本的数学等着您:)。让您的第一张和最后一张卡片正确居中的一个小技巧:您应该指定垂直剖面插图等于前一张卡片的可见宽度加上卡片之间的空间之和。

    上面的步骤应该足以让卡片视图垂直滚动。但它看起来不会很好!为了使它变得更好,您可能需要在用户端滚动后完美地居中最合适的卡片。 要实现粘性滚动,您需要使用以下UICollectionViewDelegate 方法:

    // compute collection view content offset in method bellow
    override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        ...
    }
    
    // compute targetContentOffset in method bellow 
    override func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        ...
    }
    

    ...最后一个提示:让集合视图减速在视图控制器的代码中看起来很快:

    self.collectionView?.decelerationRate = UIScrollViewDecelerationRateFast
    

    分页指示器:

    在您提供的示例中,有一个分页控件反映当前项目和总项目数。您需要手动添加UIPageControll;你可以在故事板中做到这一点。更新页面控件状态的最佳位置是:

    // method in UICollectionView delegate that you need to define.
    // update your paging info in method bellow.
    override func scrollViewDidScroll(scrollView: UIScrollView) {
        ...    
    }
    

    备注:

    我列出的处理滚动视图的方法由UICollectionViewDelegateUIScrollViewDelegate 继承。 UICollectionView 本身派生自 UIScrollViewDelegate

    【讨论】:

    • 这最终效果很好!谢谢!我不太了解的部分是粘性滚动 - 如果 你愿意并且想要详细说明它,我会非常感激。如果没有,没关系!无论如何,谢谢!
    • 我一直在阅读,似乎我可以使用targetContentOffset.memery.x 来查找滚动的位置......但我不确定如何使用该信息将最近的单元格移动到中心视图?
    • @Keenles 我想通了!我设置了一个collectionOffset = 0,然后在scrollViewWillEndDragging 上我检查了targetContentOffset.memory.x 是否大于collectionOffset + 255,如果它被设置为collectionOffset + 255..等等等等
    • @JodyHeavener 你能和我分享你为此编写的代码吗?我正在尝试为我的练习应用程序做同样的事情,但我无法完成。如果你能把代码分享给我,那就太好了。
    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多