Ios 如何使用UIScrollView显示下一个视图的边缘

Ios 如何使用UIScrollView显示下一个视图的边缘,ios,swift,Ios,Swift,我是ios开发的新手,我想用scrollview显示下一个视图的边缘。我从中得到了帮助,这是我的视图层次结构 1) 我将scrollview从故事板添加到了view控制器的俯视图中 2) 我以编程方式将视图添加为容器视图和集合视图,作为scrollview的子视图 class ExampleViewController: UIViewController { var scrollView = UIScrollView() var container1 = UIView() var conta

我是ios开发的新手,我想用scrollview显示下一个视图的边缘。我从中得到了帮助,这是我的视图层次结构 1) 我将scrollview从故事板添加到了view控制器的俯视图中 2) 我以编程方式将视图添加为容器视图和集合视图,作为scrollview的子视图

class ExampleViewController: UIViewController {

var scrollView = UIScrollView()

var container1 = UIView()
var container2 = UIView()
var container3 = UIView()

override func viewDidLoad() {
    super.viewDidLoad()

    scrollView.isPagingEnabled = true
    scrollView.clipsToBounds = false
    view.addSubview(scrollView)

    container1.backgroundColor = .red
    container2.backgroundColor = .blue
    container3.backgroundColor = .yellow

    scrollView.addSubview(container1)
    scrollView.addSubview(container2)
    scrollView.addSubview(container3)
}

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    scrollView.frame = CGRect(x: 0, y: 0, width: view.bounds.width - peekAmount, height: view.bounds.height)
    scrollView.contentSize = CGSize(width: 3 * scrollView.frame.width, height: scrollView.frame.size.height)
    container1.frame.size = containerSize
    container2.frame.size = containerSize
    container3.frame.size = containerSize
    var xPosition: CGFloat = 0
    container1.frame.origin = CGPoint(x: xPosition, y: 0)
    xPosition = container1.frame.maxX
    container2.frame.origin = CGPoint(x: xPosition, y: 0)
    xPosition = container2.frame.maxX
    container3.frame.origin = CGPoint(x: xPosition, y: 0)
}

var containerSize: CGSize {
    return CGSize(width: scrollView.frame.size.width, height: scrollView.frame.size.height)
}

var peekAmount: CGFloat {
    return 80
}
}
我显示了下一个视图的边缘,但当我转到下一页时,事情并不顺利,我不知道如何处理这件繁重的事情,也不知道哪种方法最适合完成这项特定任务。这是我的密码。我真的被卡住了,我真的不知道该怎么办

func addCollectionViewsInsideScrollView(){

    scrollView?.delegate = self;
    scrollView?.isPagingEnabled=true
    scrollView.indicatorStyle = UIScrollViewIndicatorStyle.white


    for i in 0...2 {
        if i == 0 {

            frame = CGRect(x: scrollWidth * CGFloat (i), y: 0, width: scrollWidth - 45,height: scrollHeight)

            subView1 = UIView(frame: frame)
            subView1.backgroundColor = .white
            scrollView?.backgroundColor = .white
            scrollView?.addSubview(subView1)
            subView1.addSubview(collectionView0)
            collectionView0.frame = CGRect(x: subView1.bounds.origin.x, y: 0, width: subView1.bounds.width,height: subView1.bounds.height)

        }

        if i == 1 {

            frame = CGRect(x: scrollWidth * CGFloat (i) - 20, y: 0, width: scrollWidth - 45,height: scrollHeight)

            subView2 = UIView(frame: frame)
            scrollView?.addSubview(subView2)
            subView2.addSubview(collectionView1)
            collectionView1.frame = CGRect(x: subView2.bounds.origin.x, y: 0, width: subView2.bounds.width,height: subView2.bounds.height)

        }

        if i == 2 {

            frame = CGRect(x: scrollWidth * CGFloat (i) - 40, y: 0, width: scrollWidth - 45,height: scrollHeight)
            subView3 = UIView(frame: frame)
            scrollView?.addSubview(subView3)
            subView3.addSubview(collectionView2)

            collectionView2.frame = CGRect(x: subView3.bounds.origin.x, y: 0, width: subView3.bounds.width,height: subView3.bounds.height)

        }

    }

    scrollView?.contentSize = CGSize(width: (scrollWidth * 3), height: scrollHeight)
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    setIndiactorForCurrentPage()
}




