UICollectionView执行BatchUpdates导致旋转设备时collectionview错位

2024-02-27

如果我旋转设备,同时使用 reloadItemsAtIndexPaths 执行 CollectionView PerformBatchUpdate ,集合视图将被放错位置。但视图仍将保持在恒定位置。

要简单地解决此问题:

setting [UIView setAnimationEnabled: NO]; in willRotateToInterfaceOrientation
+ 
setting [UIView setAnimationEnabled: YES]; in didRotateToInterfaceOrientation

但我认为这不是解决这个问题的好方法。

有人有更好的主意吗?

Cheers.

这是我的代码:

    - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    NSLog(@"Before Rotation");
    NSLog(@"collecitonview Rect : %@", NSStringFromCGRect(self.collectionView.frame));
    NSLog(@"view Rect : %@", NSStringFromCGRect(self.view.frame));
}

    - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    NSLog(@"After Rotation");
    NSLog(@"collecitonview Rect : %@", NSStringFromCGRect(self.collectionView.frame));
    NSLog(@"view Rect : %@", NSStringFromCGRect(self.view.frame));
}

    - (void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    for(int i = 0 ; i < 30; i++){
        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
            CGFloat hue = arc4random() % 20;
            [self.collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:hue inSection:0]]];
        }];
        [_operationsArray addObject:operation];
    }
    [self performUpdate];
}

    - (void)performUpdate{

    if(_operationsArray.count ==  0)return;

    [self.collectionView performBatchUpdates:^{
        NSBlockOperation *operation = (NSBlockOperation*)[_operationsArray firstObject];
        [operation start];
    } completion:^(BOOL finished) {
        if(_operationsArray.count !=  0){
            [_operationsArray removeObjectAtIndex:0];
            [self performUpdate];
        }
    }];
}

输出:(如果我在执行更新期间旋转设备)

2013-10-16 17:05:18.445 collectionviewbatchupdateTest[90419:a0b] Before Rotation
2013-10-16 17:05:18.446 collectionviewbatchupdateTest[90419:a0b] collecitonview Rect : {{0, 0}, {1024, 768}}
2013-10-16 17:05:18.446 collectionviewbatchupdateTest[90419:a0b] view Rect : {{0, 0}, {768, 1024}}
2013-10-16 17:05:18.851 collectionviewbatchupdateTest[90419:a0b] After Rotation
2013-10-16 17:05:18.851 collectionviewbatchupdateTest[90419:a0b] collecitonview Rect : {{-128, 0}, {1024, 1024}}
2013-10-16 17:05:18.852 collectionviewbatchupdateTest[90419:a0b] view Rect : {{0, 0}, {768, 1024}}

这里同样的问题。它看起来像是 UICollectionView 中的一个错误。我能找到的唯一其他解决方法是在旋转后重置集合视图的框架。

它似乎发生在轮换期间的任何批量更新中,而不仅仅是 reloadItemsAtIndexPaths。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UICollectionView执行BatchUpdates导致旋转设备时collectionview错位 的相关文章

随机推荐