159 votes

Le problème de mise à jour automatique de la trame UICollectionViewCell contentView dans la cellule prototype Storyboard (Xcode 6, iOS 8 SDK) se produit lors de l'exécution sur iOS 7 uniquement

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 **/

Mise à jour 1: Ce problème existe toujours dans l'officiel Xcode 6.0.1 ! Le meilleur travail est environ comme ce que KoCMoHaBTa proposé ci-dessous par le cadre dans cellForItem de la cellule (Vous avez une classe de votre cellule). Il s'est avéré que c'est une incompatibilité entre iOS 8 SDK et iOS 7 (cocher la réponse de l'écotaxe ci-dessous cité de la Pomme).

Origine: Je suis en utilisant Xcode 6 Bêta 3 d'iOS 8 SDK. Cible Build 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 le Storyboard. 1 Prototype UICollectionViewCell qui contient 1 étiquette dans le centre (pas d'un redimensionnement automatique de la règle). Fond mauve était à marquer d'une contentView qui est généré lors de l'exécution par la Cellule, je suppose. Ce point de vue sera redimensionnée correctement base sur mon UICollectionViewLayoutDelegate par la suite, mais pas sur iOS 7. Notez que je suis en utilisant Xcode 6 et le problème se produit uniquement sur iOS 7.

Quand j'ai construit une application sur iOS 8. Tout est ok.

Remarque: le Violet est la contentView, le Bleu est ma UIButton avec des coins arrondis.

http://i.stack.imgur.com/uDNDY.png

Cependant, sur iOS 7, tous les sous-vues à l'intérieur de la Cellule se contracter brusquement à l'image de (0,0,50,50) et de ne jamais se conforme à mon d'un redimensionnement automatique règle, pas plus.

http://i.stack.imgur.com/lOZH9.png

Je suppose que c'est un bug dans iOS 8 SDK ou Swift ou peut-être Xcode? Je suis coincé avec ce pour 2 jours, sans espoir de le résoudre. Votre aide est très appréciée.

Merci beaucoup les gars! Kien.

170voto

Igor Palaguta Points 1335

contentView est cassé. Il peut également être réparé dans awakeFromNib

 -(void)awakeFromNib
{
   [super awakeFromNib];

   self.contentView.frame = self.bounds;
   self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
 

61voto

ecotax Points 437

J'ai rencontré le même problème et a demandé à Apple de DTS pour obtenir de l'aide. Leur réponse a été:

Dans iOS 7, les cellules de contenu " points de vue de la taille d'eux, par le biais d'un redimensionnement automatique les masques. Dans iOS 8, elle a été changée, les cellules arrêté à l'aide de la d'un redimensionnement automatique des masques et a commencé dimensionnement de l'affichage du contenu dans layoutSubviews. Si la plume est codée dans iOS 8 et décoder ensuite sur iOS 7, vous avez un affichage du contenu d'un redimensionnement automatique sans masque et sans d'autres moyens par lesquels la taille elle-même. Donc si jamais vous changer l'image de la cellule, le contenu de la vue ne le suivra pas.

Les applications en cours de déploiement de revenir à iOS 7 sera de contourner ce problème en dimensionnement de l'affichage du contenu lui-même, l'ajout d'un redimensionnement automatique des masques, ou l'ajout d' des contraintes.

Je suppose que cela signifie qu'il n'est pas un bogue dans XCode 6, mais une incompatibilité entre l'iOS 8 SDK et iOS 7 SDK, qui va vous frapper si vous mettez à jour Xcode 6, car il sera automatiquement commencer à utiliser l'iOS 8 SDK.

Comme je l'ai commenté avant, la solution de contournement Daniel Plamann décrit fonctionne pour moi. Ceux décrits par Igor Palaguta et KoCMoHaBTa look plus simple si, et semblent faire sens donnant Apple DTS réponse, je vais donc essayer ces plus tard.

60voto

Daniel Plamann Points 471

J'ai rencontré le même problème et j'espère qu'Apple corrigera cela avec la prochaine version de Xcode. En attendant, j'utilise une solution de contournement. Dans ma sous-classe UICollectionViewCell je viens de remplacer layoutSubviews et de redimensionner le contentView manuellement dans le cas où la taille diffère de collectionViewCell size.

 - (void)layoutSubviews
{
  [super layoutSubviews];

  BOOL contentViewIsAutoresized = CGSizeEqualToSize(self.frame.size, self.contentView.frame.size);

  if( !contentViewIsAutoresized) {
    CGRect contentViewFrame = self.contentView.frame;
    contentViewFrame.size = self.frame.size;
    self.contentView.frame = contentViewFrame;
  }
}
 

38voto

KoCMoHaBTa Points 360

Une autre solution consiste à définir la taille de contentView et les masques autoresizing dans -collectionView: cellForItemAtIndexPath: comme ceci:

 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *cellID = @"CellID";

     UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];

     //set contentView frame and autoresizingMask
     cell.contentView.frame = cell.bounds;
     cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin |UIViewAutoresizingFlexibleTopMargin |UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin;

     //You custom code goes here

     return cell;
}
 

Cela fonctionne également avec Auto Layout, car les masques de redimensionnement automatique sont traduits en contraintes.

6voto

SerJ_G Points 114

Dans Xcode 6.0.1 contentView pour UICollectionViewCell est cassé pour les appareils iOS7. Il peut également être corrigé en ajoutant les contraintes appropriées à UICollectionViewCell et à son contenu dans les méthodes awakeFromNib ou init.

         UIView *cellContentView = self.contentView;
        cellContentView.translatesAutoresizingMaskIntoConstraints = NO;

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[cellContentView]|"
                                                                     options:0
                                                                     metrics:0
                                                                       views:NSDictionaryOfVariableBindings(cellContentView)]];
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[cellContentView]|"
                                                                     options:0
                                                                     metrics:0
                                                                       views:NSDictionaryOfVariableBindings(cellContentView)]];
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X