使用UIViews在顶部滚动集合视图?

问题描述 投票:1回答:4

我有一个UICollectionViewController,我添加了两个UIViews作为子视图。一个是紫色的UIView,上面是另一个白色的UIView,蓝色的集合视图在两个后面向上滚动。

在那些UIViews之下,我从前300名(这是两个UIViews的高度的总大小)制作了collectionView.contentInset。我想要完成的是滚动集合视图以及上面的两个UIViews。它几乎类似于这个线程(Move a view when scrolling in UITableView)上的解决方案,除非我覆盖scrollViewDidScroll,整个框架向上滚动,单元格在两个视图后面。我想要的只是向上滚动UIViews,然后滚动浏览集合视图。我觉得这可能涉及嵌套的滚动视图。

enter image description here

这就是我覆盖scrollViewDidScroll的方式:

    var rect = self.view.frame
    rect.origin.y =  -scrollView.contentOffset.y - 300
    self.view.frame = rect

编辑:我发布了一个视频,演示了我想要为iOS Tumblr应用程序做什么:https://youtu.be/elfxtzoiHQo

ios swift uiview uiscrollview uicollectionview
4个回答
3
投票

我通过以下一些基本步骤达到了相同的要求。

//Declare the view which is going to be added as header view
    let requiredView = UIView()

//Add your required view as subview of uicollectionview backgroundView view like as
collectionView.backgroundView = UIView() 
collectionView.backgroundView?.addSubview(requiredView)

//After that control the frame of requiredHeaderView in scrollViewDidScroll delegate method like
        func scrollViewDidScroll(scrollView: UIScrollView) {
         let per:CGFloat = 60 //percentage of required view to move on while moving collection view
                let deductValue = CGFloat(per / 100 * requiredView.frame.size.height)
                let offset = (-(per/100)) * (scrollView.contentOffset.y)
                let value = offset - deductValue
                let rect = requiredView.frame
                self.requiredView.frame = CGRectMake(rect.origin.x, value, rect.size.width, rect.size.height)
        }

1
投票

听起来你想要的是标题。

您可以使用以下任一方法为标头指定类或nib:

self.collectionView.registerClass(_:, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier:)

registerNib(_:, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: )

如果使用流布局,还应指定参考高度:self.flowLayout.headerReferenceHeight = ...

然后你可以通过你的UICollectionViewController在collectionView(_:, viewForSupplementaryElementOfKind:, at:)中提供标题,方法是检查节标题类型。

这是一个体面的教程,供参考:https://www.raywenderlich.com/78551/beginning-ios-collection-views-swift-part-2


0
投票

你有一个图书馆CSStickyHeaderFlowLayout

来自自述文件:

UICollectionView替换UITableView。甚至更像Parallax Header,Sticky Section Header。适用于iOS 7。


0
投票

试试这个。

headerViewYConstraint是标题视图的前y约束。

存储最后一个联系人偏移量。

var lastContentOffset: CGFloat = 0


override func scrollViewDidScroll(scrollView: UIScrollView) {
    if scrollView != contentScrollView {

        if scrollView.dragging || scrollView.decelerating {
            let newOffset = scrollView.contentOffset.y
            let headerViewHeight = headerView.frame.width
            if headerViewHeight > 0 && scrollView.contentSize.height > view.frame.height + headerViewHeight{
                var topOffset = newOffset == 0 ? 0.0 : (headerViewYConstraint.constant + lastContentOffset - newOffset)
                topOffset = min(0, max(topOffset, -headerViewHeight))
                if headerViewYConstraint.constant > topOffset || newOffset < headerViewHeight || lastDirectionalContentOffset - newOffset > cellHeight(){
                    headerViewYConstraint.constant = topOffset
                }
            } else {
                headerViewYConstraint.constant = 0
            }
            lastContentOffset = newOffset
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.