使用自动布局中的固有大小动态调整 UICollectionView 的大小

Posted

技术标签:

【中文标题】使用自动布局中的固有大小动态调整 UICollectionView 的大小【英文标题】:dynamic resizing of UICollectionView using intrinsic size within an autolayout 【发布时间】:2012-11-14 17:04:26 【问题描述】:

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

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

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

我是否应该将行为移动到视图控制器并更改固定高度的约束。

// 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】:

我终于弄清楚发生了什么。由于我正在提交一个改变视图大小并进行滚动的动画,因此这两个单独的动画相互冲突。

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

【讨论】:

以上是关于使用自动布局中的固有大小动态调整 UICollectionView 的大小的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局的 UITableView 中的动态 UITextView 高度?

使用自动布局动态更改子视图后调整超级视图的大小

自动布局以动态调整 UILabel 大小不起作用

使用自动布局约束动态调整表格视图单元格的大小

动态调整视图大小(拖动运动)时自动布局约束中断

自动布局:窗口调整大小时如何更改框架的原点?