oligazar
3/24/2018 - 1:20 PM

PageViewController

class PageViewController: UIPageViewController {
    
    let imageStrings = [
        "https://firebasestorage.googleapis.com/v0/b/samuiplus-9d4b0.appspot.com/o/categories%2Foffers%2F-L7ZLum7uwZ7IAS1gP0n%2F-L7bM1f2aYGGwLNCDSNr%2Fimg_1518014663757.jpg?alt=media&token=34095b90-a53a-4413-8e67-f5633d154c1f",
        "https://firebasestorage.googleapis.com/v0/b/samuiplus-9d4b0.appspot.com/o/categories%2Foffers%2F-L7ZLum7uwZ7IAS1gP0n%2FJoWhuY49ArM.jpg?alt=media&token=88b07e59-04b4-4eb8-b57e-87adc99d9208",
        "https://firebasestorage.googleapis.com/v0/b/samuiplus-9d4b0.appspot.com/o/categories%2Foffers%2F-L85H0HTGT6s704K8qpt%2Fimages%20(62).jpg?alt=media&token=5b9c2537-2809-45a0-8a7d-48294ae974ca"
    ]
    var pageControll = UIPageControl()
    private var pendingIndex: Int?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        dataSource = self
        delegate = self
        view.backgroundColor = UIColor.black
        
        pageControll.numberOfPages = imageStrings.count
        pageControll.currentPage = 0
        view.addSubview(pageControll)
        
        var controllers: [UIViewController] = []
        if (imageStrings.isNotEmpty) {
            let controller = FrameViewController()
            controller.imageUrl = URL(string: imageStrings[0])
            controllers.append(controller)
        }
        setViewControllers(controllers, direction: .forward, animated: true, completion: nil)
    }
}

extension PageViewController: UIPageViewControllerDataSource {
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        
        let vc = (viewController as! FrameViewController)
        let newPosition = vc.position - 1
        
        if (newPosition >= 0) {
            let newvc = FrameViewController()
            newvc.imageUrl = URL(string: imageStrings[newPosition])
            newvc.position = newPosition
            return newvc
        }
        return nil
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        
        let vc = (viewController as! FrameViewController)
        let newPosition = vc.position + 1
        
        if (newPosition < imageStrings.count) {
            let newvc = FrameViewController()
            newvc.imageUrl = URL(string: imageStrings[newPosition])
            newvc.position = newPosition
            return newvc
        }
        return nil
    }
}

extension PageViewController: UIPageViewControllerDelegate {
    
    func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
        pendingIndex = (pendingViewControllers.first as? FrameViewController)?.position
    }
    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        if (completed) {
            if let index = pendingIndex {
                pageControll.currentPage = index
            }
        }
    }
}

class FrameViewController: UIViewController {
    
    var position = 0
    var imageUrl: URL? {
        didSet {
            iv.kf.setImage(with: imageUrl)
        }
    }
    
    let iv: UIImageView = {
        let iv = UIImageView()
        iv.contentMode = .center
        iv.clipsToBounds = true
        iv.backgroundColor = UIColor.black
        iv.translatesAutoresizingMaskIntoConstraints = false
        return iv
    }()
    
    override func viewDidLoad() {
        view.backgroundColor = UIColor.white
        view.addSubview(iv)
        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", metrics: nil, views: ["v0": iv]))
        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", metrics: nil, views: ["v0": iv]))
    }
}