2012-10-01 69 views
10

我使用的是UICollectionView編程的FlowLayout不滾動。UICollectionView與設置部分插圖時

我已經設置它的框架如下:

UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 3000) collectionViewLayout:flowLayout]; 

UICollectionViewFlowLayout有一節插圖設置爲:

flowLayout.sectionInset = UIEdgeInsetsMake(20.0, 20.0, 100.0, 20.0); 

我也只有1節。

我設置的高度是3000,看是否集合視圖會滾動,但事實並非如此。我設置它,因爲集合視圖似乎沒有向上或向下滾動時,我插入新項目。

UICollectionViewUIScrollView開始分類,這意味着我可以保持重置滾動視圖的內容大小。這會正常工作嗎?

唯一的問題是,如果我知道的所有項目的大小,包括許多項目是如何在每一行這樣的工作。

如果每個項目有不同的尺寸,我將如何找出每行的大小?我需要添加所有行大小並增加self.collectionView的內容大小高度。

編輯

即使我的上述建議,重置內容的大小,不能正常工作!更新我的收藏視圖時,我嘗試了以下方法:

int numberOfRows = self.dataArray.count/3; 
self.collectionView.contentSize = CGSizeMake(self.view.frame.size.width, (numberOfRows * 200) + 300); 

雖然這很醜陋。這是因爲它假設我的所有圖像尺寸都是200x200px,每行適合3張圖像(因此除以3)。

而且,即使有300,我有,最後一排,我只能看到它的大約3/4,而不是它的全部。我必須滾動更多,我才能看到它,但它又回到3/4。它有點像滾動刷新,只有拖動視圖纔會移動視圖,而當您離開視圖時,視圖會回滾到原來的位置。這是爲什麼發生?難道僅僅是蘋果設計UICollectionView如此糟糕?這有點荒謬...... UITableViews根據其內容自動調整其滾動。

回答

13

在回答你的一些關於UICollectionView其他問題,我創造了這個示範項目,並滾動就好了,所以我不知道你有什麼問題。爲了使最後一行完全可見,唯一需要做的就是將底部插入的大小增加到90.我還爲performBatchUpdates添加了一個完成方法:completion:自動滾動以便最後添加的項目可見(請注意,我使用performSelector添加了一些額外的項目; withObject:afterDelay :)。我的圖像是48x48,我只是將我的收藏視圖設置爲我的控制器視圖的邊界。下面是代碼,所以你可以把它比作你有什麼:

@interface ViewController() <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> { 
NSMutableArray *newData; 
} 
@property (nonatomic, retain) UICollectionView *collectionView; 
@property (nonatomic, retain) NSMutableArray *results; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    self.results = [NSMutableArray array]; 
    int i = 11; 
    while (i<91) { 
     UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"New_PICT00%d.jpg",i]]; 
     [self.results addObject:image]; 
     i++; 
    } 

    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; 
    //flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; 

    self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:flowLayout]; 
    self.collectionView.dataSource = self; 
    self.collectionView.delegate = self; 
    self.view.backgroundColor = [UIColor blackColor]; 
    [self.view addSubview:self.collectionView]; 
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"]; 
    //[self.collectionView registerClass:[RDCell class] forCellWithReuseIdentifier:@"myCell"]; 
    [self.collectionView reloadData]; 

    [self performSelector:@selector(addNewImages:) withObject:nil afterDelay:3]; 
} 

-(void)addNewImages:(id)sender { 
    newData = [NSMutableArray array]; 
    int i = 102; 
    while (i<111) { 
     UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"New_PICT0%d.jpg",i]]; 
     [newData addObject:image]; 
     i++; 
    } 
    [self addNewCells]; 
} 

-(void)addNewCells { 
    NSMutableArray *arrayWithIndexPaths = [NSMutableArray array]; 
    [self.collectionView performBatchUpdates:^{ 
     int resultsSize = [self.results count]; 
     [self.results addObjectsFromArray:newData]; 
     for (int i = resultsSize; i < resultsSize + newData.count; i++) 
      [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 
     [self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths]; 
    } 
    completion: ^(BOOL finished){ 
     [self.collectionView scrollToItemAtIndexPath:arrayWithIndexPaths.lastObject atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES]; 
    }]; 
} 


- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section { 
    return [self.results count]; 
} 

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView { 
    return 1; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    //cell.iv.image = [self.results objectAtIndex:indexPath.row]; 
    cell.backgroundColor = [UIColor colorWithPatternImage:[self.results objectAtIndex:indexPath.row]]; 
    return cell; 
} 


- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UIImage *image = [self.results objectAtIndex:indexPath.row]; 
    return CGSizeMake(image.size.width, image.size.height); 
} 

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { 
    return UIEdgeInsetsMake(10, 10, 90, 10); 
} 

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"Selected Image is Item %d",indexPath.row); 
} 
9

設置UICollectionView到3000的高度將讓你的滾動問題變得更糟。如果UICollectionView的像素高度爲3000像素,則只有在其內容超過3000個像素的情況下才需要滾動。您應該將其設置爲其所在視圖的高度(與寬度相同)。

據我所知的也不要設置contentSize直接,而不是你需要重寫- (CGSize)collectionViewContentSize方法的UICollectionViewLayout一個子類,但總體來講,你不應該需要改變內容大小正常使用。

我不完全清楚你的問題是什麼 - 當你添加超過屏幕價值的項目,你不能滾動?

+0

這是我的解決方案。我使用的自定義流佈局刪除了多列布局中項目之間的垂直間距。直到我像西蒙建議的那樣,我只獲得了大約一半的物品。我懷疑我遇到問題的原因是查詢的項目數量是基於標準佈局的。 –

2

我遇到了同樣的問題,因爲我在viewWillAppear方法中初始化我的collectionView(即它的DataSource)的元素。

我終於加了一個[self.collectionView reloadData];,它工作得很好!

也許你是在相同的情況。

相關問題