J'utilise Xcode 6 Beta 3, iOS 8 SDK. Construisez Target iOS 7.0 à l'aide de Swift. Veuillez vous référer à mon problème étape par étape avec les captures d'écran ci-dessous.
J'ai un UICollectionView dans Storyboard. 1 prototype UICollectionViewCell qui contient 1 étiquette au centre (pas de règle de redimensionnement automatique). Le fond violet était de marquer un contentView qui est généré au moment de l'exécution par la cellule, je suppose. Cette vue sera redimensionnée correctement en fonction de mon UICollectionViewLayoutDelegate éventuellement, mais pas sur iOS 7. Notez que j'utilise Xcode 6 et que le problème ne se produit que sur iOS 7.
Lorsque je crée l'application sur iOS 8. Tout va bien.
Remarque: Le violet est le contentView , le bleu est mon UIButton avec un coin arrondi.
Cependant, sur iOS 7, toutes les sous-vues à l'intérieur de la cellule se réduisent soudainement à l'image de (0,0,50,50) et ne se conforme plus à ma règle de redimensionnement automatique.
Je suppose qu'il s'agit d'un bogue dans le SDK iOS 8 ou Swift ou peut-être Xcode?
Mise à jour 1: Ce problème existe toujours dans le Xcode 6.0.1 officiel! La meilleure solution est celle suggérée par KoCMoHaBTa ci-dessous en définissant le cadre dans cellForItem de la cellule (vous devez cependant sous-classer votre cellule). Il s'est avéré qu'il s'agissait d'une incompatibilité entre le SDK iOS 8 et iOS 7 (consultez la réponse d'écotaxe ci-dessous citée par Apple).
Mise à jour 2: collez ce code au début de votre cellForItem et les choses devraient bien se passer:
/** 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
redimensionnement avec la cellule fonctionne très bien pour contourner le problème. Je suppose que dans iOS 8, Apple a changé quelque chose dans la façon dont les vues du contenu des cellules sont gérées lors de leur création dans Interface Builder (qui est toujours un peu une boîte noire de toute façon). Mais le fait qu'il change de comportement en ciblant iOS 7 est sûrement un bogue.contentView
bords sur les bords des cellules.Réponses:
contentView est cassé. Il peut également être corrigé dans awakeFromNib
ObjC:
Swift3:
la source
J'ai rencontré le même problème et j'ai demandé de l'aide à Apple DTS. Leur réponse fut:
Je suppose que cela signifie que ce n'est pas un bogue dans XCode 6, mais une incompatibilité entre le SDK iOS 8 et le SDK iOS 7, qui vous frappera si vous passez à Xcode 6, car il commencera automatiquement à utiliser le SDK iOS 8.
Comme je l'ai déjà dit, la solution de contournement décrite par Daniel Plamann fonctionne pour moi. Ceux décrits par Igor Palaguta et KoCMoHaBTa semblent plus simples cependant, et semblent avoir du sens en donnant la réponse d'Apple DTS, donc je les essayerai plus tard.
la source
J'ai rencontré le même problème et j'espère qu'Apple le résoudra avec la prochaine version de Xcode. En attendant, j'utilise une solution de contournement. Dans ma
UICollectionViewCell
sous - classe, je viens delayoutSubviews
remplacer et de redimensionner manuellement le contentView au cas où la taille diffère de lacollectionViewCell
taille.la source
[cell layoutIfNeeded];
dans cellForItem ou cellForRow?Une autre solution consiste à définir la taille de contentView et les masques de redimensionnement automatique
-collectionView:cellForItemAtIndexPath:
comme suit:Cela fonctionne également avec la mise en page automatique, car les masques de redimensionnement automatique sont convertis en contraintes.
la source
Dans Xcode 6.0.1, contentView pour UICollectionViewCell est interrompu pour les appareils iOS7. Il peut également être corrigé en ajoutant des contraintes appropriées à UICollectionViewCell et à son contentView dans les méthodes awakeFromNib ou init.
la source
Cela ne fonctionnera pas correctement sans aucune des autres solutions de contournement mentionnées en raison d'un bogue dans Xcode 6 GM avec la façon dont Xcode compile les fichiers xib au format nib. Bien que je ne puisse pas dire avec certitude à 100% qu'il est lié à Xcode et n'a pas à voir avec l'exécution, je suis très confiant - voici comment je peux le montrer:
J'espère que tous ceux qui liront cette question déposeront un radar auprès d'Apple. C'est un problème ÉNORME et doit être résolu avant la version finale de Xcode.
Edit: À la lumière du message d' écotaxe , je voulais juste mettre à jour cela pour dire qu'il est maintenant confirmé des différences de comportement entre la construction dans iOS 8 et iOS 7, mais pas un bogue. Mon hack a résolu le problème car la construction sur iOS 7 a ajouté le masque de redimensionnement automatique à la vue de contenu nécessaire pour que cela fonctionne, ce qu'Apple n'ajoute plus.
la source
Les réponses dans ce post fonctionnent, ce que je n'ai jamais compris, c'est pourquoi cela fonctionne.
Premièrement, il existe deux "règles":
[UIView new]
), La propriététranslatesAutoresizingMaskIntoConstraints
est définie surYES
translatesAutoresizingMaskIntoConstraints
définie surNO
La deuxième règle ne semble pas s'appliquer aux vues de niveau supérieur pour lesquelles vous ne définissez pas de contraintes. (Ex. La vue du contenu)
Lorsque vous regardez une cellule Storyboard, notez que la cellule n'a pas son
contentView
exposé. Nous ne «contrôlons» pascontentView
, Apple l'est.Plongez dans le code source du storyboard et voyez comment la
contentView
cellule est définie:<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
Maintenant, les sous-vues de la cellule (notez le
translatesAutoresizingMaskIntoConstraints="NO"
):<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NaT-qJ-npL" userLabel="myCustomLabel">
Le
contentView
ne l' a pas esttranslatesAutoresizingMaskIntoConstraints
réglé surNO
. De plus, il manque de définition de mise en page, peut-être à cause de ce que @ecotax a dit .Si nous regardons dans le
contentView
, il a un masque de redimensionnement automatique, mais aucune définition pour celui-ci:<autoresizingMask key="autoresizingMask"/>
Il y a donc deux conclusions:
contentView
translatesAutoresizingMaskIntoConstraints
est réglé surYES
.contentView
manque de définition d'une mise en page.Cela nous amène à deux solutions dont on a parlé.
Vous pouvez définir manuellement les masques de redimensionnement automatique dans
awakeFromNib
:Vous pouvez également définir
contentView
translatesAutoresizingMaskIntoConstraints
surNO
dansawakeFromNib
et définir des contraintes dans- (void)updateConstraints
.la source
Ceci est la version Swift de la réponse de @ Igor qui est acceptée et merci pour votre gentil compagnon de réponse.
Accédez d' abord à votre
UICollectionViewCell
sous-classe et collez le code suivant tel qu'il se trouve dans la classe.Au fait, j'utilise Xcode 7.3.1 et Swift 2.3. La solution est testée sur iOS 9.3 qui fonctionne parfaitement.
Merci, j'espère que cela a aidé.
la source
Dans swift, placez le code suivant dans la sous-classe de cellule de vue de collection:
la source
J'ai constaté qu'il y avait également des problèmes de
contentView
dimensionnement dans iOS 8. Il a tendance à être disposé très tard dans le cycle, ce qui peut provoquer des conflits de contraintes temporaires. Pour résoudre ce problème, j'ai ajouté la méthode suivante dans une catégorie deUICollectionViewCell
:Cette méthode doit être appelée après avoir retiré la cellule de la file d'attente.
la source
dequeueReusableCellWithReuseIdentifier:forIndexPath:
.J'ai résolu de faire ceci:
voir: ici
la source
Assurez-vous simplement de cocher la case «Autoresize subviews» dans la pointe de cette cellule de vue de collection. Cela fonctionnera bien sur iOS 8 et iOS 7.
la source