我试图在UICollectionViewCells
创建响应/适应性UIStoryboard
时发现摩擦。
我看到的问题是你似乎无法设置每个Cell Size
的Size Class
,我正在努力确定正确的方法。我设计了细胞以适应它们的容器,因此无论大小等级如何,它们都应该自动调整大小。这主要是因为如果我改变大小类,选择我的单元格视图并执行Update Frames
然后它们都调整大小以适应它们的新大小。然而,这是一次性的交易,如果我回到任何/任何规模的类,那么我仍然看到调整大小的版本。
这是我知道我可以尝试的:
UICollectionViews
将是一个痛苦我希望这是一个解决方案,我只是遗漏了一些东西,但我知道可能是IB工具在这一点上与代码不匹配。
我想出的解决方案只是实现UICollectionViewDelegateFlowLayout
并实现sizeForItemAtIndexPath
方法。这意味着可以将单元格尺寸设置为与可用的Size Class
尺寸相匹配。
这仍然不理想,因为您无法看到故事板中的更改,您无法创建通用设计并以每种不同的格式查看它。
我仍然希望有人有更好的选择。
这是一个在Swift中编码的类似解决方案。我只是在故事板中设置了我的两个单元格,并让它们可以查看任何大小类组合。当特征集合改变时,我更新了我想要使用的cellSize和cellReuseID,并告诉collectionView重新加载所有可见的单元格。然后
collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
和
override func collectionView(collectionView: UICollectionView,
cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
(调用示例代码中未显示)可以让我更新单元格的大小并更新单元格的故事板样式。所以在故事板中并没有完全完成,但在Xcode中提供更多支持之前已经足够了。
struct MyCollectionViewConstants{
static let CELL_ANY_ANY_REUSE_ID = "cell";
static let CELL_COMPACT_REGULAR_REUSE_ID = "cellSmall"
static let CELL_ANY_ANY_SIZE = 100;
static let CELL_COMPACT_REGULAR_SIZE = 70;
}
class MyCollectionView: UICollectionViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
var cellSize = MyCollectionViewConstants.CELL_ANY_ANY_SIZE
var cellReuseID = MyCollectionViewConstants.CELL_ANY_ANY_REUSE_ID
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{
return CGSize(width: cellSize, height: cellSize)
}
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact
&& self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClass.Regular){
cellSize = MyCollectionViewConstants.CELL_COMPACT_REGULAR_SIZE
cellReuseID = MyCollectionViewConstants.CELL_COMPACT_REGULAR_REUSE_ID
} else {
cellSize = MyCollectionViewConstants.CELL_ANY_ANY_SIZE
cellReuseID = MyCollectionViewConstants.CELL_ANY_ANY_REUSE_ID
}
self.collectionView.reloadItemsAtIndexPaths(
self.collectionView.indexPathsForVisibleItems())
}
}
在实施尺寸等级(iPad和iPhone)之后我遇到了同样的问题。好吧,我想出了一个解决方案。希望能帮助到你!
实现UICollectionViewDelegateFlowLayout。
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
var device = UIDevice.currentDevice().model
var cellSize:CGSize = CGSizeMake(155, 109)
if (device == "iPad" || device == "iPad Simulator") {
cellSize = CGSizeMake(240, 220)
}
return cellSize
}
斯威夫特4 各位开发人员,
如果UICollectionViewCell的高度和宽度相同,这很容易做到。
脚步 1.导入** UICollectionViewDelegateFlowLayout ** 2.添加UICOllectionView的sizeForItem IndexPath方法,如下所示
func collectionView(_ collectionView : UICollectionView,layout collectionViewLayout:UICollectionViewLayout,sizeForItemAt indexPath:IndexPath) -> CGSize {
return CGSize(width: collectionVw.frame.size.height, height: collectionVw.frame.size.height)
}
注意:发生的事情是您将UICollectionView的高度设置为UICollectionViewCell的高度和宽度
快乐编码:)