动画 UICollectionView 补充视图调整大小
Animating a UICollectionView supplementary view resize
我正在使用来自 https://github.com/jamztang/CSStickyHeaderFlowLayout
的 CSStickyHeaderFlowLayout
作为我的应用程序的一部分,我在 header view/cell 中有一个按钮,该按钮发送到需要增长的 collection 视图。 collection 视图依次更改 CSStickyHeaderFlowLayout 中的 header 首选大小,并将 invalidateLayout 发送到 CSStickyHeaderFlowLayout。尝试通过动画块制作动画效果不佳,因为它会将 header 从按钮移动到顶部。这真的很奇怪。有没有办法让 flowLayout 正确地为补充视图中的变化设置动画?
这是我更改尺寸的代码。
- (void)treckDetailMapCellSizeToggle:(BOOL)toggle {
//Modifier l'attribu de la map et invalider le layout pour le redessiner.
CSStickyHeaderFlowLayout *layout = (id)self.collectionViewLayout;
if ([layout isKindOfClass:[CSStickyHeaderFlowLayout class]]) {
[UIView animateWithDuration:0.5 animations: ^{
if (isMapCellExpended) {
isMapCellExpended = NO;
layout.parallaxHeaderReferenceSize = CGSizeMake(self.view.frame.size.width, HEADER_VIEW_PREFERED_SIZE);
}
else {
isMapCellExpended = YES;
layout.parallaxHeaderReferenceSize = CGSizeMake(self.view.frame.size.width, HEADER_VIEW_MAX_SIZE);
}
[layout invalidateLayout];
}];
}
}
这是我点击名为 "Ajouter a la carte" 的按钮时发生的事情的视频。
https://www.youtube.com/watch?v=aqm99HebvwE
编辑:
感谢阅读此页面(我以前从未见过)。我发现这会使它好一点但不能解决问题。 :
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
CSStickyHeaderFlowLayout *layout = (id)self.collectionViewLayout;
if ([layout isKindOfClass:[CSStickyHeaderFlowLayout class]]) {
[self.collectionView performBatchUpdates: ^{
preferedSize = preferedSize == 200 ? 300 : 200;
layout.parallaxHeaderReferenceSize = CGSizeMake(self.view.frame.size.width, preferedSize);
} completion: ^(BOOL finished) {
}];
}
}
与其尝试自己制作动画,不如调用
[collectionView.collectionViewLayout invalidateLayout];
UICollectionView can't collapse or remove supplementary view
要为大小更改设置动画,请在视图动画闭包中使布局无效。尺寸本身应该通过适当的布局委托方法设置,例如collectionView(collectionView:collectionViewLayout:referenceSizeForHeaderInSection:)
UIView.animate(withDuration: 0.33) {
self.collectionView.collectionViewLayout.invalidateLayout()
}
我正在使用来自 https://github.com/jamztang/CSStickyHeaderFlowLayout
的 CSStickyHeaderFlowLayout作为我的应用程序的一部分,我在 header view/cell 中有一个按钮,该按钮发送到需要增长的 collection 视图。 collection 视图依次更改 CSStickyHeaderFlowLayout 中的 header 首选大小,并将 invalidateLayout 发送到 CSStickyHeaderFlowLayout。尝试通过动画块制作动画效果不佳,因为它会将 header 从按钮移动到顶部。这真的很奇怪。有没有办法让 flowLayout 正确地为补充视图中的变化设置动画?
这是我更改尺寸的代码。
- (void)treckDetailMapCellSizeToggle:(BOOL)toggle {
//Modifier l'attribu de la map et invalider le layout pour le redessiner.
CSStickyHeaderFlowLayout *layout = (id)self.collectionViewLayout;
if ([layout isKindOfClass:[CSStickyHeaderFlowLayout class]]) {
[UIView animateWithDuration:0.5 animations: ^{
if (isMapCellExpended) {
isMapCellExpended = NO;
layout.parallaxHeaderReferenceSize = CGSizeMake(self.view.frame.size.width, HEADER_VIEW_PREFERED_SIZE);
}
else {
isMapCellExpended = YES;
layout.parallaxHeaderReferenceSize = CGSizeMake(self.view.frame.size.width, HEADER_VIEW_MAX_SIZE);
}
[layout invalidateLayout];
}];
}
}
这是我点击名为 "Ajouter a la carte" 的按钮时发生的事情的视频。
https://www.youtube.com/watch?v=aqm99HebvwE
编辑:
感谢阅读此页面(我以前从未见过)。我发现这会使它好一点但不能解决问题。 :
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
CSStickyHeaderFlowLayout *layout = (id)self.collectionViewLayout;
if ([layout isKindOfClass:[CSStickyHeaderFlowLayout class]]) {
[self.collectionView performBatchUpdates: ^{
preferedSize = preferedSize == 200 ? 300 : 200;
layout.parallaxHeaderReferenceSize = CGSizeMake(self.view.frame.size.width, preferedSize);
} completion: ^(BOOL finished) {
}];
}
}
与其尝试自己制作动画,不如调用
[collectionView.collectionViewLayout invalidateLayout];
UICollectionView can't collapse or remove supplementary view
要为大小更改设置动画,请在视图动画闭包中使布局无效。尺寸本身应该通过适当的布局委托方法设置,例如collectionView(collectionView:collectionViewLayout:referenceSizeForHeaderInSection:)
UIView.animate(withDuration: 0.33) {
self.collectionView.collectionViewLayout.invalidateLayout()
}