func scrollViewDidScroll(_ scrollView: UIScrollView) {


    if myPageNo == 1 {
        frame = CGRect(x: scrollWidth - 20, y: 0, width: scrollWidth - 40,height: scrollHeight)
        let subView = UIView(frame: frame)
        self.scrollView?.addSubview(subView)
        subView.addSubview(collectionView1)
        collectionView1.frame = CGRect(x: subView.bounds.origin.x, y: 0, width: subView.bounds.width,height: subView.bounds.height)
         myPageNo -= 0
    }

    if myPageNo == 2{
        frame = CGRect(x: scrollWidth * 2 - 20, y: 0, width: scrollWidth,height: scrollHeight)
        let subView = UIView(frame: frame)
        self.scrollView.addSubview(subView)
        subView.addSubview(collectionView2)
        collectionView2.frame = CGRect(x: subView.bounds.origin.x, y: 0, width: subView.bounds.width,height: subView.bounds.height)
        myPageNo -= 1
    }
}

func setIndiactorForCurrentPage()  {

    let page = (scrollView?.contentOffset.x)!/scrollWidth
    print(scrollView?.contentOffset.x ?? 0)
    pageControl?.currentPage =  Int(page.rounded())
    myPageNo = Int(page.rounded())

    if  myPageNo == 1 {
       setFrame(pageNo: 1)
    }

    if myPageNo == 2{
        setFrame(pageNo: 2)
    }

}


func setFrame(pageNo: Int){
    if(pageNo == 1){

    frame = CGRect(x: scrollWidth + 2, y: 0, width: scrollWidth - 40,height: scrollHeight)
    let subView = UIView(frame: frame)
    scrollView?.addSubview(subView)
    subView.addSubview(collectionView1)
    collectionView1.frame = CGRect(x: subView.bounds.origin.x, y: 0, width: subView.bounds.width,height: subView.bounds.height)

    }
    else if(pageNo == 2){

        frame = CGRect(x: scrollWidth * 2, y: 0, width: scrollWidth,height: scrollHeight)
        let subView = UIView(frame: frame)
        scrollView?.addSubview(subView)
        subView.addSubview(collectionView2)
        collectionView2.frame = CGRect(x: subView.bounds.origin.x, y: 0, width: subView.bounds.width,height: subView.bounds.height)

    }
}
当我从上一页返回到上一页时,一切都很好,但当我从第一页转到下一个视图时,我无法处理显示下一个视图边缘的问题

但这不是我想要的。我想用点击手势控制uiscroll,还想用左对齐显示最后一页 `这是我的代码func ScrollViewDiEndDecelling(scrollView:UIScrollView){


`

如果您有很多页面,我不会使用scroll view,但下面是我的示例代码,用于在scroll view中显示下一页

class ExampleViewController: UIViewController {

var scrollView = UIScrollView()

var container1 = UIView()
var container2 = UIView()
var container3 = UIView()

override func viewDidLoad() {
    super.viewDidLoad()

    scrollView.isPagingEnabled = true
    scrollView.clipsToBounds = false
    view.addSubview(scrollView)

    container1.backgroundColor = .red
    container2.backgroundColor = .blue
    container3.backgroundColor = .yellow

    scrollView.addSubview(container1)
    scrollView.addSubview(container2)
    scrollView.addSubview(container3)
}

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    scrollView.frame = CGRect(x: 0, y: 0, width: view.bounds.width - peekAmount, height: view.bounds.height)
    scrollView.contentSize = CGSize(width: 3 * scrollView.frame.width, height: scrollView.frame.size.height)
    container1.frame.size = containerSize
    container2.frame.size = containerSize
    container3.frame.size = containerSize
    var xPosition: CGFloat = 0
    container1.frame.origin = CGPoint(x: xPosition, y: 0)
    xPosition = container1.frame.maxX
    container2.frame.origin = CGPoint(x: xPosition, y: 0)
    xPosition = container2.frame.maxX
    container3.frame.origin = CGPoint(x: xPosition, y: 0)
}

