如何在swift中动态更改集合视图的大小?
问题描述:
我想要做的象下面这样: 如何在swift中动态更改集合视图的大小?
我已经子类UICollectionViewLayout和我的代码是
var horizontalInset = 0.0 as CGFloat
var verticalInset = 0.0 as CGFloat
var itemHeight = 0.0 as CGFloat
var _layoutAttributes = Dictionary<String, UICollectionViewLayoutAttributes>()
var _contentSize = CGSizeZero
var arrSize:[Int] = [0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0]
var random:Int?
var increaseRow = false
// MARK: -
// MARK: Layout
override func prepareLayout() {
super.prepareLayout()
_layoutAttributes = Dictionary<String, UICollectionViewLayoutAttributes>() // 1
let path = NSIndexPath(forItem: 0, inSection: 0)
let attributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withIndexPath: path)
let headerHeight = CGFloat(self.itemHeight/4)
attributes.frame = CGRectMake(0, 0, self.collectionView!.frame.size.width, headerHeight)
let headerKey = layoutKeyForHeaderAtIndexPath(path)
_layoutAttributes[headerKey] = attributes // 2
let numberOfSections = self.collectionView!.numberOfSections() // 3
var yOffset:CGFloat = 0.0
for var section = 0; section < numberOfSections; section++ {
let numberOfItems = self.collectionView!.numberOfItemsInSection(section) // 3
var xOffset:CGFloat?
for var item = 0; item < numberOfItems; item++ {
let range = UInt32(19)
random = Int(arc4random_uniform(range))
let indexPath = NSIndexPath(forItem: item, inSection: section)
let attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath) // 4
var itemSize = CGSizeZero
var increaseRow = false
itemSize = randomItemSize() // 5
if item == 0
{
xOffset = self.horizontalInset
attributes.frame = CGRectIntegral(CGRectMake(xOffset!, yOffset, itemSize.width, itemSize.height))
let key = layoutKeyForIndexPath(indexPath)
_layoutAttributes[key] = attributes // 7
}else
{
let previousIndexPath = NSIndexPath(forItem:indexPath.item-1, inSection:indexPath.section)
let key = layoutKeyForIndexPath(previousIndexPath)
let previousFrame:UICollectionViewLayoutAttributes = _layoutAttributes[key]!
if xOffset! + previousFrame.size.width + itemSize.width > self.collectionView!.frame.size.width
{
yOffset += self.horizontalInset+previousFrame.size.height
xOffset = horizontalInset
attributes.frame = CGRectIntegral(CGRectMake(xOffset!, yOffset, itemSize.width, itemSize.height))
print("In if")
print("\n\(item):\(NSStringFromCGRect(attributes.frame))")
let key = layoutKeyForIndexPath(indexPath)
_layoutAttributes[key] = attributes // 7
}else
{
xOffset = xOffset! + horizontalInset + previousFrame.size.width
attributes.frame = CGRectIntegral(CGRectMake(xOffset!, yOffset, itemSize.width, itemSize.height))
print("In else")
print("\n\(item):\(NSStringFromCGRect(attributes.frame))")
let key = layoutKeyForIndexPath(indexPath)
_layoutAttributes[key] = attributes // 7
}
}
}
}
yOffset += self.itemHeight // 10
_contentSize = CGSizeMake(self.collectionView!.frame.size.width, yOffset + self.verticalInset) // 11
}
,但得到的输出象下面这样:
你能告诉我我是什么失踪?我对swift和收集视图都很陌生。我从https://github.com/bryceredd/RFQuiltLayout得到参考,但没有得到它的代码。请帮助解决我的问题
答
设置集合视图的高度约束,并在故事板中设置一些默认值,并在您的类中为该约束创建一个对象。
@IBOutlet weak var collectionViewHeight: NSLayoutConstraint!
获取后重装()方法集合视图的内容高度并设置高度约束的恒定值
collection_view.reloadData()
let height = collection_view.collectionViewLayout.collectionViewContentSize().height
collectionViewHeight.constant = height
collectionViewHeight.constant = height
你检查的https://github.com/chiahsien/CHTCollectionViewWaterfallLayout – 2015-03-04 05:29:38
@ZaidPathan你能解释一下自己做定制布局的方法吗? – 2015-03-05 05:30:35
这可以通过UIScrollView更加准确地实现。尝试使用不同的帧创建UIImageView并将其添加到滚动视图。 – 2016-03-17 11:54:57