gpt4 book ai didi

ios - 在旋转时调整 UICollectionViewCell 的大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:49 25 4
gpt4 key购买 nike

我有一个占据整个屏幕的 UICollectionView。 UICollectionView 的单元格与 UICollectionView 本身一样大,我使用分页。

在设备旋转时,我希望单元格将它们的大小调整为新的 UICollectionView 大小。我目前通过在 willAnimateRotationToInterfaceOrientation::

中交换布局对象来实现这一点
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];

[_collectionView setCollectionViewLayout:[self collectionViewFlowLayoutForOrientation:toInterfaceOrientation] animated:YES];
}

collectionViewFlowLayoutForOrientation: 如下:

- (UICollectionViewFlowLayout *)collectionViewFlowLayoutForOrientation:(UIInterfaceOrientation)orientation
{
CGSize screenSize = [[UIScreen mainScreen] bounds].size;

CGFloat width = UIInterfaceOrientationIsLandscape(orientation) ? MAX(screenSize.width, screenSize.height) : MIN(screenSize.width, screenSize.height);
CGFloat height = UIInterfaceOrientationIsLandscape(orientation) ? MIN(screenSize.width, screenSize.height) : MAX(screenSize.width, screenSize.height);

UICollectionViewFlowLayout *collectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[collectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[collectionViewFlowLayout setItemSize:CGSizeMake(width, height)];
[collectionViewFlowLayout setMinimumLineSpacing:0.0f];
[collectionViewFlowLayout setSectionInset:UIEdgeInsetsZero];
[collectionViewFlowLayout setMinimumInteritemSpacing:0.0f];

return collectionViewFlowLayout;
}

它没有按预期工作。

首先,我在控制台中收到一条消息,表明我可能正在做一些不完全合法的事情:

the behavior of the UICollectionViewFlowLayout is not defined because: 
the item height must be less than the height of the UICollectionView minus the section insets top and bottom values.

这是一个公平的消息,当开始动画旋转时,屏幕/UICollectionView 仍然具有旧方向的框架。我倾向于遵守它。

其次,旋转后 contentOffset 不正确,因为它没有被重新计算。

我看到其他解决方案只是使 willRotateToInterfaceOrientation:duration: 中的布局无效,但这也不会重新计算 contentOffset。我通过如下更改 contentOffsetcontentSize 来跟进它,但结果也不完美:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
CGSize fromCollectionViewSize = [self collectionViewSizeForOrientation:[self interfaceOrientation]];
CGSize toCollectionViewSize = [self collectionViewSizeForOrientation:toInterfaceOrientation];

CGFloat currentPage = [_collectionView contentOffset].x / [_collectionView bounds].size.width;
NSInteger itemCount = [_collectionView numberOfItemsInSection:0];

UICollectionViewFlowLayoutInvalidationContext *invalidationContext = [[UICollectionViewFlowLayoutInvalidationContext alloc] init];

[invalidationContext setContentSizeAdjustment:CGSizeMake((toCollectionViewSize.width - fromCollectionViewSize.width) * itemCount, toCollectionViewSize.height - fromCollectionViewSize.height)];
[invalidationContext setContentOffsetAdjustment:CGPointMake(currentPage * toCollectionViewSize.width - [_collectionView contentOffset].x, 0)];

[[_collectionView collectionViewLayout] invalidateLayoutWithContext:invalidationContext];

[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}

那么,我的问题是:什么样的解决方案能给出预期的结果?

最佳答案

尝试添加行 [_collectionView invalidateIntrinsicContentSize] 就在您设置布局之前。这应该会导致它重新计算布局,并希望摆脱您的警告消息。

关于ios - 在旋转时调整 UICollectionViewCell 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26611419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com