Como defino o espaçamento de células em uma seção UICollectionView
? Eu sei que existe uma propriedade que minimumInteritemSpacing
eu defini como 5.0, ainda assim o espaçamento não está aparecendo 5.0. Eu implementei o método delegado de fluxo.
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
{
return 5.0;
}
ainda não estou obtendo o resultado desejado. Eu acho que é o espaçamento mínimo. Não há como definir o espaçamento máximo?
ios
objective-c
uicollectionview
Vishal Singh
fonte
fonte
Respostas:
Eu sei que o tópico é antigo, mas caso alguém ainda precise de uma resposta correta, aqui o que você precisa:
Adicione uma implementação assim:
onde maximumSpacing pode ser definido como qualquer valor que você preferir. Esse truque garante que o espaço entre as células seja EXATAMENTE igual ao maximumSpacing !!
fonte
mutableCopy
: você não está mutando o conteúdo da matriz, mas os objetos dentro dela.if
que e uma condição adicional:if(origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize.width && currentLayoutAttributes.frame.origin.x > prevLayoutAttributes.frame.origin.x) {
Apoiando a pergunta inicial. Eu tentei obter o espaçamento para 5px no
UICollectionView
mas isso não funciona, bem com umUIEdgeInsetsMake(0,0,0,0)
...Em um UITableView, eu posso fazer isso especificando diretamente as coordenadas x, y em uma linha ...
Heres my UICollectionView code:
Atualização: resolvido o meu problema, com o seguinte código.
ViewController.m
fonte
Usando um layout de fluxo horizontal, também obtive um espaçamento de 10 pontos entre as células. Para remover o espaçamento, eu precisava definir
minimumLineSpacing
tanto quantominimumInterItemSpacing
zero.Além disso, se todas as suas células tiverem o mesmo tamanho, é mais simples e eficiente definir a propriedade diretamente no layout do fluxo, em vez de usar métodos delegados.
fonte
minimumInteritemSpacing
. A configuraçãominimumLineSpacing = 0
do meu layout horizontal removeu o espaçamento horizontal entre os itens.Lembre-se de que é um espaço mínimo de linha , não um espaçamento mínimo entre itens ou espaço de célula. Como a direção de rolagem do seu collectionView é HORIZONTAL .
Se for vertical, será necessário definir o espaço da célula ou entre itens para o espaço horizontal entre as células e o espaçamento entre linhas para o espaço vertical entre as células.
Versão Objective-C
Versão rápida:
fonte
Experimente este código para garantir um espaçamento de 5 px entre cada item:
fonte
Versão rápida da resposta mais popular. O espaço entre as células será igual a
cellSpacing
.fonte
Eu encontrei uma maneira muito fácil de configurar o espaçamento entre células ou linhas usando o IB.
Basta selecionar UICollectionView no arquivo storyboard / Xib e clicar em Size Inspector, conforme especificado na imagem abaixo.
Para configurar o espaço programaticamente, use as seguintes propriedades.
1) Para definir espaço entre as linhas.
2) Para definir espaço entre itens / células.
fonte
Observe o nome da propriedade minimumInterItemSpacing . Esse será o espaçamento mínimo entre os itens e não o espaçamento exato . Se você definir minimumInterItemSpacing com algum valor, poderá garantir que o espaçamento não seja menor que isso. Mas há uma chance de obter um valor mais alto.
Na verdade, o espaçamento entre os itens depende de vários fatores itemSize e sectionInset . A exibição de coleção coloca dinamicamente o conteúdo com base nesses valores. Portanto, você não pode garantir o espaçamento exato. Você deve fazer algumas tentativas e erros com sectionInset e minimumInterItemSpacing .
fonte
Resposta para Swift 3.0, Xcode 8
1. Certifique-se de definir o delegado da exibição de coleção
2.Implemente o protocolo UICollectionViewDelegateFlowLayout , não o UICollectionViewDelegate.
fonte
Código simples para espaçamento
fonte
A resposta votada (e também a versão rápida ) tem um pequeno problema: haverá um grande espaçamento à direita.
Isso ocorre porque o layout do fluxo é personalizado para tornar o espaçamento exato da célula, com um comportamento de flutuação à esquerda .
Minha solução é manipular a seção inserida, para que a seção fique alinhada ao centro, mas o espaçamento seja exatamente como especificado.
Na captura de tela abaixo, o espaçamento entre itens e linhas é exatamente de 8 pontos, enquanto a seção esquerda e direita será maior que 8 pontos (para torná-lo alinhado ao centro):
Código Swift como tal:
fonte
let n = Int((containerWidth + minItemSpacing)/((itemWidth+minItemSpacing)))
Defina o
UICollectionViewDelegateFlowLayout
protocolo no seu arquivo de cabeçalho.Implemente o seguinte método de
UICollectionViewDelegateFlowLayout
protocolo como este:Clique aqui para ver a documentação do
UIEdgeInsetMake
método Apple .fonte
Se você deseja ajustar o espaçamento sem tocar no tamanho real da célula, esta é a solução que funcionou melhor para mim. #xcode 9 # tvOS11 # iOS11 #swift
Portanto, em UICollectionViewDelegateFlowLayout , altere os próximos métodos, o truque é usar os dois, e a documentação não estava realmente me levando a pensar nessa direção. : D
fonte
Abordagem de Storyboard
Selecione CollectionView no storyboard e vá para o inspetor de tamanho e defina o espaçamento mínimo para células e linhas como 5
Swift 5 programaticamente
fonte
Estou usando o monotouch, então os nomes e o código serão um pouco diferentes, mas você pode fazer isso certificando-se de que a largura da viewview seja igual a (x * largura da célula) + (x-1) * MinimumSpacing com x = amount de células por linha.
Basta seguir as etapas com base no MinimumInteritemSpacing e na Largura da célula
1) Calculamos a quantidade de itens por linha com base no tamanho da célula + inserções atuais + espaçamento mínimo
2) Agora você tem todas as informações para calcular a largura esperada para a exibição de coleção
3) Portanto, a diferença entre a largura atual e a largura esperada é
4) Agora ajuste as inserções (neste exemplo, adicionamos à direita, para que a posição esquerda da coleção fique igual
fonte
Eu tenho uma horizontal
UICollectionView
e subclasseUICollectionViewFlowLayout
. A exibição de coleção possui células grandes e mostra apenas uma linha por vez, e a exibição de coleção se ajusta à largura da tela.Tentei a resposta de iago849 e funcionou, mas depois descobri que nem precisava da resposta dele. Por alguma razão, definir o
minimumInterItemSpacing
não faz nada. O espaçamento entre meus itens / células pode ser totalmente controlado porminimumLineSpacing
.Não sei por que funciona dessa maneira, mas funciona.
fonte
Eu me deparei com um problema semelhante ao OP. Infelizmente, a resposta aceita não funcionou para mim, pois o conteúdo da página
collectionView
não seria centralizado corretamente. Portanto, eu vim com uma solução diferente, que exige apenas que todos os itens nocollectionView
sejam da mesma largura , o que parece ser o caso na pergunta:Esse código garantirá que o valor retornado por
...minimumInteritemSpacing...
seja o espaçamento exato entre todoscollectionViewCell
e, além disso, garantirá que as células juntas sejam centralizadas nocollectionView
fonte
A solução acima por vojtech-vrbka está correta, mas dispara um aviso:
O código a seguir deve corrigi-lo:
fonte
Versão Swift 3
Simplesmente crie uma subclasse UICollectionViewFlowLayout e cole esse método.
fonte
Eu tentei a resposta de iago849 e funcionou.
Swift 4
Aqui está o link para o projeto github. https://github.com/vishalwaka/MultiTags
fonte
As versões anteriores realmente não funcionavam com as seções> 1. Portanto, minha solução foi encontrada aqui https://codentrick.com/create-a-tag-flow-layout-with-uicollectionview/ . Para os preguiçosos:
fonte
Estou com um problema com a resposta aceita, então atualizei, isso está funcionando para mim:
.h
.m
fonte
Minha solução no
Swift 3
espaçamento de linha celular, como no Instagram:Como detectar programaticamente o dispositivo: https://stackoverflow.com/a/26962452/6013170
fonte
Bem, se você está criando uma visão de coleção horizontal, em seguida, para dar espaço entre as células, você precisa definir a propriedade
minimumLineSpacing
.fonte
Tente brincar com este método:
fonte