调整UICollectionView细胞中的数据已经被设置后(Resize UICollection

2019-07-04 16:50发布

我UICollectionView细胞中含有多行文本UILabels。 我不知道该单元格的高度,直到文本已经在标签上设置。

-(CGSize)collectionView:(UICollectionView *)collectionView
                 layout:(UICollectionViewLayout*)collectionViewLayout
 sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

这是我看着大小细胞的初始方法。 然而,在细胞被创造出来的故事板的这就是所谓的。

有没有一种方法来布局的收集和大小的细胞后,都被渲染了,我知道电池的实际尺寸是多少?

Answer 1:

我认为你正在寻找invalidateLayout方法,你可以在电话会议上.collectionViewLayout您UICollectionView的财产。 这种方法再生的布局,而你的情况也意味着调用-collectionView: layout: sizeForItemAtIndexPath:这是反映您想要的商品尺寸正确的地方。 Jirune点如何计算它们的正确方向。

对于使用一个例子invalidateLayout可以发现在这里 。 还请参阅对方法UICollectionViewLayout文档:

无效当前布局并触发布局更新。

讨论:

您可以随时调用此方法来更新布局信息。 这种方法无效集合视图本身的布局,并立即返回。 因此,你可以从相同的代码块中多次调用该方法,而不会触发多个布局更新。 下一个视图布局更新周期过程中发生的实际布局更新。

编辑:

对于包含自动布局约束故事板集合视图,你需要重写viewDidLayoutSubviews的方法UIViewController并调用invalidateLayout在这种方法收集视图布局。

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    [yourCollectionView.collectionViewLayout invalidateLayout];
}


Answer 2:

子类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)
    }


Answer 3:

嘿,在上述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];


Answer 4:

- (void)viewDidLoad {
    self.collectionView.prefetchingEnabled = NO;
}

在IOS 10, prefetchingEnabledYES默认。 当YES ,集合视图要求提前时,将显示它们的细胞。 这导致在iOS的10崩溃



文章来源: Resize UICollectionView cells after their data has been set