Domanda

Sto usando un uicollectionVisualizza a livello di programmazione.

Ho impostato il suo telaio come segue:

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

My UICollectionViewFlowLayout ha un set di insetti sezione come:

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

Ho anche 1 sezione.

Ho impostato l'altezza per essere 3.000 per vedere se la vista di raccolta scorrerebbe ma non lo fa. Lo sto impostando in modo da quando la vista della raccolta non sembra scorrere verso l'alto o il basso quando inserisco nuovi elementi.

UICollectionView è sottoclassificato da un UIScrollView, il che significa che posso continuare a ripristinare la dimensione del contenuto della visualizzazione di scorrimento. Questo funzionerebbe correttamente?

L'unico problema è che questo funzionerebbe se conosco le dimensioni di tutti gli elementi, inclusi quanti articoli sono su ogni riga.

Se ogni articolo ha avuto dimensioni diverse, come dovrei scoprire le dimensioni di ogni riga? Avrei bisogno di aggiungere tutte le dimensioni di righe e aumentare l'altezza della dimensione del contenuto di self.collectionView.

Modifica

Anche il mio suggerimento sopra, resettare le dimensioni del contenuto, non funziona correttamente! Ho provato quanto segue quando si aggiorna la mia vista di raccolta:

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

Questo è molto brutto però. Questo perché presuppone che tutte le mie immagini siano di taglia 200x200px, che si adattano a 3 immagini per riga (da qui la divisione per 3).

Inoltre, anche con il +300 che ho, l'ultima riga che posso vedere solo circa 3/4 e non tutto. Devo scorrere di più e potrò vederlo ma tornerò di nuovo a 3/4. È un po 'come la rotolo per aggiornare, dove la vista si muove solo se lo trascini e quando lo lasci torna a dove si trovava. Perché sta succedendo? È solo che Apple ha progettato UICollectionView così scarsamente? Questo è un po 'ridicolo ... UtilityVies Regola il loro rotolo in base al loro contenuto automaticamente.

È stato utile?

Soluzione

Nel rispondere ad alcune delle altre vostre domande su UicollectionView, ho creato questo progetto demo, e scorre bene bene, quindi non so quale problema tu stia avendo.L'unica cosa che dovevo fare per rendere l'ultima riga completamente visibile era di aumentare la dimensione dell'inserto inferiore a 90. Ho anche aggiunto un metodo di completamento per eseguire l'esecuzioneBatchupdates: Completamento: per scorrere automaticamente in modo che l'ultima voce aggiunta sia visibile (Si noti che aggiungo alcuni articoli extra utilizzando EsectSelector; WithObject: AfterDelay :).Le mie immagini sono 48x48 e ho appena impostato la mia vista di raccolta nei limiti della visione del mio controller.Ecco il codice in modo da poterlo confrontare con ciò che hai:

@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);
}
.

Altri suggerimenti

Impostazione dell'altezza del UICollectionView a 3000 renderà peggiorare il problema dello scorrimento.Se il UICollectionView è alto 3000 pixel, allora sarà necessario scorrere solo se ha più di 3000 pixel del valore di contenuti in esso.Dovresti impostarlo sull'altezza della vista è contenuto in (come la larghezza).

AFAIK Non deve inoltre impostare direttamente il contentSize, invece è necessario sovrascrivere il metodo - (CGSize)collectionViewContentSize in una sottoclasse di UICollectionViewLayout, ma in generale non è necessario modificare la dimensione del contenuto per gli usi normali.

Non sono completamente chiaro su quale sia il tuo problema - è che quando aggiungi più di un valore di schermi di articoli non puoi scorrere?

Ho riscontrato lo stesso problema perché stavo inizializzando gli elementi della mia raccoltaview (I.e. È DataSource) nel metodo ViewwillApear.

Alla fine aggiungo solo un [self.collectionView reloadData]; e funziona bene!

Forse sei nello stesso caso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top