首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置UICollectionView底部填充和滚动尺寸

如何设置UICollectionView底部填充和滚动尺寸
EN

Stack Overflow用户
提问于 2016-08-25 08:47:59
回答 3查看 11.4K关注 0票数 7

你好,我有uicollectionview自定义布局,issues用于bottom paddingscrolling sizes。在picture下面你可以看到;

同时,当滚动时,顶部第一单元总是保持在顶部(左侧单元格必须始终保持在当前没有问题,但顶部侧单元格必须滚动时滚动)

我试图在下面的代码中设置viewDidLoad,但是dont工作

代码语言:javascript
运行
复制
self.automaticallyAdjustsScrollViewInsets = false
self.collectionView.contentInset =  UIEdgeInsetsMake(20, 20, 120, 100);

我的自定义collectionview layout文件

代码语言:javascript
运行
复制
import UIKit

public var CELL_HEIGHT = CGFloat(22)

protocol CustomCollectionViewDelegateLayout: NSObjectProtocol {

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, widthForItemAtIndexPath indexPath: NSIndexPath) -> CGFloat
}

class CustomCollectionViewLayout: UICollectionViewLayout {

    // Used for calculating each cells CGRect on screen.
    // CGRect will define the Origin and Size of the cell.

    let STATUS_BAR = UIApplication.sharedApplication().statusBarFrame.height

    // Dictionary to hold the UICollectionViewLayoutAttributes for
    // each cell. The layout attribtues will define the cell's size
    // and position (x, y, and z index). I have found this process
    // to be one of the heavier parts of the layout. I recommend
    // holding onto this data after it has been calculated in either
    // a dictionary or data store of some kind for a smooth performance.
    var cellAttrsDictionary = Dictionary<NSIndexPath, UICollectionViewLayoutAttributes>()

    // Defines the size of the area the user can move around in
    // within the collection view.
    var contentSize = CGSize.zero

    // Used to determine if a data source update has occured.
    // Note: The data source would be responsible for updating
    // this value if an update was performed.
    var dataSourceDidUpdate = true

    weak var delegate: CustomCollectionViewDelegateLayout?

    override func collectionViewContentSize() -> CGSize {
        return self.contentSize
    }

    override func prepareLayout() {

        // Only update header cells.
        if !dataSourceDidUpdate {

            // Determine current content offsets.
            let xOffset = collectionView!.contentOffset.x
            let yOffset = collectionView!.contentOffset.y

            if collectionView?.numberOfSections() > 0 {
                for section in 0...collectionView!.numberOfSections()-1 {

                    // Confirm the section has items.
                    if collectionView?.numberOfItemsInSection(section) > 0 {

                        // Update all items in the first row.
                        if section == 0 {
                            for item in 0...collectionView!.numberOfItemsInSection(section)-1 {

                                // Build indexPath to get attributes from dictionary.
                                let indexPath = NSIndexPath(forItem: item, inSection: section)

                                // Update y-position to follow user.
                                if let attrs = cellAttrsDictionary[indexPath] {
                                    var frame = attrs.frame

                                    // Also update x-position for corner cell.
                                    if item == 0 {
                                        frame.origin.x = xOffset
                                    }

                                    frame.origin.y = yOffset
                                    attrs.frame = frame
                                }

                            }

                            // For all other sections, we only need to update
                            // the x-position for the fist item.
                        } else {

                            // Build indexPath to get attributes from dictionary.
                            let indexPath = NSIndexPath(forItem: 0, inSection: section)

                            // Update y-position to follow user.
                            if let attrs = cellAttrsDictionary[indexPath] {
                                var frame = attrs.frame
                                frame.origin.x = xOffset
                                attrs.frame = frame
                            }

                        }
                    }
                }
            }


            // Do not run attribute generation code
            // unless data source has been updated.
            return
        }

        // Acknowledge data source change, and disable for next time.
        dataSourceDidUpdate = false

        var maxWidthInASection = CGFloat(0)

        // Cycle through each section of the data source.
        if collectionView?.numberOfSections() > 0 {
            for section in 0...collectionView!.numberOfSections()-1 {

                // Cycle through each item in the section.
                if collectionView?.numberOfItemsInSection(section) > 0 {

                    var prevCellAttributes: UICollectionViewLayoutAttributes?

                    for item in 0...collectionView!.numberOfItemsInSection(section)-1 {

                        let cellIndex = NSIndexPath(forItem: item, inSection: section)

                        guard let width = delegate?.collectionView(collectionView!, layout: self, widthForItemAtIndexPath: cellIndex) else {
                            print("Please comform to CustomCollectionViewDelegateLayout protocol")
                            return
                        }

                        // Build the UICollectionVieLayoutAttributes for the cell.

                        var xPos = CGFloat(0)
                        let yPos = CGFloat(section) * CELL_HEIGHT

                        if let prevCellAttributes = prevCellAttributes {
                            xPos = CGRectGetMaxX(prevCellAttributes.frame)
                        }

                        let cellAttributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: cellIndex)
                        cellAttributes.frame = CGRect(x: xPos, y: yPos, width: width, height: CELL_HEIGHT)

                        // Determine zIndex based on cell type.
                        if section == 0 && item == 0 {
                            cellAttributes.zIndex = 4
                        } else if section == 0 {
                            cellAttributes.zIndex = 3
                        } else if item == 0 {
                            cellAttributes.zIndex = 2
                        } else {
                            cellAttributes.zIndex = 1
                        }

                        // Save the attributes.
                        cellAttrsDictionary[cellIndex] = cellAttributes
                        prevCellAttributes = cellAttributes

                        let maxX = CGRectGetMaxX(cellAttributes.frame)

                        if maxWidthInASection < maxX {
                            maxWidthInASection = maxX
                        }
                    }
                }

            }
        }

        // Update content size.
        let contentWidth = maxWidthInASection
        let contentHeight = Double(collectionView!.numberOfSections())
        self.contentSize = CGSize(width: Double(contentWidth), height: contentHeight)
        self.contentSize.height = CGFloat(Double(collectionView!.numberOfSections()))


    }

    override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

        // Create an array to hold all elements found in our current view.
        var attributesInRect = [UICollectionViewLayoutAttributes]()

        // Check each element to see if it should be returned.
        for cellAttributes in cellAttrsDictionary.values.elements {
            if CGRectIntersectsRect(rect, cellAttributes.frame) {
                attributesInRect.append(cellAttributes)
            }
        }

        // Return list of elements.
        return attributesInRect
    }

    override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? {
        return cellAttrsDictionary[indexPath]!
    }

    override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
        return true
    }

}

我尝试在storyboard中更改拼贴视图属性,但无法工作,我还将当前的collectionview对象属性图片附在下面

我也选择了变焦4,但变焦功能不工作?为什么?它必须是工作也缩放功能。

EN

回答 3

Stack Overflow用户

发布于 2017-11-07 00:31:00

我知道这已经太晚了,但这可能对其他用户有用。

代码语言:javascript
运行
复制
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 50, right: 0)
}
票数 35
EN

Stack Overflow用户

发布于 2020-04-12 07:57:11

这对我起了作用:

代码语言:javascript
运行
复制
 messagesCollectionView.contentInset.top = 100
 messagesCollectionView.contentInset.bottom = 80
票数 6
EN

Stack Overflow用户

发布于 2022-01-10 00:32:30

这也可以在IB下进行.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39140652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档