var containerSize: CGSize {
    return CGSize(width: scrollView.frame.size.width, height: scrollView.frame.size.height)
}

var peekAmount: CGFloat {
    return 80
}
}

有许多不同的方法可以满足您的需求,但这很简单,可以给您一个想法。我没有添加页面控件,因为您已经有了逻辑。

我已经在几个项目中工作,您可能希望查看下一个可以查看的项目。最好的解决方案可能是UICollectionView,因为您不会加载它每个UIViewController都会立即进入视图,但只有当它几乎启动时才会进入视图。UICollectionView的单元格重用解决了这一问题

确保单元格大小(您可以根据屏幕大小计算)类似于宽度-40px,这样您就可以看到下一个单元格的边缘。在每个单元格中都有UIViewController是完全可能的,事实上,现在您甚至可以通过Interface Builder来实现

UICollectionView已经实现了UIScrollView,因此无需手动处理UIScrollView。您需要做的唯一一件事是,当有人停止滚动时,您可以决定要滚动到哪个单元格(下一个单元格或保持在当前单元格)并滚动到该单元格。为此,您需要添加手势识别器:

然后滚动到用户停止滚动时最可见的单元格:

为此,您需要知道此时哪个单元格最显眼。此计算可能有点困难,但要点是您需要知道哪些单元格位于
indexPathsForVisibleItems
中,然后根据其内容或滚动偏移量查看哪个单元格比其他单元格更显眼。该文件的indexPath应该是要滚动到视图中的文件的indexPath


此解决方案可扩展到数百万项,因为您只加载实际(即将)加载的单元格请参阅。

我想,您可以使用UICollectionView来显示下一个视图的边缘。

我非常感谢您的支持,请让我进一步了解这一点,哪种方法最适合获取此内容。我真的应该使用三个单元格(三页)的collection view吗在每个单元格内,我可以使用另一个包含多个单元格的集合视图吗?@IrfanAhmed是的。如果我是你,我肯定会在你的问题的链接中实现设计。你最终会创建一个自定义UICollectionViewFlowLayout来实现滚动行为。你有任何代码可以通过集合视图完成此任务吗?比谢谢你的回答:)我真的很感激你的建议,我实现了你上面的建议,但是我在集合视图单元格中的集合视图不能正常工作。集合视图的第一行是隐藏的,我设置了单元格和集合视图边缘,但没有什么可以正常工作。你能添加一个例子说明你的情况吗?你可以添加.gifs f例如,也可能是视频。我注意到您没有使用
indexPathsForVisibleItems
或方法将单元格滚动到视图中。您将确切知道您在哪个页面上,因为您刚刚确定了您捕捉到的是哪个indexPath单元格。实际上,我的第一个集合视图的单元格宽度等于colleAction view width-35显示下一个项目的边缘,在这三个单元格中,我添加了另一个包含27个7个项目的集合视图,因此第一件事是当我进入下一页时,我的第一个集合视图单元格在屏幕后面一点,当我想获得可见单元格索引时,我得到了第二个集合视图项目的索引,它是子vi第一个单元格的ew。我真的看不出来。你已经看了视图层次结构了吗?:-我的直觉是,你嵌套在单元格中的VC仍然有其原始大小,而不是宽度-35。
layoutSubviews
在设置它们之后可能会有所帮助。你是使用约束还是手动调整所有内容的大小?我使用的是cons列车