No se puede cambiar la propiedad backgroundView en UICollectionView

Tengo un UICollectionView y estoy intentando establecer una image de background usando la propiedad backgroundView en function de si hay datos en CollectionView o no. Tengo navigation que cambiará los datos y volverá a cargar la vista de colección (llamando a [self.collectionView reloadData] ). Por alguna razón, estoy obteniendo resultados muy extraños. En primer lugar, a veces, cuando configuro la propiedad, aparece encima de las celdas de la colecciónView y las oscurece. En segundo lugar, cuando trato de cambiar la propiedad, no cambia en la pantalla. Esto me está volviendo loco ! ¡Parecía algo tan simple de implementar!

Entonces en el Código. En viewDidLoad para UICollectionViewController

 - (void)viewDidLoad { [self loadSections]; [self setupBackgroundView; } 

El método Load sections simplemente carga los datos que estoy usando para la vista de colección, que luego también llama a un método para establecer la vista de background que decide qué vista agregar en function de si hay datos como se muestra a continuación:

 - (void)loadSections { [self loadPictures]; [self setupBackgroundImage]; } - (void)setupBackgroundImage { if ([self.sections count] == 0 || !self.sections) { self.collectionView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"TakePhoto"]]; } else { self.collectionView.backgroundView = nil; } } 

Ahora cuando la vista se carga por primera vez, si no hay datos y, por lo tanto, no hay celdas para mostrar el background, la image aparece correctamente. Luego cambio los datos y ahora tengo algunas celdas para mostrar, se llama a setupBackgroundImage y puedo verificar que la propiedad backgroundImage está configurada en nil (incluso he roto el punto aquí y he verificado el valor y es nulo). PERO la image de background aún es visible.

Además, si cambio el cero a otra image, esta nueva image nunca se muestra.

Y aún más extraño. Si tengo algunas celdas en pantalla y establezco una image de background, esta image se muestra claramente detrás de las celdas. Si luego reloadData con un nuevo set de datos, entonces la image se muestra delante de las celdas, ocultándolas. No tengo idea de cómo sucede esto, ya que entonces la vista de background debe estar detrás de todos los demás.

Alguien sabe por qué ocurre esto. ¿Se está almacenando en caching en cualquier lugar? ¿o estoy haciendo algo tonto? Aquí estoy perdiendo totalmente, ¡he dedicado más time a esto que escribir el layout personalizado que usa!

Prueba esto

 self.collectionView.backgroundView =[[UIView alloc]initWithFrame:self.collectionView.bounds]; UIImageView *imgVW=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"TakePhoto"]]; [self.collectionView.backgroundView addSubView:imgVW]; 

como se señaló en esta publicación, la propiedad backgroundView de UICollectionView está horriblemente rota

uno puede tener una lectura amarga cuando cmd + click la class UICollectionViewCell.

 // The background view is a subview behind all other views. // If selectedBackgroundView is different than backgroundView, it will be placed above the background view and animated in on selection. @property (nonatomic, strong, nullable) UIView *backgroundView; 

tu nuevo se inserta debajo del anterior. Acabo de pasar mi última hora depurando y jurando mucho tratando de averiguar qué no funciona.

solo use removeFromSuperview

Ok, encontré una solución a mi problema específico, aunque todavía no entiendo por qué obtengo el extraño comportamiento mencionado en mi pregunta, al less de esta manera me permite cambiar la image de background.

Básicamente, creo una propiedad para contener un UIImageView y luego establecer el UICollectionView en esta propiedad. Luego puedo cambiar la image en la vista de la image a través de la propiedad que he guardado.

 - (void)viewDidLoad { [self loadSections]; self.backgroundImageView = [[UIImageView alloc] initWithImage:nil]; self.backgroundImageView.contentMode = UIViewContentModeCenter; self.collectionView.backgroundView = self.backgroundImageView; } - (void)setupBackgroundImage { if ([self.sections count] == 0 || !self.sections) { self.backgroundImageView.image = [UIImage imageNamed:@"TakePhoto"]; } else { self.backgroundImageView.image = nil; } } - (void)loadSections { [self loadPictures]; [self setupBackgroundImage]; } 

Donde self.backgroundImageView es la propiedad que he definido con el propósito de mantener una reference a la vista de background.

Si alguien tiene alguna idea del extraño comportamiento mencionado en la pregunta, ¡estaría realmente interesado en escucharlo!

Realmente no sé si esto está relacionado, pero encontré esto después de una larga búsqueda. Espero que esto salve a alguien un poco de time.

Al igual que con UICollectionView, UITableView tiene una vista de background que se comstack antes de AutoLayout. Si usa autoLayout, debe asegurarse de que backgroundView tenga un marco. De lo contrario, desaparecerá. En su subclass de celda, puede hacer lo siguiente:

  -(void)setBackgroundView:(UIView *)backgroundView { super.backgroundView = backgroundView; self.backgroundView.translatesAutoresizingMaskIntoConstraints = NO; [self.backgroundView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero]; }