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]; } }];
- Objective-C中的自动释放池 – 释放主要的AutoreleasePool?
- 我可以从UIActivityViewController和原生UIActivityTypePostToTwitter微博animationGIF吗?
- 将图像编码为base64,获取无效的base64string(使用base64EncodedStringWithOptions的ios)
- 由于UI点击手势Swift解决方案,没有调用didSelectRowAtIndexPath?
- 如何使用autolayout缩放所有屏幕尺寸的视图?
- 什么是Swift.AnyClass?
- 如何将closuresbutton添加到UIModalPresentationPageSheet中提供的模态视图angular?
- UITableView单元格重叠
- 在GameScene中显示一个UIAlertController(SpriteKit / Swift)
- Xcode:请求打开应用程序失败
- MFMailComposeViewController立即解散