ios - UIScrollView 流畅的自定义分页

标签 ios swift

我在 UIScrollView 中有两个(可能更多) View ,并且想使用它进行分页。当我尝试为 UIScrollView 使用默认分页选项时出现问题,因为 View 具有不同的宽度,因此无法正确分页。

所以我实现了一个有效的自定义分页代码。但是,当滚动速度较慢时,它不会按预期运行。 (它回到原来的位置,没有动画。)

这是我目前如何通过 UIScrollViewDelegate 进行自定义分页

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    if direction == 1{
        targetContentOffset.pointee.x = 0
    }else{
        targetContentOffset.pointee.x = 100
    }
}
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    if scrollView.panGestureRecognizer.translation(in: scrollView.superview).x > 0 {
        direction = 1
    }
    else {
        direction = 0
    }
}

我想要的: enter image description here 我有的: enter image description here

最佳答案

尝试下面的自定义 UIScrollView 类示例

import UIKit

public class BaseScrollViewController: UIViewController, UIScrollViewDelegate {

    public var leftVc: UIViewController!
    public var middleVc: UIViewController!
    public var rightVc: UIViewController!

    public var initialContentOffset = CGPoint() // scrollView initial offset
    public var maximumWidthFirstView : CGFloat = 0

    public var scrollView: UIScrollView!

    public class func containerViewWith(_ leftVC: UIViewController,
                                        middleVC: UIViewController,
                                        rightVC: UIViewController) -> BaseScrollViewViewController {
        let container = BaseScrollViewViewController()

        container.leftVc = leftVC
        container.middleVc = middleVC
        container.rightVc = rightVC
        return container
    }

    override public func viewDidLoad() {
        super.viewDidLoad()
        setupHorizontalScrollView()
    }

    func setupHorizontalScrollView() {
        scrollView = UIScrollView()
        scrollView.isPagingEnabled = true
        scrollView.showsHorizontalScrollIndicator = false
        scrollView.bounces = false

        let view = (
            x: self.view.bounds.origin.x,
            y: self.view.bounds.origin.y,
            width: self.view.bounds.width,
            height: self.view.bounds.height
        )

        scrollView.frame = CGRect(x: view.x,
                                  y: view.y,
                                  width: view.width,
                                  height: view.height
        )

        self.view.addSubview(scrollView)

        let scrollWidth  = 3 * view.width
        let scrollHeight  = view.height
        scrollView.contentSize = CGSize(width: scrollWidth, height: scrollHeight)

        leftVc.view.frame = CGRect(x: 0,
                                   y: 0,
                                   width: view.width,
                                   height: view.height
        )

        middleVc.view.frame = CGRect(x: view.width,
                                               y: 0,
                                               width: view.width,
                                               height: view.height
        )

        rightVc.view.frame = CGRect(x: 2 * view.width,
                                    y: 0,
                                    width: view.width,
                                    height: view.height
        )

        addChildViewController(leftVc)
        addChildViewController(middleVc)
        addChildViewController(rightVc)

        scrollView.addSubview(leftVc.view)
        scrollView.addSubview(middleVc.view)
        scrollView.addSubview(rightVc.view)

        leftVc.didMove(toParentViewController: self)
        middleVc.didMove(toParentViewController: self)
        rightVc.didMove(toParentViewController: self)

        scrollView.contentOffset.x = middleVc.view.frame.origin.x
        scrollView.delegate = self
    }


    public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        self.initialContentOffset = scrollView.contentOffset
    }

    public func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if maximumWidthFirstView != 0
        {
            if scrollView.contentOffset.x < maximumWidthFirstView
            {
                scrollView.isScrollEnabled = false
                let newOffset = CGPoint(x: maximumWidthFirstView, y: self.initialContentOffset.y)

                self.scrollView!.setContentOffset(newOffset, animated:  false)
                scrollView.isScrollEnabled = true

            }
        }

    }

}

BaseScrollViewController的使用

let left = FirstController.init()
let middle = MiddleController()
let right = RightController.init()

let container = BaseScrollViewController.containerViewWith(left,middleVC: middle,rightVC: right)
container.maximumWidthFirstView = 150

输出:

simulator screen shot 14-sep-2017 12 57 09 pm simulator screen shot 14-sep-2017 12 57 05 pm simulator screen shot 14-sep-2017 12 59 38 pm

GitHub 要点示例代码:https://gist.github.com/mspvirajpatel/58dac2fae0d3b4077a0cb6122def6570

关于ios - UIScrollView 流畅的自定义分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46138626/

相关文章:

ios - UIButton 没有在 ios7 上注册

ios - 带有 adjustsFontSizeToFitWidth 的多行 UILabel

javascript - 当我尝试在 native webview 中加载 https 网页时,它显示空白页面

iOS 始终有一个 'detail' 栏可用

swift - 调整我的 TableView 背景

ios - 使用位置管理器时,我的 Swift 应用程序耗电非常快

ios - [NSObject : AnyObject] ?' does not have a member named ' subscript' error in Xcode 6 beta 6

ios - TableView 以编程方式滚动到顶部后,UIRefreshControl 不会消失

ios - 如何在多个 View Controller 之间运行后台方法

ios - 在下次运行之前以后台模式关闭应用程序