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:
class ViewController: UIViewController, UICollectionViewDelegate,
UICollectionViewDataSource, 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)
}
}