在 Swift 中使用 UIPageViewController 直接跳转到特定页面

Posted

技术标签:

【中文标题】在 Swift 中使用 UIPageViewController 直接跳转到特定页面【英文标题】:Jump directly to certain page using UIPageViewController in Swift 【发布时间】:2016-07-27 19:32:19 【问题描述】:

我正在使用 UIPageViewController 来滑动图像。视图控制器中有一组小图像,然后我转到另一个仅显示较大图像的视图控制器。我创建了一个带有滚动视图的页面视图控制器,它工作正常,但它总是从第一张图像开始。假设第一个控制器有五个小图像,假设用户点击第三个图像以查看更大尺寸的图像,则第二个控制器显示更大图像的segue成功完成,当前页面也设置为3但图像是第一个图像。当我转到第二个控制器时,我传递包含图像 url 的数组,并根据在第一个视图上单击的索引设置当前页面,但图像是数组中的第一个图像。

我该如何解决这个问题?下面是代码:

import UIKit

class ImageViewerViewController: UIViewController, UIScrollViewDelegate 

    @IBOutlet weak var scrollView: UIScrollView!

    @IBOutlet weak var pageControl: UIPageControl!

    var seguedAlbumImagePathArray=[]
    var seguedCurrentImageIndex: Int?


    var totalPages: Int = 0

    //let sampleBGColors: Array<UIColor> = [UIColor.redColor(), UIColor.yellowColor(), UIColor.greenColor(), UIColor.magentaColor(), UIColor.orangeColor()]

    override func shouldAutorotate() -> Bool 
        return false
    

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask 
        return UIInterfaceOrientationMask.Portrait
    

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        totalPages = seguedAlbumImagePathArray.count
        view.bringSubviewToFront(pageControl)
    


    override func viewDidAppear(animated: Bool) 
        super.viewDidAppear(animated)

        configureScrollView()
        configurePageControl()
    


    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


    override func preferredStatusBarStyle() -> UIStatusBarStyle 
        return UIStatusBarStyle.LightContent
    


    // MARK: Custom method implementation

    func configureScrollView() 
        // Enable paging.
        scrollView.pagingEnabled = true

        // Set the following flag values.
        scrollView.showsHorizontalScrollIndicator = false
        scrollView.showsVerticalScrollIndicator = false
        scrollView.scrollsToTop = false

        // Set the scrollview content size.
        scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * CGFloat(totalPages), scrollView.frame.size.height)

        // Set self as the delegate of the scrollview.
        scrollView.delegate = self

        // Load the ImageView view from the ImageView.xib file and configure it properly.
        for i in 0 ..< totalPages 
            // Load the ImageView view.
            let imageView = NSBundle.mainBundle().loadNibNamed("ImageView", owner: self, options: nil)[0] as! UIView

            imageView.backgroundColor = UIColor.blackColor()
            // Set its frame and the background color.
            imageView.frame = CGRectMake(CGFloat(i) * scrollView.frame.size.width, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height)
            //imageView.backgroundColor = sampleBGColors[i]

            // Set the proper message to the test view's label.
            let label = imageView.viewWithTag(1) as! UILabel
            label.text = "\(i + 1)/\(totalPages)"

            // Set the proper message to the test view's label.
            let imagev = imageView.viewWithTag(2) as! UIImageView
            view.sendSubviewToBack(imagev)

            if let imageData = NSUserDefaults.standardUserDefaults().objectForKey(seguedAlbumImagePathArray[i] as! String),
                let imageToDisplay = UIImage(data: imageData as! NSData) 
                imagev.image = imageToDisplay
                view.sendSubviewToBack(imagev)
            
            else 
                ImageLoader.sharedLoader.imageForUrl(seguedAlbumImagePathArray[i] as! String, completionHandler:(image: UIImage?, url: String) in
                    imagev.image = image
                )
            

            // Add the test view as a subview to the scrollview.
            scrollView.addSubview(imageView)
        
    


    func configurePageControl() 
        // Set the total pages to the page control.
        pageControl.numberOfPages = totalPages

        // Set the initial page.
        pageControl.currentPage = seguedCurrentImageIndex!
    


    // MARK: UIScrollViewDelegate method implementation

    func scrollViewDidScroll(scrollView: UIScrollView) 
        // Calculate the new page index depending on the content offset.
        let currentPage = floor(scrollView.contentOffset.x / UIScreen.mainScreen().bounds.size.width);

        // Set the new page index to the page control.
        pageControl.currentPage = Int(currentPage)
    


    // MARK: IBAction method implementation

    @IBAction func changePage(sender: AnyObject) 
        // Calculate the frame that should scroll to based on the page control current page.
        var newFrame = scrollView.frame
        newFrame.origin.x = newFrame.size.width * CGFloat(pageControl.currentPage)
        scrollView.scrollRectToVisible(newFrame, animated: true)

    

【问题讨论】:

【参考方案1】:

好的,我找到了出路,我可以使用滚动分页来达到预期的效果,这是我用来转到滚动视图的特定页面的代码:

var frame: CGRect = scrollView.frame
frame.origin.x = frame.size.width * CGFloat(seguedCurrentImageIndex!)
frame.origin.y = 0
scrollView.scrollRectToVisible(frame, animated: false)

【讨论】:

以上是关于在 Swift 中使用 UIPageViewController 直接跳转到特定页面的主要内容,如果未能解决你的问题,请参考以下文章

如何在OC中使用Swift如何在Swift中使用OC

swift 优雅地处理Swift中可本地化的字符串。注意:此代码在Swift 2中,需要在现代Swift中使用更新。

在 Swift 项目中使用 Objective C 类中的 Swift 类

在 Swift 项目中使用 Objective C 类中的 Swift 类

如何在 Swift 中使用 Apple 地图 - 你必须使用 C 还是 Swift 可以?

swift 在swift中使用javascriptcore