2013-05-17 19 views
8

Mam UICollectionView i próbuję ustawić obraz tła przy użyciu właściwości backgroundView na podstawie, czy istnieją jakiekolwiek dane w CollectionView, czy nie. Mam nawigację, która zmieni dane i ponownie załaduje widok kolekcji (wywołanie [self.collectionView reloadData]). Z jakiegoś powodu otrzymuję bardzo dziwne wyniki. Po pierwsze, czasami kiedy ustawiam właściwość, pojawia się ona na górze komórki collectionView i zasłania je. Po drugie, kiedy próbuję zmienić właściwość, nie zmienia się ona na ekranie. To doprowadza mnie do szału! Wydawało się, że jest to takie proste!Nie można zmienić właściwości backgroundView na UICollectionView

Tak w Kod. W viewDidLoad dla UICollectionViewController

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

Sposób odcinki obciążenia tylko wczytuje dane używam dla widoku kolekcji, która następnie również wywołuje metodę, aby ustawić tło widoku, który decyduje, co widok, aby dodać na podstawie, jeśli istnieje wszelkie dane jak poniżej:

- (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; 
} 
} 

teraz, gdy widok pierwsze ładunki, jeśli nie ma żadnych danych i tak nie ma komórki, aby wyświetlić obraz tła pojawia się prawidłowo. Następnie zmieniam dane i mam teraz kilka komórek do wyświetlenia, wywoływany jest setupBackgroundImage i mogę zweryfikować, że właściwość backgroundImage jest ustawiona na zero (nawet tu złamałem i sprawdziłem wartość i jest ona zerowa). ALE obraz tła jest nadal widoczny.

Dodatkowo, jeśli zmienię zero na inny obraz, ten nowy obraz nigdy nie jest wyświetlany.

I jeszcze bardziej dziwne. Jeśli mam kilka komórek wyświetlanych i ustawiam obraz tła, ten obraz jest wyświetlany dokładnie za komórkami. Jeśli następnie ponownie załaduję Data z nowym zestawem danych, obraz zostanie wyświetlony przed komórkami, zasłaniając je. Nie mam pojęcia, jak to się dzieje, ponieważ wtedy widok tła powinien znajdować się za wszystkimi pozostałymi.

Czy ktoś wie, dlaczego tak się dzieje. Czy jest on buforowany w dowolnym miejscu? czy robię coś głupiego? Mam tu całkowitą stratę - poświęciłem na to więcej czasu niż pisanie niestandardowego układu, którego używa!

+0

jakaś szansa wielokrotnego 'UICollectionViews' są tworzone i dodawane jako subviews? To by wyjaśniało zachowanie, które widzisz. – bobnoble

+0

Dzięki za komentarz bobnoble. Zastanawiałem się też, czy to się mogło stać. O ile wiem, zarówno od sprawdzenia kodu, jak i od uruchomienia narzędzia Przyporządkowanie instrumentów, a następnie nie, istnieje tylko jeden UICollectionView. – SimonB

+0

Czy istnieje szansa, że ​​twój setupBackgroundImage jest czasami wywoływany w wątku innym niż główny wątek? – honus

Odpowiedz

0

Ok, znalazłem rozwiązanie mojego konkretnego problemu, chociaż ja wciąż nie rozumiem dlaczego ja dostaję dziwne zachowanie, o którym mowa w moje pytanie, przynajmniej w ten sposób pozwala mi zmień obraz tła.

Zasadniczo tworzę właściwość do przechowywania UIImageView, a następnie ustawię UICollectionView dla tej właściwości. Mogę następnie zmienić obraz w widoku obrazu poprzez właściwość, którą zapisałem.

- (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]; 
} 

Gdzie self.backgroundImageView jest własnością Mam zdefiniowane w celu utrzymania odniesienie do widoku tła.

Jeśli ktokolwiek ma jakiś wgląd w dziwne zachowanie wspomniane w pytaniu, byłbym naprawdę zainteresowany usłyszeć go!

+0

czy jesteś pewien, że to nie jest twoje tło problem z formatem obrazu? Miałem ten sam problem, gdy próbowałem skonfigurować collabitoview backgroudimage. Działa dobrze po tym, jak zmieniłem, aby użyć innego obrazu z formatem png. self.CollectionView.backgroundView = [[UIImageVIew alloc] initWithImage: [UIImage imageNamed: @ "newPic"]]]; –

3

Spróbuj

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

Nie wiem, czy jest to powiązane, ale znalazłem to po długim wyszukiwaniu. Mam nadzieję, że to kogoś oszczędza.

Podobnie jak w UICollectionView UITableView ma widok tła, który jest budowany przed AutoLayout. Jeśli używasz funkcji autoLayout, upewnij się, że backgroundView ma ramkę.W przeciwnym razie zniknie. W swojej podklasy komórek można zrobić:

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

jak wskazał w tym poście UICollectionView’s backgroundView property is horribly broken

jeden może mieć gorzki odczyt gdy cmd + kliknij klasy 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; 

twoja nowa jest włożona pod starą. właśnie spędziłem ostatnią godzinę na debugowaniu i przeklinaniu, próbując dowiedzieć się, co nie działa.

wystarczy użyć removeFromSuperview

Powiązane problemy