Pergunta

Eu estou usando um UICollectionView por meio de programação.

Eu já definir sua moldura, como se segue:

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

Meu UICollectionViewFlowLayout tem uma seção de inserção definido como:

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

Eu também só tem 1 seção.

Eu tenho a altura de 3.000 para ver se o modo de exibição de coleção deve deslocar-se, mas ele não.Eu estou ajustando-o para que, desde o modo de exibição de coleção não parece se deslocar para cima ou para baixo quando eu inserir novos itens.

UICollectionView é uma subclasse de um UIScrollView, o que significa que eu posso manter a repor a ver tamanho do conteúdo.Será que isso funciona corretamente?

O único problema é que isso seria possível se eu sei o tamanho de todos os itens, incluindo quantos itens estão em cada linha.

Se cada item tinha um tamanho diferente, como eu iria descobrir o tamanho de cada linha?Eu teria que adicionar todas as linhas tamanhos e aumentar o tamanho do conteúdo da altura de self.collectionView.

EDITAR

Até mesmo a minha sugestão acima, redefinir o tamanho do conteúdo, não funciona corretamente!Eu tentei o seguinte quando a actualizar o meu modo de exibição de coleção:

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

Isso é muito feio embora.Isso é porque ele assume todas as minhas imagens são de tamanho 200x200px, que se encaixa 3 imagens por linha (daí a divisão por 3).

Além disso, mesmo com a +300 que eu tenho, a última linha eu só posso ver cerca de 3/4 de ti e de todos.Eu tenho que rolar de mais e eu vou ser capaz de vê-lo, mas ele vai voltar-se novamente para 3/4.Seu como o tipo de deslocamento para atualizar, onde a vista só se move se você arrastá-lo e quando você deixar que ele bate de volta para onde estava.Por que isso está acontecendo?Trata-se apenas que a Apple projetado UICollectionView tão mal?Este é um pouco ridículo...UITableViews ajustar o seu deslocamento, de acordo com o seu conteúdo automaticamente.

Foi útil?

Solução

No atendimento de algumas de suas outras perguntas sobre UICollectionView, eu criei este projeto de demonstração, e rola muito bem, então eu não sei qual é o problema que você está tendo.A única coisa que eu precisava fazer para que a última linha totalmente visível foi a de aumentar o tamanho do fundo de inserção de 90.Eu também adicionei um método de conclusão para o performBatchUpdates:conclusão:para rolar automaticamente, de modo que o último item adicionado é visível (repare que eu adicionar alguns itens extras, utilizando performSelector;withObject:afterDelay:).Minhas imagens são 48x48, e eu apenas definir o meu modo de exibição de coleção para os limites do meu controlador de vista.Aqui está o código para que você possa compará-lo com o que você tem:

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

Outras dicas

Definindo a altura do UICollectionView 3000 vai fazer o seu deslocamento problema pior.Se o UICollectionView é de 3000 pixels de altura, em seguida, ela só vai precisar se deslocar se tem mais de 3000 pixels pena de conteúdo.Você deve configurá-lo para a altura da vista está contido em (a mesma largura).

AFAIK também não deve definir o contentSize diretamente, em vez disso, você precisará substituir o - (CGSize)collectionViewContentSize método em uma subclasse de UICollectionViewLayout, mas de um modo geral, você não precisará alterar o tamanho do conteúdo normal usa.

Eu não estou totalmente clara sobre qual o seu problema - é que, quando você adicionar mais de um telas pena de itens que você não pode rolar?

Eu encontrei o mesmo problema, porque eu estava inicializar os elementos do meu collectionView (i.e.é de origem de dados) no viewWillAppear método.

Eu por fim, adicione apenas um [self.collectionView reloadData]; e ele funciona muito bem!

Talvez se você estivesse no mesmo caso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top