         return attributes
     }
     
+    /// These are pre-calucated for the visible items in `prepareLayout` and then after that they are loaded as needed.
     public override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes! {
         
         return loadLayoutAttributesForItem(indexPath)

        
        let context = context as! TableLayoutInvaldationContext
        
        columnHeaderYNeedsUpdate = context.invalidColumnHeaderFreezeState
        rowSupplementaryViewXNeedsUpdate = context.invalidateRowSupplementaryViews
        
        if context.invalidateEverything || context.invalidateDataSourceCounts {

        didSet {
            invalidateLayoutIfChanged(frozenColumnHeaders, fromOldValue: oldValue) {
                let context = TableLayoutInvaldationContext()
                context.invalidateColumnHeaderFreezeState = true
                return context
            }
        }
    }
    /// Setting too many columns here will eventaully cause only these columns to show when scrolling!
    @IBInspectable public var frozenTableColumnIndexes = Set<Int>() {
        // Even though this property won't show up in Interface Builder, keep it declared anyway @IBInspectable
        didSet {
            invalidateLayoutIfChanged(frozenTableColumnIndexes, fromOldValue: oldValue) {
                let context = TableLayoutInvaldationContext()
                context.invalidateFrozenColumns = true
                return context
            }
        }
