如何使用swift创build一个页面控件的滚动视图?

我正在尝试创build一个页面视图控制器与视图的数量。 我想要一个简单的代码示例,将使用UIPageViewController

import UIKit class DummyVC: UIViewController, UIScrollViewDelegate { let scrollView = UIScrollView(frame: CGRect(x:0, y:0, width:320,height: 300)) var colors:[UIColor] = [UIColor.red, UIColor.blue, UIColor.green, UIColor.yellow] var frame: CGRect = CGRect(x:0, y:0, width:0, height:0) var pageControl : UIPageControl = UIPageControl(frame: CGRect(x:50,y: 300, width:200, height:50)) override func viewDidLoad() { super.viewDidLoad() configurePageControl() scrollView.delegate = self scrollView.isPagingEnabled = true self.view.addSubview(scrollView) for index in 0..<4 { frame.origin.x = self.scrollView.frame.size.width * CGFloat(index) frame.size = self.scrollView.frame.size let subView = UIView(frame: frame) subView.backgroundColor = colors[index] self.scrollView .addSubview(subView) } self.scrollView.contentSize = CGSize(width:self.scrollView.frame.size.width * 4,height: self.scrollView.frame.size.height) pageControl.addTarget(self, action: #selector(self.changePage(sender:)), for: UIControlEvents.valueChanged) } func configurePageControl() { // The total number of pages that are available is based on how many available colors we have. self.pageControl.numberOfPages = colors.count self.pageControl.currentPage = 0 self.pageControl.tintColor = UIColor.red self.pageControl.pageIndicatorTintColor = UIColor.black self.pageControl.currentPageIndicatorTintColor = UIColor.green self.view.addSubview(pageControl) } // MARK : TO CHANGE WHILE CLICKING ON PAGE CONTROL func changePage(sender: AnyObject) -> () { let x = CGFloat(pageControl.currentPage) * scrollView.frame.size.width scrollView.setContentOffset(CGPoint(x:x, y:0), animated: true) } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width) pageControl.currentPage = Int(pageNumber) } } 

对于懒惰的编码器,这是基于那个懒惰的iOS Guy answer的答案的Swift 3实现

 import UIKit class ViewController: UIViewController,UIScrollViewDelegate { let scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: 320, height: 300)) var colors:[UIColor] = [UIColor.red, UIColor.blue, UIColor.green, UIColor.yellow] var frame: CGRect = CGRect(x: 0, y: 0, width: 0, height: 0) var pageControl : UIPageControl = UIPageControl(frame:CGRect(x: 50, y: 300, width: 200, height: 50)) override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. configurePageControl() scrollView.delegate = self self.view.addSubview(scrollView) for index in 0..<4 { frame.origin.x = self.scrollView.frame.size.width * CGFloat(index) frame.size = self.scrollView.frame.size let subView = UIView(frame: frame) subView.backgroundColor = colors[index] self.scrollView .addSubview(subView) } self.scrollView.isPagingEnabled = true self.scrollView.contentSize = CGSize(width: self.scrollView.frame.size.width * 4, height: self.scrollView.frame.size.height) pageControl.addTarget(self, action: #selector(self.changePage(sender:)), for: UIControlEvents.valueChanged) } func configurePageControl() { // The total number of pages that are available is based on how many available colors we have. self.pageControl.numberOfPages = colors.count self.pageControl.currentPage = 0 self.pageControl.tintColor = UIColor.red self.pageControl.pageIndicatorTintColor = UIColor.black self.pageControl.currentPageIndicatorTintColor = UIColor.green self.view.addSubview(pageControl) } // MARK : TO CHANGE WHILE CLICKING ON PAGE CONTROL func changePage(sender: AnyObject) -> () { let x = CGFloat(pageControl.currentPage) * scrollView.frame.size.width scrollView.setContentOffset(CGPoint(x: x,y :0), animated: true) } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width) pageControl.currentPage = Int(pageNumber) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

Swift 3 – 水平图像滚动

 import UIKit class pageenabled: UIViewController,UIScrollViewDelegate { let imagelist = ["img1.jpg", "photo1.jpg", "photo3.jpg", "photo4.jpg", "photo5.jpg"] var scrollView = UIScrollView() var pageControl : UIPageControl = UIPageControl(frame:CGRect(x: 50, y: 300, width: 200, height: 50)) var yPosition:CGFloat = 0 var scrollViewContentSize:CGFloat=0; override func viewDidLoad() { super.viewDidLoad() scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 300)) configurePageControl() scrollView.delegate = self self.view.addSubview(scrollView) for i in stride(from: 0, to: imagelist.count, by: 1) { var frame = CGRect.zero frame.origin.x = self.scrollView.frame.size.width * CGFloat(i) frame.origin.y = 0 frame.size = self.scrollView.frame.size self.scrollView.isPagingEnabled = true let myImage:UIImage = UIImage(named: imagelist[i])! let myImageView:UIImageView = UIImageView() myImageView.image = myImage myImageView.contentMode = UIViewContentMode.scaleAspectFit myImageView.frame = frame scrollView.addSubview(myImageView) } self.scrollView.contentSize = CGSize(width: self.scrollView.frame.size.width * CGFloat(imagelist.count), height: self.scrollView.frame.size.height) pageControl.addTarget(self, action: Selector(("changePage:")), for: UIControlEvents.valueChanged) // Do any additional setup after loading the view. } func configurePageControl() { // The total number of pages that are available is based on how many available colors we have. self.pageControl.numberOfPages = imagelist.count self.pageControl.currentPage = 0 self.pageControl.tintColor = UIColor.red self.pageControl.pageIndicatorTintColor = UIColor.black self.pageControl.currentPageIndicatorTintColor = UIColor.green self.view.addSubview(pageControl) } // MARK : TO CHANGE WHILE CLICKING ON PAGE CONTROL func changePage(sender: AnyObject) -> () { let x = CGFloat(pageControl.currentPage) * scrollView.frame.size.width scrollView.setContentOffset(CGPoint(x: x,y :0), animated: true) } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width) pageControl.currentPage = Int(pageNumber) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

Swift 3.0中,通过故事板为scrollview和pagecontroller创build了iboutlets。

 @IBOutlet weak var imgScrollView: UIScrollView! @IBOutlet weak var imgPageController: UIPageControl! var sliderImagesArray = NSMutableArray() 

在viewdidload方法中写这个代码

 sliderImagesArray = ["https://images.unsplash.com/photo-1432679963831-2dab49187847?w=1080","https://images.unsplash.com/photo-1447746249824-4be4e1b76d66?w=1080", "https://images.unsplash.com/photo-1463595373836-6e0b0a8ee322?w=1080"] imgScrollView.delegate = self for i in 0..<sliderImagesArray.count { var imageView : UIImageView let xOrigin = self.imgScrollView.frame.size.width * CGFloat(i) imageView = UIImageView(frame: CGRect(x: xOrigin, y: 0, width: self.imgScrollView.frame.size.width, height: self.imgScrollView.frame.size.height)) imageView.isUserInteractionEnabled = true let urlStr = sliderImagesArray.object(at: i) print(imgScrollView,imageView, urlStr) imageView.sd_setImage(with: URL(string: urlStr as! String), placeholderImage: UIImage(named: "placeholder.png")) imageView .contentMode = UIViewContentMode.scaleToFill self.imgScrollView.addSubview(imageView) } self.imgScrollView.isPagingEnabled = true self.imgScrollView.bounces = false self.imgScrollView.showsVerticalScrollIndicator = false self.imgScrollView.showsHorizontalScrollIndicator = false self.imgScrollView.contentSize = CGSize(width: self.imgScrollView.frame.size.width * CGFloat(sliderImagesArray.count), height: self.imgScrollView.frame.size.height) imgPageController.addTarget(self, action: #selector(self.changePage(sender:)), for: UIControlEvents.valueChanged) self.imgPageController.numberOfPages = sliderImagesArray.count self.imgPageController.currentPage = 0 self.imgPageController.tintColor = UIColor.red self.imgPageController.pageIndicatorTintColor = UIColor.black self.imgPageController.currentPageIndicatorTintColor = UIColor.blue 

之后实现scrollview委托方法

 func changePage(sender: AnyObject) -> () { let x = CGFloat(imgPageController.currentPage) * imgScrollView.frame.size.width imgScrollView.setContentOffset(CGPoint(x: x,y :0), animated: true) } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { let pageNumber = round(imgScrollView.contentOffset.x / imgScrollView.frame.size.width) imgPageController.currentPage = Int(pageNumber) } 
  @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var imageViewBottomConstraint: NSLayoutConstraint! @IBOutlet weak var imageViewLeadingConstraint: NSLayoutConstraint! @IBOutlet weak var imageViewTopConstraint: NSLayoutConstraint! @IBOutlet weak var imageViewTrailingConstraint: NSLayoutConstraint! extension ZoomedPhotoViewController: UIScrollViewDelegate { func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { return imageView } } private func updateMinZoomScaleForSize(size: CGSize) { let widthScale = size.width / imageView.bounds.width let heightScale = size.height / imageView.bounds.height let minScale = min(widthScale, heightScale) scrollView.minimumZoomScale = minScale scrollView.zoomScale = minScale } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() updateMinZoomScaleForSize(view.bounds.size) } private func updateConstraintsForSize(size: CGSize) { let yOffset = max(0, (size.height - imageView.frame.height) / 2) imageViewTopConstraint.constant = yOffset imageViewBottomConstraint.constant = yOffset let xOffset = max(0, (size.width - imageView.frame.width) / 2) imageViewLeadingConstraint.constant = xOffset imageViewTrailingConstraint.constant = xOffset view.layoutIfNeeded() } func scrollViewDidZoom(scrollView: UIScrollView) { updateConstraintsForSize(view.bounds.size) } import UIKit public class PhotoCommentViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var nameTextField: UITextField! public var photoName: String! override public func viewDidLoad() { super.viewDidLoad() if let photoName = photoName { self.imageView.image = UIImage(named: photoName) } } } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let cell = sender as? UICollectionViewCell, indexPath = collectionView?.indexPathForCell(cell), photoCommentViewController = segue.destinationViewController as? PhotoCommentViewController { photoCommentViewController.photoName = "photo\(indexPath.row + 1)" } } NSNotificationCenter.defaultCenter().addObserver( self, selector: #selector(PhotoCommentViewController.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil ) NSNotificationCenter.defaultCenter().addObserver( self, selector: #selector(PhotoCommentViewController.keyboardWillHide(_:)), name: UIKeyboardWillHideNotification, object: nil ) deinit { NSNotificationCenter.defaultCenter().removeObserver(self) } func adjustInsetForKeyboardShow(show: Bool, notification: NSNotification) { guard let value = notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue else { return } let keyboardFrame = value.CGRectValue() let adjustmentHeight = (CGRectGetHeight(keyboardFrame) + 20) * (show ? 1 : -1) scrollView.contentInset.bottom += adjustmentHeight scrollView.scrollIndicatorInsets.bottom += adjustmentHeight } func keyboardWillShow(notification: NSNotification) { adjustInsetForKeyboardShow(true, notification: notification) } func keyboardWillHide(notification: NSNotification) { adjustInsetForKeyboardShow(false, notification: notification) } @IBAction func hideKeyboard(sender: AnyObject) { nameTextField.endEditing(true) } public var photoIndex: Int! import UIKit class ManagePageViewController: UIPageViewController { var photos = ["photo1", "photo2", "photo3", "photo4", "photo5"] var currentIndex: Int! override func viewDidLoad() { super.viewDidLoad() dataSource = self // 1 if let viewController = viewPhotoCommentController(currentIndex ?? 0) { let viewControllers = [viewController] // 2 setViewControllers( viewControllers, direction: .Forward, animated: false, completion: nil ) } } func viewPhotoCommentController(index: Int) -> PhotoCommentViewController? { if let storyboard = storyboard, page = storyboard.instantiateViewControllerWithIdentifier("PhotoCommentViewController") as? PhotoCommentViewController { page.photoName = photos[index] page.photoIndex = index return page } return nil } }