在垂直分页启用的UIScrollView中垂直滚动

希望你能在这里给我一些指导。 我有一个垂直分页的滚动视图设置。 我的问题是视图大于屏幕(垂直)。 我希望的效果是让视图滚动到底部,然后翻到下一页。 就像我下面的图片试图描绘的一样。

我已经尝试将scrollview的大小和内容大小设置为正确偏移视图的视图的大小。 我只是不能滚动查看视图的底部,它只是页面到下一个视图。

感谢您的任何build议。

版图设计

class ViewController: UIViewController { let scrollView = UIScrollView() // Create the scrollView override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //Set up and add scrollView to view scrollView.frame = self.view.frame self.scrollView.pagingEnabled = true self.view.addSubview(scrollView) //An array of UIColors to add to the views let x : [UIColor] = [UIColor.blueColor(),UIColor.redColor(),UIColor.yellowColor()] //For each UIColor add a view that is 100px larger then the height of the scrollView for index in 0...x.count-1{ // let subView = UIView(frame: CGRectMake( 0, //x offset (self.scrollView.frame.height + 100) * CGFloat(index), //y offset self.scrollView.frame.width, // width (self.scrollView.frame.height + 100))) // height subView.backgroundColor = x[index] //background Color scrollView.addSubview(subView) // Add View } // let c = (self.scrollView.frame.size.height + 100) * CGFloat(x.count) self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.width, c) //Background Color self.view.backgroundColor = UIColor.greenColor() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

我发现这样做的最好方法是使用嵌套的滚动视图的内容。 这是我的代码最终看起来像。

 class ViewController: UIViewController, UIScrollViewDelegate { let scrollView = ScrollView() // Create the scrollView override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //Set up and add scrollView to view scrollView.frame = self.view.frame self.scrollView.pagingEnabled = true self.view.addSubview(scrollView) self.scrollView.delegate = self //An array of UIColors to add to the views let x : [UIColor] = [UIColor.blueColor(),UIColor.redColor(),UIColor.yellowColor()] //For each UIColor add a view that is 100px larger then the height of the scrollView for index in 0...x.count-1{ // let subView = UIScrollView(frame: CGRectMake( 0, //x offset (self.scrollView.frame.height * CGFloat(index)), //y offset self.scrollView.frame.width, // width (self.scrollView.frame.height))) // height //Set the size of the content view let contentView = UIView(frame: CGRectMake(0, 0, self.view.frame.width, 1000)) subView.contentSize = CGSizeMake(self.view.frame.width, contentView.frame.height) contentView.backgroundColor = x[index] subView.addSubview(contentView) scrollView.addSubview(subView) // Add View } // let c = (self.scrollView.frame.size.height) * CGFloat(x.count) self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.width, c) //Background Color self.view.backgroundColor = UIColor.greenColor() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

User4的答案,在Objective-C中:

 UIScrollView *scrollView = [[UIScrollView alloc] init]; scrollView.frame = self.view.frame; scrollView.pagingEnabled = YES; scrollView.backgroundColor = [UIColor yellowColor]; [self.view addSubview:scrollView]; scrollView.delegate = self; NSArray *x = @[[UIColor blueColor], [UIColor redColor]]; for (int i = 0; i < x.count; i++) { UIView *subView = [[UIView alloc] initWithFrame: CGRectMake(0, (scrollView.frame.size.height) * i, scrollView.frame.size.width, scrollView.frame.size.height) ]; UISwitch *switchCtrl = [[UISwitch alloc] initWithFrame:CGRectMake(5, 5, 20, 20)]; subView.backgroundColor = x[i]; [subView addSubview:switchCtrl]; [scrollView addSubview:subView]; } float c = (scrollView.frame.size.height) * x.count; scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, c); self.view.backgroundColor = [UIColor greenColor]; 

RayWenderlich.com的一个很好的教程做水平页面滚动。 我已经修改了代码,通过添加一个名为“horizo​​ntalDirection”的variables来允许垂直页面滚动。 首先按照他的教程在这里: http : //www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift

在完成“查看上一页/下一页”部分之后,用下面的代码replace你的视图控制器:(你可能需要调整你的滚动视图的大小)

 @IBOutlet var scrollView: UIScrollView! @IBOutlet var pageControl: UIPageControl! var pageImages: [UIImage] = [] var pageViews: [UIImageView?] = [] let horizontalDirection = false override func viewDidLoad() { super.viewDidLoad() // Set up the image you want to scroll & zoom and add it to the scroll view pageImages = [UIImage(named: "photo1.png")!, UIImage(named: "photo2.png")!, UIImage(named: "photo3.png")!, UIImage(named: "photo4.png")!, UIImage(named: "photo5.png")!] let pageCount = pageImages.count // Set up the page control pageControl.currentPage = 0 pageControl.numberOfPages = pageCount // Set up the array to hold the views for each page for _ in 0..<pageCount { pageViews.append(nil) } // Set up the content size of the scroll view let pagesScrollViewSize = scrollView.frame.size if horizontalDirection { scrollView.contentSize = CGSizeMake(pagesScrollViewSize.width * CGFloat(pageImages.count), pagesScrollViewSize.height) } else { scrollView.contentSize = CGSizeMake(pagesScrollViewSize.width, CGFloat(pageImages.count) * pagesScrollViewSize.height) } // Load the initial set of pages that are on screen loadVisiblePages() } func loadVisiblePages() { // First, determine which page is currently visible var pageSide = scrollView.frame.size.width var page = Int(floor((scrollView.contentOffset.x * 2.0 + pageSide) / (pageSide * 2.0))) if !horizontalDirection { pageSide = scrollView.frame.size.height page = Int(floor((scrollView.contentOffset.y * 2.0 + pageSide) / (pageSide * 2.0))) } // Update the page control pageControl.currentPage = page // Work out which pages you want to load let firstPage = page - 1 let lastPage = page + 1 // Purge anything before the first page for var index = 0; index < firstPage; ++index { purgePage(index) } // Load pages in our range for index in firstPage...lastPage { loadPage(index) } // Purge anything after the last page for var index = lastPage+1; index < pageImages.count; ++index { purgePage(index) } } func loadPage(page: Int) { if page < 0 || page >= pageImages.count { // If it's outside the range of what you have to display, then do nothing return } // Load an individual page, first checking if you've already loaded it if let pageView = pageViews[page] { // Do nothing. The view is already loaded. } else { var frame = scrollView.bounds if horizontalDirection { frame.origin.x = frame.size.width * CGFloat(page) frame.origin.y = 0.0 frame = CGRectInset(frame, 10.0, 0.0) } else { frame.origin.x = 0.0 frame.origin.y = frame.size.height * CGFloat(page) } let newPageView = UIImageView(image: pageImages[page]) newPageView.contentMode = .ScaleAspectFit newPageView.frame = frame scrollView.addSubview(newPageView) pageViews[page] = newPageView } } func purgePage(page: Int) { if page < 0 || page >= pageImages.count { // If it's outside the range of what you have to display, then do nothing return } // Remove a page from the scroll view and reset the container array if let pageView = pageViews[page] { pageView.removeFromSuperview() pageViews[page] = nil } } func scrollViewDidScroll(scrollView: UIScrollView!) { // Load the pages that are now on screen loadVisiblePages() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. }