ios - 在 Swift 中使用 UIPageViewController 直接跳转到某个页面

标签 ios swift image uipageviewcontroller

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

enter image description here

enter image description here

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

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)

    }
}

最佳答案

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

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

关于ios - 在 Swift 中使用 UIPageViewController 直接跳转到某个页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38621665/

相关文章:

css - Blueimp gallery 在一页上实现多次

image - Matlab梯度和OpenCV梯度给出不同的结果

ios - 无法将模块 'XMPP_Messenger_iOS' 加载为 Swift 中的 'xmpp_messenger_ios 错误

iphone - 图片加载

ios - 应用商店提交成功但丢失钥匙串(keychain)警告

image - Udacity 如何创建文本在前、视频在后的演示文稿?见图片

ios - 有没有办法在具有与全局函数名称相同的方法的类中调用全局函数?

swift - layer.border 不起作用?

ios - 如何在 Swift 中的 tableview 自定义单元格上显示 JSON 图像?

ios - 代码覆盖率结果与 Xcode 7 中的实际覆盖率不准确