UICollectionViewCell con esquinas networkingondeadas Y la sombra paralela no funciona

Quiero que UICollectionViewCells tenga esquinas networkingondeadas y sombras paralelas, pero he encontrado un problema donde parece que solo puedo tener una u otra, pero no ambas.

Para networkingondear las esquinas utilizo este código en la initialization de la celda:

CALayer *layer = [self layer]; [layer setCornerRadius:4]; [layer setRasterizationScale:[[UIScreen mainScreen] scale]]; [layer setShouldRasterize:YES]; 

Para agregar una sombra, uso este código en la initialization de la celda:

 CALayer *layer = [self layer]; [layer setMasksToBounds:NO]; [layer setRasterizationScale:[[UIScreen mainScreen] scale]]; [layer setShouldRasterize:YES]; [layer setShadowColor:[[UIColor blackColor] CGColor]]; [layer setShadowOffset:CGSizeMake(0.0f,0.5f)]; [layer setShadowRadius:8.0f]; [layer setShadowOpacity:0.2f]; [layer setShadowPath:[[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:layer.cornerRadius] CGPath]]; 

Para intentar tener esquinas networkingondeadas y una sombra paralela, uso este código en la initialization de la celda:

 CALayer *layer = [self layer]; [layer setMasksToBounds:NO]; [layer setCornerRadius:4]; [layer setRasterizationScale:[[UIScreen mainScreen] scale]]; [layer setShouldRasterize:YES]; [layer setShadowColor:[[UIColor blackColor] CGColor]]; [layer setShadowOffset:CGSizeMake(0.0f,0.5f)]; [layer setShadowRadius:8.0f]; [layer setShadowOpacity:0.2f]; [layer setShadowPath:[[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:layer.cornerRadius] CGPath]]; 

pero esto solo da lugar a la sombra.

¿Es esto un error o estoy haciendo algo mal?

Me funciona genial:

 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { ... cell.layer.masksToBounds = YES; cell.layer.cornerRadius = 6; ... return cell; } 

Si coloca todas sus subcounts en la vista de contenido de UICollectionViewCell , que probablemente sea, puede establecer la sombra en la capa de la celda y el borde en la capa de ContentView para lograr ambos resultados.

 cell.contentView.layer.cornerRadius = 2.0f; cell.contentView.layer.borderWidth = 1.0f; cell.contentView.layer.borderColor = [UIColor clearColor].CGColor; cell.contentView.layer.masksToBounds = YES; cell.layer.shadowColor = [UIColor lightGrayColor].CGColor; cell.layer.shadowOffset = CGSizeMake(0, 2.0f); cell.layer.shadowRadius = 2.0f; cell.layer.shadowOpacity = 1.0f; cell.layer.masksToBounds = NO; cell.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:cell.bounds cornerRadius:cell.contentView.layer.cornerRadius].CGPath; 

Creo que me encontré con un problema similar. Mi problema era que el recorte en mis subprocesss de UICollectionViewCell no funcionaba correctamente con sombras y bordes networkingondeados. El mismo código funcionó muy bien antes cuando tuve esa vista (como una subclass UIView estándar) en un UIScrollView.

Por lo tanto, la historia corta, moví toda esta configuration de initWithCoder a un lugar posterior después de getla de -dequeueReusableCellWithReuseIdentifier:forIndexPath: Resolvió el problema para mí. Parece que UICollectionViews está haciendo algo que no esperaba en las capas de sus células en algún momento.

Hay un momento difícil. Cortar esquinas y colocar sombras es una function mutuamente exclusiva en una sola capa. La sombra de caída es el process de extensión de fotogtwigs, pero las esquinas son el process de enmascarar a los límites.

La solución está en la separación de funciones. Recomiendo sombra de configuration para la capa de celda, pero cortar esquinas para la capa contentView de esa celda.

Si está utilizando una subclass para hacer la colección, asegúrese de hacer lo siguiente.

 CALayer *layer = [self layer]; [layer setCornerRadius:_cornerRadius]; [layer setRasterizationScale:[[UIScreen mainScreen] scale]]; [layer setShouldRasterize:YES]; [layer setShadowColor:[[UIColor blackColor] CGColor]]; [layer setShadowOffset:CGSizeMake(0.0,4.0)]; [layer setShadowRadius:6.0f]; [layer setShadowOpacity:0.25]; [layer setShadowPath:[[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:layer.cornerRadius] CGPath]]; self.contentView.layer.cornerRadius = _cornerRadius; self.contentView.layer.borderWidth= _borderWidth; self.contentView.layer.borderColor = _borderColor.CGColor; self.contentView.backgroundColor = [UIColor whiteColor]; self.backgroundColor = [UIColor clearColor]; 

Funciona de maravilla.