菜鸟教程小白 发表于 2022-12-11 17:07:35

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


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

<p> <a href="/image/c79Vw.jpg" rel="noreferrer noopener nofollow"><img src="/image/c79Vw.jpg" alt="enter image description here"/></a> </p>

<p> <a href="/image/8KvYx.jpg" rel="noreferrer noopener nofollow"><img src="/image/8KvYx.jpg" alt="enter image description here"/></a> </p>

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

<pre><code>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&lt;UIColor&gt; =

    override func shouldAutorotate() -&gt; Bool {
      return false
    }

    override func supportedInterfaceOrientations() -&gt; 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() -&gt; 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 ..&lt; totalPages {
            // Load the ImageView view.
            let imageView = NSBundle.mainBundle().loadNibNamed(&#34;ImageView&#34;, owner: self, options: nil) 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

            // Set the proper message to the test view&#39;s label.
            let label = imageView.viewWithTag(1) as! UILabel
            label.text = &#34;\(i + 1)/\(totalPages)&#34;

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

            if let imageData = NSUserDefaults.standardUserDefaults().objectForKey(seguedAlbumImagePathArray as! String),
                let imageToDisplay = UIImage(data: imageData as! NSData) {
                imagev.image = imageToDisplay
                view.sendSubviewToBack(imagev)
            }
            else {
                ImageLoader.sharedLoader.imageForUrl(seguedAlbumImagePathArray 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)

    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>好的,我找到了出路,我可以使用滚动分页来达到预期的效果,这是我用来转到 ScrollView 的特定页面的代码:</p>

<pre><code>var frame: CGRect = scrollView.frame
frame.origin.x = frame.size.width * CGFloat(seguedCurrentImageIndex!)
frame.origin.y = 0
scrollView.scrollRectToVisible(frame, animated: false)
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 Swift 中使用 UIPageViewController 直接跳转到特定页面,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/38621665/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/38621665/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 Swift 中使用 UIPageViewController 直接跳转到特定页面