Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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 如何在Swift中以编程方式更改UICollectionViewCell大小?_Ios_Swift_Uicollectionview_Uicollectionviewcell - Fatal编程技术网

Ios 如何在Swift中以编程方式更改UICollectionViewCell大小?

Ios 如何在Swift中以编程方式更改UICollectionViewCell大小?,ios,swift,uicollectionview,uicollectionviewcell,Ios,Swift,Uicollectionview,Uicollectionviewcell,我有一个UICollectionView和一个分段控件在数据之间切换。但是如何以编程方式更改UICollectionViewCellsize属性?然后我可以为每种数据类型适当地定制每种样式 例如将宽度更改为520点,将高度更改为100点。我是iOS开发新手,对CSS很有经验:/ 我知道如何在Xcode中实现它(显然),但不知道在swift中修改它的正确方法。非常感谢您的任何想法或反馈(Y) 确保符合类的UICollectionViewDelegateFlowLayout (适用于swift4)

我有一个
UICollectionView
和一个
分段控件
在数据之间切换。但是如何以编程方式更改
UICollectionViewCell
size属性?然后我可以为每种数据类型适当地定制每种样式

例如将宽度更改为520点,将高度更改为100点。我是iOS开发新手,对CSS很有经验:/

我知道如何在Xcode中实现它(显然),但不知道在swift中修改它的正确方法。非常感谢您的任何想法或反馈(Y)


确保符合类的UICollectionViewDelegateFlowLayout (适用于swift4)

在Swift 3之前

//Use for size
func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

    }
//Use for interspacing
    func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
            return 1.0
    }

    func collectionView(collectionView: UICollectionView, layout
        collectionViewLayout: UICollectionViewLayout,
        minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
            return 1.0
    }
//斯威夫特3

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {

}

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}

func collectionView(_ collectionView: UICollectionView, layout
    collectionViewLayout: UICollectionViewLayout,
                    minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}
//斯威夫特4号

extension MyClass: UICollectionViewDelegateFlowLayout { 
        func collectionView(_ collectionView: UICollectionView,
                            layout collectionViewLayout: UICollectionViewLayout,
                            sizeForItemAt indexPath: IndexPath) -> CGSize {

        }

        func collectionView(_ collectionView: UICollectionView,
                            layout collectionViewLayout: UICollectionViewLayout,
                            minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
            return 1.0
        }

        func collectionView(_ collectionView: UICollectionView, layout
            collectionViewLayout: UICollectionViewLayout,
                            minimumLineSpacingForSectionAt section: Int) -> CGFloat {
            return 1.0
        }
    }
对swift 3使用如上所示的相同代码,但要确保
您的类符合UICollectionViewDelegateFlowLayout协议

