2013-07-15 5 views
0

Я сталкиваюсь с той же проблемой, что и here, которая является тем, что большой UICollectionViewCell (более чем вдвое превышает высоту UICollectionView) исчезает при заданном смещении прокрутки, а затем снова появляется после данного сдвига прокрутки.Большой UICollectionViewCell исчезает при прокрутке

Я реализовал @JonathanCichon solution, который подкласс UICollectionView и выполнить пользовательское действие на _visibleBounds (я знаю, что это частный API, но независимо от того, мне не нужно, чтобы представить его на Apple Store)

Вот мой собственный не вид коллекции:

#import "CollectionView.h" 

@interface UICollectionView() 

- (CGRect)_visibleBounds; 

@end 

@implementation CollectionView 

- (CGRect)_visibleBounds 
{ 
    CGRect rect = [super _visibleBounds]; 
    rect.size.height = [self heightOfLargestVisibleCell]; 
    return rect; 
} 

- (CGFloat)heightOfLargestVisibleCell 
{ 
    // get current screen height depending on orientation 
    CGFloat screenSize = [self currentScreenHeight]; 

    CGFloat largestCell = 0; 

    NSArray *visibleCells = self.visibleCells; 

    // get the largest height between visibleCells 
    for (UITableViewCell *c in visibleCells) 
    { 
     CGFloat h = c.frame.size.height; 
     largestCell = h > largestCell ? h : largestCell; 
    } 

    // return higher value between screen height and higher visible cell height 
    return MAX(largestCell, screenSize); 
} 

Это работает, больше не исчез прокрутки, но я до сих пор есть проблема: если я выполнить reloadData, когда моя позиция прокрутки находится в середине большой клетки, она исчезнет, ​​как раньше ... Я заметил, что после перезагрузки данных, visibleCells возвращение nil (в моем heightOfLargestVisibleCell методе), поэтому она принимает мою высоту экрана для _visibleBounds, но так как высота экрана < к текущей видимой высоте ячейки, это один не отображаются ...

Кто-то уже сталкивалось с этой проблемой?

Thx заблаговременно

ответ

1

У меня есть решение проблемы. Я сохраняю значение, вычисленное heightOfLargestVisibleCell, и возвращает последнее значение после перезагрузки данных.

@interface CollectionView : UICollectionView 
@property (nonatomic, assign) CGFloat lastLargestCellHeight; 
@property (nonatomic, assign) BOOL shouldEvalLargestCellHeight; 

@end 

@implementation CollectionView 

- (CGRect)_visibleBounds 
{ 
    CGRect rect = [super _visibleBounds]; 
    rect.size.height = [self heightOfLargestVisibleCell]; 
    return rect; 
} 


- (CGFloat)heightOfLargestVisibleCell 
{ 
    if (self.shouldEvalLargestCellHeight) { 
     // get current screen height depending on orientation 
     CGFloat screenSize = self.frame.size.height; 

     CGFloat largestCell = 0; 

     NSArray *visibleCells = self.visibleCells; 

     // get the largest height between visibleCells 
     for (UITableViewCell *c in visibleCells) 
     { 
      CGFloat h = c.frame.size.height; 
      largestCell = h > largestCell ? h : largestCell; 
     } 
     //return higher value between screen height and higher visible cell height 
     self.lastLargestCellHeight = MAX(largestCell, screenSize); 
     self.shouldEvalLargestCellHeight = NO; 
    } 
    return self.lastLargestCellHeight; 
} 

- (void)reloadData 
{ 
    self.shouldEvalLargestCellHeight = NO; 
    [super reloadData]; 
} 

- (void)setContentOffset:(CGPoint)contentOffset 
{ 
    self.shouldEvalLargestCellHeight = YES; 
    [super setContentOffset:contentOffset]; 
} 

@end 
+0

Thx много, он работает как шарм! – Yaman

Смежные вопросы