6

コレクション ビューが reloadItemsAtIndexPaths で performBatchUpdate のときにデバイスを回転すると、コレクション ビューが正しく配置されなくなります。ただし、ビューは一定の位置にとどまります。

この問題を簡単に修正するには:

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}}
4

3 に答える 3

0

ここで同じ問題。UICollectionView のバグのようです。私が見つけた他の唯一の回避策は、回転後にコレクション ビューのフレームをリセットすることです。

reloadItemsAtIndexPathsだけでなく、ローテーション中のバッチ更新で発生するようです。

于 2013-10-17T05:44:11.450 に答える
0

UICollectionView の問題のようです。私の提案は、 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];
        }
    }];
于 2015-10-29T14:10:14.187 に答える
0

回転後にコレクションビューのフレームを再適用することでこれを処理しています:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    self.collectionView.frame = self.view.bounds;
}
于 2013-12-01T20:32:01.193 に答える