在 Swift 中使用 UIPageViewController 直接跳转到某个页面
Jump directly to certain page using UIPageViewController in Swift
我正在使用 UIPageViewController 在图像周围滑动。视图控制器中有一组小图像,然后我转到另一个仅显示较大图像的视图控制器。我创建了一个带有滚动视图的页面视图控制器,它工作正常,但它总是从第一张图片开始。假设第一个控制器有五个小图像,假设如果用户点击第三个图像以查看更大尺寸的图像,则显示更大图像的第二个控制器成功完成并且当前页面也设置为 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)
}
}
好的,我找到了出路,我可以使用滚动分页来达到预期的效果,这是我用来转到滚动视图的特定页面的代码:
var frame: CGRect = scrollView.frame
frame.origin.x = frame.size.width * CGFloat(seguedCurrentImageIndex!)
frame.origin.y = 0
scrollView.scrollRectToVisible(frame, animated: false)
我正在使用 UIPageViewController 在图像周围滑动。视图控制器中有一组小图像,然后我转到另一个仅显示较大图像的视图控制器。我创建了一个带有滚动视图的页面视图控制器,它工作正常,但它总是从第一张图片开始。假设第一个控制器有五个小图像,假设如果用户点击第三个图像以查看更大尺寸的图像,则显示更大图像的第二个控制器成功完成并且当前页面也设置为 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)
}
}
好的,我找到了出路,我可以使用滚动分页来达到预期的效果,这是我用来转到滚动视图的特定页面的代码:
var frame: CGRect = scrollView.frame
frame.origin.x = frame.size.width * CGFloat(seguedCurrentImageIndex!)
frame.origin.y = 0
scrollView.scrollRectToVisible(frame, animated: false)