启用UIScrollView的垂直分页后如何在垂直方向上滚动?

3
希望您能给我一些指导。我有一个垂直分页的ScrollView设置。我的问题是,视图比屏幕更大(垂直方向)。我的期望效果是将视图滚动到底部,然后翻到下一页,如下面的图片所示。
我尝试将ScrollView和内容大小设置为视图大小,这样可以正确地偏移视图。但我无法滚动并看到视图底部,它只会翻到下一页。
感谢任何建议。
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.
}
}

你是指垂直方向,对吗? - rdelmar
捂脸。是的,我是指垂直方向固定。 - User4
尺寸始终需要保持屏幕尺寸,并且您需要根据图像数量设置contentSize,如果框架和内容都相同,则如何滚动。 - Balu
谢谢@Sunny,我仍然有一个问题,它只会分页而不是滚动。如果可以的话,我会把我的代码放上去帮助解决。 - User4
3个回答

4

我发现最好的方法是使用嵌套ScrollView作为内容。以下是我的代码:

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.
}
}

3

以下是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];

0
一个很棒的RayWenderlich.com教程可以实现水平页面滚动。我已经通过添加一个名为“horizontalDirection”的变量来修改了该代码,以允许垂直页面滚动。首先请按照他的教程进行操作: http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift 在完成“查看上一页/下一页”部分后,请使用以下内容替换您的视图控制器:(您可能需要调整滚动视图的大小)
@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.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接