我UICollectionView细胞中含有多行文本UILabels。 我不知道该单元格的高度,直到文本已经在标签上设置。
-(CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
这是我看着大小细胞的初始方法。 然而,在细胞被创造出来的故事板的这就是所谓的。
有没有一种方法来布局的收集和大小的细胞后,都被渲染了,我知道电池的实际尺寸是多少?
我认为你正在寻找invalidateLayout
方法,你可以在电话会议上.collectionViewLayout
您UICollectionView的财产。 这种方法再生的布局,而你的情况也意味着调用-collectionView: layout: sizeForItemAtIndexPath:
这是反映您想要的商品尺寸正确的地方。 Jirune点如何计算它们的正确方向。
对于使用一个例子invalidateLayout
可以发现在这里 。 还请参阅对方法UICollectionViewLayout文档:
无效当前布局并触发布局更新。
讨论:
您可以随时调用此方法来更新布局信息。 这种方法无效集合视图本身的布局,并立即返回。 因此,你可以从相同的代码块中多次调用该方法,而不会触发多个布局更新。 下一个视图布局更新周期过程中发生的实际布局更新。
编辑:
对于包含自动布局约束故事板集合视图,你需要重写viewDidLayoutSubviews
的方法UIViewController
并调用invalidateLayout
在这种方法收集视图布局。
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
[yourCollectionView.collectionViewLayout invalidateLayout];
}
子类UICollectionViewCell和覆盖layoutSubviews
这样
在此,您将锚小区前缘和后缘的CollectionView
override func layoutSubviews() {
super.layoutSubviews()
self.frame = CGRectMake(0, self.frame.origin.y, self.superview!.frame.size.width, self.frame.size.height)
}
嘿,在上述delegate
方法本身,就可以计算出UILabel
使用下面的取巧的办法大小并返回UICollectionViewCell
size
根据该计算。
// Calculate the expected size based on the font and
// linebreak mode of your label
CGSize maximumLabelSize = CGSizeMake(9999,9999);
CGSize expectedLabelSize =
[[self.dataSource objectAtIndex:indexPath.item]
sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f]
constrainedToSize:maximumLabelSize
lineBreakMode:NSLineBreakByWordWrapping];
- (void)viewDidLoad {
self.collectionView.prefetchingEnabled = NO;
}
在IOS 10, prefetchingEnabled
是YES
默认。 当YES
,集合视图要求提前时,将显示它们的细胞。 这导致在iOS的10崩溃