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

时间:2014-11-01 03:50:09

标签: ios swift uiscrollview

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

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

感谢您的任何建议。

Layout Design

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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];

答案 2 :(得分:0)

RayWenderlich.com的一个很棒的教程可以进行水平页面滚动。我已修改该代码以通过添加名为“horizo​​ntalDirection”的变量来允许垂直页面滚动。首先按照他的教程: 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.
}