如果您使用Swift 3,则不会调用@sumit oberoi answer中的方法。要使其工作,请进行以下调整:

  • 符合
    UICollectionViewDelegateFlowLayout
    协议

  • 实施这些方法:

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {
    
    }
    
    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }
    
    func collectionView(_ collectionView: UICollectionView, layout
        collectionViewLayout: UICollectionViewLayout,
                        minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }
    
  • 注意这些变化:

  • 在方法名称中的
    集合视图
    之前添加
  • nsindepath
    更改为
    indepath

  • Swift 3

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let cellSize = CGSize(width:80 , height:80)
    
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .vertical //.horizontal
        layout.itemSize = cellSize
        layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
        layout.minimumLineSpacing = 1.0
        layout.minimumInteritemSpacing = 1.0
        myCollectionView.setCollectionViewLayout(layout, animated: true)
    
        myCollectionView.reloadData()
    }
    

    如果你用Gaurav Rami的代码吼叫

    let cellSize = CGSize(width:80 , height:80)
    
    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical //.horizontal
    layout.itemSize = cellSize
    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    layout.minimumLineSpacing = 1.0
    layout.minimumInteritemSpacing = 1.0
    myCollectionView.setCollectionViewLayout(layout, animated: true)
    
    并获取此消息“对未渲染的视图进行快照将导致空快照。请确保在快照之前或屏幕更新之后至少渲染视图一次。” 设置集合视图的视图布局时,应删除动画

    myCollectionView.setCollectionViewLayout(layout, animated: false)
    

    然后消息将消失

    尝试使用UICollectionViewDelegateFlowLayout方法。在Xcode 11或更高版本中,需要从情节提要中将“估计大小”设置为“无”

    first Conform protocol the UICollectionViewDelegateFlowLayout
    
    set width and height  UICollectionViewCell 
    
    UIcollectionViewCell Hight = 300;
    UIcollectionViewCell Width = 380;
    
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout,sizeForItemAt indexPath: IndexPath) -> CGSize {
          return CGSize(width: CGFloat((380)), height: CGFloat(300))
        }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: 
    UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
      let padding: CGFloat =  170
      let collectionViewSize = advertCollectionView.frame.size.width - padding
      return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
    }
    

    Swift 5:

  • 遵守UICollectionViewDelegateFlowLayout协议,这意味着您需要将该协议放入类的继承中或作为扩展。像这样:

    class ViewController: UIViewController, UICollectionViewDelegate, 
    UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    }
    
  • 实施SizeForestMat方法:

    func collectionView(collectionView:UICollectionView, 布局 collectionViewLayout:UICollectionViewLayout,sizeForItemAt indexPath: indexath)->CGSize{ 返回CGSize(宽:100,高:100) }

  • 您可以在CGSize构造函数中输入所需的宽度和高度

  • 情节提要 选择集合视图,并在大小检查器中将估计大小属性设置为,如下所示:
  • 在视图控制器中为视图控制器添加UICollectionViewDelegateFlowLayout

  • 使用collectionviewlayouts方法或创建不同的xibs单元。根据您的需要非常感谢!我已经做了,而且效果很好,我只是声明了
    var size=CGSize(宽度:300,高度:100)
    并返回了size属性。不确定如何添加边界半径的想法,将对此进行研究。当然,这不是一个长期的解决方案,需要使宽度适合每个设备。有趣的是,Xcode 7.3.1中没有自动完成此方法。但是,如果你只是复制和粘贴,它是有效的…你能告诉我为什么会发生这种情况吗?在swift 3中,这些方法的名称已经改变了。另外,nsindepath被indepath替换。如果您有旧方法,则不会调用它们,因为它们不再在CollectionView数据源中定义。但为什么Xocde不提供更改该方法参数的建议?这些方法也不会调用swift 3(版本8.2.1(8C1002)),所以这就是您节省我时间的方法+1票。。UICollectionViewDelegateFlowLayoutt这并不是全部代码-如果将整个内容格式化为代码,这对任何人都没有帮助。只能将代码格式化为代码。就目前而言,你的贡献毫无用处。您还应该描述您的贡献提供了哪些其他人不提供的内容。这对我来说是一个很好的答案,因为我没有子类化
    UICollectionController
    ,而是从标准的
    UIViewController
    访问插座。当您尝试从UIViewController继承并遵守协议UICollectionViewDelegateFlowLayout(
    UIViewController,UICollectionViewDelegateFlowLayout
    )时,编译器会抱怨。感谢您“将估算大小设置为无”
    class ViewController: UIViewController, UICollectionViewDelegate, 
    UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let itemsPerRow:CGFloat = 2
        let padding:CGFloat = 20
        let itemWidth = (collectionView.bounds.width / itemsPerRow) - padding:CGFloat
        let itemHeight = collectionView.bounds.height - (2 * padding:CGFloat)
        return CGSize(width: itemWidth, height: itemHeight)
    }
    
         /// this method is used for flow layout
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let numberOfItemsPerRow:CGFloat = 3
        let spacingBetweenCells:CGFloat = 2
    
        // 2 is the value of sectionInset value
        
        let totalSpacing = (2 * 2) + ((numberOfItemsPerRow - 1) * spacingBetweenCells) //Amount of total spacing in a row
        if let collection = self.collectionAccounts{
            let width = (collection.bounds.width - totalSpacing)/numberOfItemsPerRow
            
            return CGSize(width: width, height: width)
        }else{
            return CGSize(width: 0, height: 0)
        }
    }