Giter Club home page Giter Club logo

Comments (1)

qhu91it avatar qhu91it commented on June 20, 2024

Finally, I got this solution to work.
define the value

let originY: CGFloat = 0
let floatingSectionOriginY = collectionView.contentOffset.y

If scrolling up use value from contentOffset.y to keep row is floating.

var selectedOriginY = originY
if floatingSectionOriginY >= originY {
    selectedOriginY = floatingSectionOriginY
}

Full code

override func prepare() {
        guard delegate != nil,
            let collectionView = collectionView,
            collectionView.numberOfSections > 0
            else { return }
        
        if itemAttributes.count != collectionView.numberOfSections {
            generateItemAttributes(collectionView: collectionView)
            return
        }
        
        let originY: CGFloat = 0
        let floatingSectionOriginY = collectionView.contentOffset.y
        let originX: CGFloat = 0
        let floatingSectionOriginX = collectionView.contentOffset.x
        
        for section in 0..<collectionView.numberOfSections {
            for item in 0..<collectionView.numberOfItems(inSection: section) {
                if section >= delegate.numberOfFirstRowFloat() 
                   && item >= delegate.numberOfFirstColumnFloat() {
                    continue
                }
                
                let attributes = layoutAttributesForItem(at: IndexPath(item: item, section: section))!
                
                if section < delegate.numberOfFirstRowFloat() {
                    var selectedOriginY = originY
                    if floatingSectionOriginY >= originY {
                        selectedOriginY = floatingSectionOriginY
                    }
                    var frame = attributes.frame
                    let size = itemsSize[item]
                    frame.origin.y = selectedOriginY + (size.height * CGFloat(section))
                    attributes.frame = frame
                }
                
                if item < delegate.numberOfFirstColumnFloat() {
                    var selectedOriginX = originX
                    if floatingSectionOriginX >= originX {
                        selectedOriginX = floatingSectionOriginX
                    }
                    var frame = attributes.frame
                    let prevItem = item - 1
                    if prevItem < 0 {
                        frame.origin.x = selectedOriginX
                    } else {
                        let size = itemsSize[prevItem]
                        frame.origin.x = selectedOriginX + (size.width * CGFloat(item))
                    }
                    attributes.frame = frame
                }
            }
        }
    }

from customcollectionviewlayout.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.