Estou usando o Xcode 6 Beta 3, iOS 8 SDK. Crie o iOS 7.0 de destino usando o Swift. Consulte o meu problema passo a passo com as capturas de tela abaixo.
Eu tenho um UICollectionView no Storyboard. 1 protótipo UICollectionViewCell que contém 1 rótulo no centro (sem regra de redimensionamento automático). O fundo roxo era para marcar um contentView que é gerado em tempo de execução pela célula, eu acho. Essa visualização será redimensionada adequadamente com base no meu UICollectionViewLayoutDelegate eventualmente, mas não no iOS 7. Observe que estou usando o Xcode 6 e o problema só acontece no iOS 7.
Quando crio o aplicativo no iOS 8. Tudo está bem.
Nota: Roxo é o contentView , Azul é meu UIButton com canto arredondado.
No entanto, no iOS 7, todos os subViews dentro da célula diminuem repentinamente para o quadro de (0,0,50,50) e nunca mais estão em conformidade com minha regra de redimensionamento automático.
Presumo que este seja um erro no iOS 8 SDK ou Swift ou talvez no Xcode?
Atualização 1: Esse problema ainda existe no Xcode 6.0.1 oficial! A melhor solução é como o que o KoCMoHaBTa sugeriu abaixo, definindo o quadro em cellForItem da célula (você precisa subclassificar sua célula). Descobriu-se que esta é uma incompatibilidade entre o iOS 8 SDK e o iOS 7 (verifique a resposta da ecotax abaixo citada pela Apple).
Atualização 2: cole este código no início do seu cellForItem e tudo ficará bem:
/** Xcode 6 on iOS 7 hot fix **/
cell.contentView.frame = cell.bounds;
cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
/** End of Xcode 6 on iOS 7 hot fix **/
contentView
redimensionamento da célula funciona bem para solucionar o problema. Eu acho que no iOS 8 a Apple mudou algo sobre a maneira como as visualizações de conteúdo da célula são tratadas quando criadas no Interface Builder (que ainda é uma caixa preta). Mas o fato de alterar o comportamento ao segmentar o iOS 7 é certamente um bug.contentView
bordas nas bordas da célula.Respostas:
contentView está quebrado. Também pode ser corrigido no awakeFromNib
ObjC:
Swift3:
fonte
Encontrei o mesmo problema e pedi ajuda ao Apple DTS. A resposta deles foi:
Acho que isso significa que não é um bug no XCode 6, mas uma incompatibilidade entre o iOS 8 SDK e o iOS 7 SDK, que afetará você se você atualizar para o Xcode 6, porque ele começará automaticamente a usar o iOS 8 SDK.
Como comentei antes, a solução alternativa que Daniel Plamann descreveu funciona para mim. Porém, os descritos por Igor Palaguta e KoCMoHaBTa parecem mais simples e parecem fazer sentido dar a resposta do Apple DTS, então tentarei isso mais tarde.
fonte
Encontrei o mesmo problema e espero que a Apple conserte isso com a próxima versão do Xcode. Enquanto isso, uso uma solução alternativa. Na minha
UICollectionViewCell
subclasse, acabei de substituirlayoutSubviews
e redimensionar o contentView manualmente, caso o tamanho seja diferente docollectionViewCell
tamanho.fonte
[cell layoutIfNeeded];
cellForItem ou cellForRow?Outra solução é definir o tamanho do contentView e as máscaras de redimensionamento automático
-collectionView:cellForItemAtIndexPath:
da seguinte forma:Isso também funciona com o Layout automático, pois as máscaras de redimensionamento automático são convertidas em restrições.
fonte
No Xcode 6.0.1, o contentView para UICollectionViewCell está quebrado para dispositivos iOS7. Também pode ser corrigido adicionando restrições apropriadas ao UICollectionViewCell e seu contentView nos métodos awakeFromNib ou init.
fonte
Isso não funcionará corretamente sem nenhuma das outras soluções mencionadas devido a um erro no Xcode 6 GM com a forma como o Xcode compila arquivos xib no formato da ponta. Embora eu não possa dizer com 100% de certeza que está relacionado ao Xcode e não está relacionado ao tempo de execução, estou muito confiante - eis como posso mostrá-lo:
Espero que todos que leem esta pergunta registrem um radar na Apple. Este é um problema enorme e precisa ser resolvido antes da versão final do Xcode.
Edit: À luz do post de ecotax , eu só queria atualizar isso para dizer que agora são confirmadas diferenças de comportamento entre a criação no iOS 8 e o iOS 7, mas não é um bug. Meu hack corrigiu o problema porque a criação no iOS 7 adicionou a máscara de redimensionamento automático à exibição de conteúdo necessária para fazer esse trabalho, que a Apple não adiciona mais.
fonte
As respostas deste post funcionam, o que eu nunca entendi é por que funciona.
Primeiro, existem duas "regras":
[UIView new]
), a propriedadetranslatesAutoresizingMaskIntoConstraints
está configurada paraYES
translatesAutoresizingMaskIntoConstraints
configurada comoNO
A segunda regra parece não se aplicar às visualizações de nível superior para as quais você não define restrições. (Ex. A visualização do conteúdo)
Ao olhar para uma célula do Storyboard, observe que a célula não está
contentView
exposta. Não estamos "controlando" acontentView
Apple.Mergulhe fundo no código fonte do storyboard e veja como a
contentView
célula é definida:<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
Agora, as subvisões da célula (observe o
translatesAutoresizingMaskIntoConstraints="NO"
):<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NaT-qJ-npL" userLabel="myCustomLabel">
O
contentView
não estátranslatesAutoresizingMaskIntoConstraints
definido comoNO
. Além disso, falta definição de layout, talvez por causa do que a @ecotax disse .Se olharmos para o
contentView
, ele tem uma máscara de redimensionamento automático, mas nenhuma definição para isso:<autoresizingMask key="autoresizingMask"/>
Portanto, existem duas conclusões:
contentView
translatesAutoresizingMaskIntoConstraints
está definido paraYES
.contentView
falta definição de um layout.Isso nos leva a duas soluções que foram discutidas.
Você pode definir as máscaras de redimensionamento manual manualmente em
awakeFromNib
:Ou você pode definir o
contentView
translatesAutoresizingMaskIntoConstraints
queNO
emawakeFromNib
e definir restrições no- (void)updateConstraints
.fonte
Esta é a versão Swift da resposta de @ Igor, que é aceita e agradecemos a sua boa resposta, companheiro.
Primeiro, vá para sua
UICollectionViewCell
subclasse e cole o seguinte código, pois está dentro da classe.A propósito, estou usando o Xcode 7.3.1 e o Swift 2.3. A solução foi testada no iOS 9.3, que está funcionando perfeitamente.
Obrigado, espero que isso tenha ajudado.
fonte
Em breve, coloque o seguinte código na subclasse da célula de exibição de coleção:
fonte
Descobri que também há problemas com o
contentView
dimensionamento no iOS 8. Ele tende a ser definido muito tarde no ciclo, o que pode causar conflitos de restrição temporários. Para resolver isso, adicionei o seguinte método em uma categoria deUICollectionViewCell
:Este método deve ser chamado após desenfileirar a célula.
fonte
dequeueReusableCellWithReuseIdentifier:forIndexPath:
.Corrigi isso:
veja aqui
fonte
Apenas certifique-se de marcar a caixa de seleção "Autoresize subviews" na ponta dessa célula de exibição de coleção. Funcionará bem no iOS 8 e no iOS 7.
fonte