Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在自定义UICollectionViewLayout中仅允许垂直和水平滑动_Ios_Iphone_Swift_Uicollectionviewlayout - Fatal编程技术网

Ios 如何在自定义UICollectionViewLayout中仅允许垂直和水平滑动

Ios 如何在自定义UICollectionViewLayout中仅允许垂直和水平滑动,ios,iphone,swift,uicollectionviewlayout,Ios,Iphone,Swift,Uicollectionviewlayout,请帮助我解决这个问题,我将按照此创建一个自定义UICollectionViewLayout,用户可以水平滑动以浏览部分,垂直滑动以显示项目 我的问题是,我只希望用户垂直或水平滑动,而不是通过UICollectionView自由滑动。任何关于如何实现这一点的想法都将不胜感激 这是密码 import UIKit class moviesLayout: UICollectionViewLayout { let CELL_HEIGHT = 307.0 let CELL_WIDTH = 204.0

请帮助我解决这个问题,我将按照此创建一个自定义UICollectionViewLayout,用户可以水平滑动以浏览部分,垂直滑动以显示项目

我的问题是,我只希望用户垂直或水平滑动,而不是通过UICollectionView自由滑动。任何关于如何实现这一点的想法都将不胜感激

这是密码

import UIKit

class moviesLayout: UICollectionViewLayout {

let CELL_HEIGHT = 307.0
let CELL_WIDTH  = 204.0

var cellAttrDict = Dictionary<NSIndexPath, UICollectionViewLayoutAttributes>()

var contentSize = CGSizeZero

var dataSourceDidUpdate = true

override func collectionViewContentSize() -> CGSize {

    return contentSize
}

override func prepareLayout() {

    if collectionView?.numberOfSections() > 0 {
        for section in 0...collectionView!.numberOfSections()-1 {
            if collectionView?.numberOfItemsInSection(section) > 0 {
                for item in 0...collectionView!.numberOfItemsInSection(section)-1 {
                            let cellIndex = NSIndexPath(forItem: item, inSection: section)
                            let xPos = Double(item) * CELL_WIDTH
                            let yPos = Double(section) * CELL_HEIGHT

                            var cellAttributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: cellIndex)
                            cellAttributes.frame = CGRect(x: xPos, y: yPos, width: CELL_WIDTH, height: CELL_HEIGHT)
                            cellAttributes.zIndex = 1
                            cellAttrDict[cellIndex] = cellAttributes
                }
            }
        }
    }

    let contentWidth = Double(collectionView!.numberOfItemsInSection(0)) * CELL_WIDTH
    let contentHeight = Double(collectionView!.numberOfSections()) * CELL_HEIGHT
    self.contentSize = CGSize(width: contentWidth, height: contentHeight)

}

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

    var attributesInRect = [UICollectionViewLayoutAttributes]()

    for cellAttributes in cellAttrDict.values {
        if CGRectIntersectsRect(rect, cellAttributes.frame) {
            attributesInRect.append(cellAttributes)
        }
    }

    return attributesInRect
}

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

override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
    return true
}
导入UIKit
类电影布局:UICollectionViewLayout{
设单元高度=307.0
设单元宽度=204.0
var cellatrdict=字典()
var contentSize=CGSizeZero
var datasourcediddupdate=true
重写func collectionViewContentSize()->CGSize{
返回内容大小
}
重写函数prepareLayout(){
如果collectionView?.numberOfSections()大于0{
对于0…collectionView!.numberOfSections()中的节-1{
如果collectionView?.numberOfItemsInSection(section)>0{
对于0中的项目…collectionView!.numberOfItemsInSection(section)-1{
让cellIndex=NSIndexPath(forItem:item,inSection:section)
设xPos=双倍(项目)*单元宽度
设yPos=双(截面)*单元高度
var cellAttributes=UICollectionViewLayoutAttribute(forCellWithIndexPath:cellIndex)
cellAttributes.frame=CGRect(x:xPos,y:yPos,width:CELL\u width,height:CELL\u height)
cellAttributes.zIndex=1
cellAttrDict[cellIndex]=cellAttributes
}
}
}
}
让contentWidth=Double(collectionView!.numberOfItemsInSection(0))*单元格宽度
让contentHeight=Double(collectionView!.numberOfSections())*单元格高度
self.contentSize=CGSize(宽度:contentWidth,高度:contentHeight)
}
重写func LayoutAttribute ForelementsInRect(rect:CGRect)->[UICollectionViewLayoutAttribute]{
var attributesInRect=[UICollectionViewLayoutAttribute]()
对于cellAttrDict.values中的cellAttributes{
如果CGRectIntersectsRect(rect,cellAttributes.frame){
attributesInRect.append(单元格属性)
}
}
返回属性返回
}
重写func LayoutAttribute ForItemAtIndexPath(indexPath:NSIndexPath)->UICollectionViewLayoutAttribute{
返回cellatrdict[indexPath]!
}
覆盖函数应为边界设置(新边界:CGRect)->Bool验证布局{
返回真值
}

}

传统的flowLayout如何,用滑动手势识别器来触发方向的改变

var layout = UICollectionViewFlowLayout()

//Hook to two Swipe Gesture Recognizers - Up and Down
@IBAction func verticalSwipe(sender: AnyObject) {
    layout.scrollDirection = UICollectionViewScrollDirection.Vertical
    self.collectionView?.collectionViewLayout = layout
}

//Hook to two Swipe Gesture Recognizers - Left and Right    
@IBAction func horizontalSwipe(sender: AnyObject) {
    layout.scrollDirection = UICollectionViewScrollDirection.Horizontal
    self.collectionView?.collectionViewLayout = layout
}

我要将UICollectionViewFlowlayout子类化,而不是UICollectionViewLayout,然后为y轴垂直滑动标签使用补充视图。例如,如果用户向下滑动,他们会看到更多频道

水平滑动可以显示一天中的时间,标题标签的补充视图显示时间

使用LayoutAttribute for Supplementary view of Kind可确保y(垂直)和x(水平)标题始终可见(根据集合视图内容偏移量更新其框架)

对于用户来说,这看起来就像他们向下滑动以查看更多频道,而水平滑动以查看当天的早/晚


希望这有帮助。我的用例是围绕日历和预订应用程序的,这种方法很好地解决了这一问题。

这不会改变整个collectionview行为吗?我承认我还没有让它正常工作,但似乎因为我们可以设置一个变量
UICollectionViewScrollDirection
,这就是我要看的方向。