使用autolayout中的内部大小动态调整UICollectionView的大小

时间:2012-11-14 17:04:27

标签: autolayout uicollectionview

我正在尝试使用UICollectionView实现日历,该日历在更改月份时具有与内置日历应用程序类似的滚动行为。目前,由于调整大小在几个月之间发生,因此视图会闪烁。

我正在使用带有UICollectionView的UICollectionViewScrollLayout,其中1个部分包含10000个索引。通过计算索引的日期来填充单元格。我遇到的问题是当试图调整视图大小以适合当月的正确周数时,当滚动和视图大小发生变化时,集合视图似乎不会足够快地在单元格中绘制。放慢动画速度后,随着视图大小的变化,似乎从视图中过早删除了单元格。减少和放大视图都会发生这种情况。也就是说,当他们即将滚动视图时,它们会在滚出视图之前被删除。

布局全部使用自动布局完成,上面有固定视图,然后是下面的可调整大小的视图。随着集合视图的大小发生变化,下面的视图会发生变化以填充空间。我似乎设法实现这种行为的唯一方法是根据下面的代码更改内在大小。我试过更改框架/边界但它似乎不适用于autolayout。我是否正在以正确的方式调整视图大小?

我应该将行为移动到viewcontroller并更改固定高度的约束。

// Scroll the view to the date given.
-(void) moveViewToDate:(NSDate*) date
{
    NSIndexPath *indexPath=[self indexPathForFirstDayInMonth:date];
    [self scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionTop animated:YES];

    [UIView animateWithDuration:0.25f animations:^{
        self.isize=[self weeksInViewForDate:date];
       [self invalidateIntrinsicContentSize];
       [self.superview layoutIfNeeded];
    }];
}

-(CGSize)intrinsicContentSize
{
    return CGSizeMake(322,self.isize*46);   
}

1 个答案:

答案 0 :(得分:0)

我终于知道发生了什么。因为我提交的动画正在改变视图的大小并进行滚动,所以两个单独的动画相互冲突。

我最终使用UIScrollView重写了该集合,但遇到了同样的问题。我通过将UIScrollView放在UIView中来绕过它。使用对动画高度的约束来调整UIView的大小。