UICollectionView performBatchUpdates在旋转设备时导致collectionview错位

如果我旋转设备而collectionview执行与reloadItemsAtIndexPathsBatchUpdate,集合视图将错位。 但观点仍然保持不变。

简单地解决这个问题:

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

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

有没有人有更好的主意?

干杯。

这是我的代码:

  - (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中的一个错误。 我能find的唯一的其他解决方法是重置旋转后的集合视图的框架。

它发生在任何批处理更新期间看来,不只是reloadItemsAtIndexPaths。

我通过在循环后重新强制收集视图的框架来处理这个问题:

 - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { self.collectionView.frame = self.view.bounds; } 

这似乎是一个UICollectionView问题。 我的build议是在performBatchUpdates完成后设置框架

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