2014-10-14 3 views
1

회전 후 UICollectionView 먼저 눈에 보이는 항목을 유지하지만, 나는 다음과 같은 문제에 대한 솔루션을 찾을 수 없습니다 :내가 다른 StackOverflow의 질문에 대답을 검색

나는 플로우 레이아웃으로 UICollectionView를 사용하려고 해요을 (수직) 및 항목 크기를 화면 크기에 따라 결정합니다 (iPad의 너비 또는 가로 방향의 iPhone 너비를 활용해야 함).

UICollectionView는 세로 지향 iPhone에서는 항목의 열 하나를 표시하지만 가로 지향 iPhone에서는 2 개로 표시하려고합니다. 물론 iPad와 같이 더 많은 가로 방을 사용할 수 있다면 더 많은 열을 표시 할 수 있도록 일반화하십시오.

- (void)viewWillLayoutSubviews { 

    [super viewWillLayoutSubviews]; 

    UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout; 
    NSInteger columns = 1 + ((NSInteger)(CGRectGetWidth(self.collectionView.frame) - layout.sectionInset.left - layout.sectionInset.right + layout.minimumInteritemSpacing))/((NSInteger)(layout.minimumInteritemSpacing + 300.0 + 1.0)); 
    layout.itemSize = CGSizeMake((CGRectGetWidth(self.collectionView.frame) - layout.sectionInset.left - layout.sectionInset.right - ((columns - 1) * layout.minimumInteritemSpacing))/columns, layout.itemSize.height); 

    [layout invalidateLayout]; 
} 

이 꽤 잘 작동하고 내 전화를 회전 할 때, 내가 대신 한 두 개의 열을 표시하는 레이아웃을 볼 수

이 동작을 달성하기 위해, 나는 다음과 같은했다.

하지만 UICollectionView가 회전 후에 첫 번째 보이는 항목을 유지하도록 할 수는 없습니다. 이전에 회전 한 내용으로 내용 오프셋을 설정하기 때문입니다. 레이아웃이 변경되고 UICollectionView가 가로로 두 개의 열을 표시 할 때이 새로운 내용 오프셋은 동일한 항목에 해당하지만 새 레이아웃 아래에 새로운 값을 가져야합니다.

내가 다음 코드를 사용하여 시도,하지만 난 그게 작업을 진행하게 관리하지 않았다

: dispatch_after를 사용

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

    NSIndexPath *firstAddShowCellIndexPath = [[[self.collectionView indexPathsForVisibleItems] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
     NSIndexPath *ip1 = obj1; 
     NSIndexPath *ip2 = obj2; 
     return [ip1 compare:ip2]; 
    }] firstObject]; 

    if (firstAddShowCellIndexPath) { 
     [self.collectionView scrollToItemAtIndexPath:firstAddShowCellIndexPath atScrollPosition:UICollectionViewScrollPositionTop animated:YES]; 
    } 
} 

내가 UICollectionView가 회전하는 동안 오프셋 (offset) 컨텐츠를 처리하기 위해 노력하고있다 의심, 그래서 시도조차 또는 willRotateToInterfaceOrientation이지만 작동했지만 회전이 끝난 후 콘텐츠 오프셋을 늦게 설정하여 정말 나쁜 사용자 환경을 제공했습니다.

아이디어가 있으십니까?

감사합니다.

답변

0

이 나를 위해 일한,

대신 willRotation 방법이 추가

이 등 이전과 회전 후 열을 만들기위한 내 빠른 코드,

단지 예로서
#pragma mark - Rotation 
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [self.collectionView.collectionViewLayout invalidateLayout]; 
} 

#pragma mark <UICollectionViewDelegateFlowLayout> 
- (CGSize)collectionView:(UICollectionView *)collectionView layout(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath*)indexPath 
{ 
    int width = roundf(self.collectionView.frame.size.width/2.0) - 15; 
    int height = roundf(width * 0.8); 
    return CGSizeMake(width, height); 
} 

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 
{ 
    UIEdgeInsets new = UIEdgeInsetsMake(10, 10, 10, 10); 
    return new; 
} 
관련 문제