我有一个UICollectionView
与UICollectionViewFlowLayout
,我想计算出其含量大小(以回报intrinsicContentSize
需要通过自动版式调整它的高度)。
存在的问题是:即使我有所有的细胞固定和相等的高度,我不知道有多少“行” /线路必须在UICollectionView
。 我还不能通过在我的数据源的项数确定计数,由于表示所述数据项的单元的宽度不同,所以确实因此我在的一行的项目数UICollectionView
。
因为我无法找到关于此主题的任何暗示的官方文档和谷歌搜索没有给我带来任何进一步的,任何帮助和想法,将不胜感激非常多。
哇! 出于某种原因,研究小时后,我现在发现一个很容易回答我的问题:我完全搜索在错误的地方,通过所有我能找到的文档挖UICollectionView
。
简易的解决办法是在基础布局:只需拨打collectionViewContentSize
您myCollectionView.collectionViewLayout
财产,你会得到内容的高度和宽度CGSize
。 它就是这么简单。
如果你正在使用自动布局 ,那么你可以创建一个子类UICollectionView
如果使用下面的代码,那么你不必因为它会变化基于集合视图中的内容集合视图指定任何高度的限制。
下面给出的实施:
@interface DynamicCollectionView : UICollectionView
@end
@implementation DynamicCollectionView
- (void) layoutSubviews
{
[super layoutSubviews];
if (!CGSizeEqualToSize(self.bounds.size, [self intrinsicContentSize]))
{
[self invalidateIntrinsicContentSize];
}
}
- (CGSize)intrinsicContentSize
{
CGSize intrinsicContentSize = self.contentSize;
return intrinsicContentSize;
}
@end
在viewDidAppear
你可以得到它:
float height = self.myCollectionView.collectionViewLayout.collectionViewContentSize.height;
也许当你重新加载数据,则需要计算新数据的新高度,那么你可以得到它:添加观察员听,当你CollectionView
在完成重装数据viewdidload
:
[self.myCollectionView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionOld context:NULL];
然后加入波纹管的功能,以获得新的高度或成品的CollectionView重载之后做任何事情:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
//Whatever you do here when the reloadData finished
float newHeight = self.myCollectionView.collectionViewLayout.collectionViewContentSize.height;
}
而且不要忘记删除观察员:
[self.myCollectionView removeObserver:self forKeyPath:@"contentSize" context:NULL];
user1046037回答斯威夫特...
class DynamicCollectionView: UICollectionView {
override func layoutSubviews() {
super.layoutSubviews()
if bounds.size != intrinsicContentSize() {
invalidateIntrinsicContentSize()
}
}
override func intrinsicContentSize() -> CGSize {
return self.contentSize
}
}
对于user1046037答案斯威夫特3码
import UIKit
class DynamicCollectionView: UICollectionView {
override func layoutSubviews() {
super.layoutSubviews()
if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) {
self.invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
return contentSize
}
}
这是为时已晚来回答这个问题,但我最近通过这个问题了。
@李的上面的回答帮了我很多,让我的答案。 但是这个答案只限于Objective-C和我在工作迅速 。
@lee参考答案,请允许我让用户迅速得到这个问题很容易解决。 为此,请按照下列步骤操作:
声明一个CGFloat
在声明部分变量:
var height : CGFloat!
在viewDidAppear
你可以得到它:
height = self.myCollectionView.collectionViewLayout.collectionViewContentSize().height
也许当你reload
数据,则需要计算新数据的新高度,那么你可以得到它: addObserver
听,当你CollectionView
在完成重装数据viewWillAppear
:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(true)
....
....
self.shapeCollectionView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.Old, context: nil)
}
然后加入波纹管的功能,以获得新的高度或以后做任何事情collectionview
完成重装:
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
let newHeight : CGFloat = self.myCollectionView.collectionViewLayout.collectionViewContentSize().height
var frame : CGRect! = self.myCollectionView.frame
frame.size.height = newHeight
self.myCollectionView.frame = frame
}
而且不要忘记删除观察员:
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
....
....
self.myCollectionView.removeObserver(self, forKeyPath: "contentSize")
}
我希望这将帮助你解决你的问题迅速。
斯威夫特4
class DynamicCollectionView: UICollectionView {
override func layoutSubviews() {
super.layoutSubviews()
if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) {
self.invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
return collectionViewLayout.collectionViewContentSize
}
}
雨燕4.2
class DynamicCollectionView: UICollectionView {
override func layoutSubviews() {
super.layoutSubviews()
if bounds.size != intrinsicContentSize {
invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
return self.contentSize
}
}
@ user1046037的斯威夫特版本:
public class DynamicCollectionView: UICollectionView {
override public func layoutSubviews() {
super.layoutSubviews()
if !bounds.size.equalTo(intrinsicContentSize) {
invalidateIntrinsicContentSize()
}
}
override public var intrinsicContentSize: CGSize {
let intrinsicContentSize: CGSize = contentSize
return intrinsicContentSize
}
}
另外:你最好打电话reloadData
通过获得高度前: myCollectionView.collectionViewLayout.collectionViewContentSize