2016-07-27 19 views
2

Ich benutze UIPageViewController, um Bilder zu wischen. Es gibt eine Reihe kleiner Bilder im View-Controller und dann gehe ich zu einem anderen View-Controller über, der nur das größere Bild zeigt. Ich habe einen Seitenaufruf-Controller mit Bildlaufansicht erstellt und es funktioniert gut, aber es beginnt immer mit dem ersten Bild. Nehmen wir an, der erste Controller hat fünf kleine Bilder. Wenn der Benutzer zum Beispiel auf das dritte Bild klickt, wird der zweite Controller mit dem größeren Bild erfolgreich dargestellt und die aktuelle Seite wird ebenfalls auf 3 gesetzt aber das Bild ist das erste Bild. Wenn ich zu diesem zweiten Controller übergehe, übertrage ich das Array, das Bild-URLs enthält, und basierend auf dem auf die erste Ansicht geklickten Index wird die aktuelle Seite eingestellt, aber das Bild ist das erste Bild in dem Array.Springe direkt zu einer bestimmten Seite mit UIPageViewController in Swift

enter image description here

enter image description here

Wie kann ich dieses Problem beheben? Unten ist der 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<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) 

    } 
} 

Antwort

0

Ok, ich habe einen Ausweg gefunden, ich Scroll-Paging verwenden kann, um das gewünschte Ergebnis zu erzielen, hier ist der Code, den ich auf eine bestimmte Seite des Scroll ging folgende Zwecke verwendet:

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