Невозможно изменить свойство backgroundView для UICollectionView
У меня есть UICollectionView
и я пытаюсь установить фоновое изображение, используя свойство backgroundView, основываясь на том, есть ли какие-либо данные в CollectionView или нет. У меня есть навигация, которая изменит данные, и перезагрузит представление коллекции (вызов [self.collectionView reloadData]
). По некоторым причинам я получаю очень странные результаты. Во-первых, иногда, когда я устанавливаю свойство, оно появляется поверх ячеек collectionView и скрывает их. Во-вторых, когда я пытаюсь изменить свойство, оно не меняется на экране. Это сводит меня с ума! Казалось, такая простая вещь для реализации!
Так в Кодексе. ВviewDidLoad
для UICollectionViewController
- (void)viewDidLoad {
[self loadSections];
[self setupBackgroundView;
}
Метод "Загрузка разделов" просто загружает данные, которые я использую для представления коллекции, который затем также вызывает метод, чтобы установить фоновое представление, которое решает, какое представление добавить, основываясь на наличии каких-либо данных, как показано ниже:
- (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;
}
}
Теперь, когда представление загружается впервые, если нет данных и, следовательно, нет ячеек для отображения фонового изображения, изображение отображается правильно. Затем я изменяю данные, и теперь у меня есть несколько ячеек для отображения, вызывается setupBackgroundImage, и я могу убедиться, что для свойства background Image установлено значение nil (здесь я даже указал точку останова и проверил значение, и оно равно nil). НО фоновое изображение все еще видно.
Кроме того, если я заменяю ноль на другое изображение, это новое изображение никогда не показывается.
И даже более странно. Если у меня есть несколько ячеек и я установил фоновое изображение, то это изображение отображается аккуратно за ячейками. Если я затем перезагружаю данные с новым набором данных, то изображение отображается перед ячейками, скрывая их. Я понятия не имею, как это происходит, так как тогда фоновое представление должно быть позади всех остальных.
Кто-нибудь знает, почему это происходит? Кэшируется ли это где-нибудь? или я просто делаю что-то глупое? Я в полном недоумении - потратил на это больше времени, чем на создание собственного макета, который он использует!
4 ответа
Хорошо, я нашел решение своей конкретной проблемы, хотя я до сих пор не понимаю, почему я получаю странное поведение, упомянутое в моем вопросе, по крайней мере этот способ позволяет мне изменить фоновое изображение.
В основном я создаю свойство для хранения UIImageView
а затем установите UICollectionView
к этой собственности. Затем я могу изменить изображение в представлении изображения через свойство, которое я сохранил.
- (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];
}
куда self.backgroundImageView
это свойство, которое я определил с целью сохранения ссылки на фоновое представление.
Если у кого-то есть понимание странного поведения, упомянутого в вопросе, мне было бы действительно интересно услышать это!
Попробуй это
self.collectionView.backgroundView =[[UIView alloc]initWithFrame:self.collectionView.bounds];
UIImageView *imgVW=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"TakePhoto"]];
[self.collectionView.backgroundView addSubView:imgVW];
Как указано в этом посте, свойство backgroundView UICollectionView ужасно нарушено
можно получить горькое чтение, когда cmd+ щелкнет по классу 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;
Ваш новый вставляется ниже старого. только что потратил мой последний час на отладку и ругань, пытаясь выяснить, что не работает.
просто используйте removeFromSuperview
Я действительно не знаю, связано ли это с этим, но я нашел это после долгих поисков. Надеюсь, это сэкономит кому-то время.
Как и в случае UICollectionView, UITableView имеет фоновое представление, которое создается до AutoLayout. Если вы используете autoLayout, вы должны убедиться, что backgroundView имеет рамку. В противном случае это исчезнет. В вашем подклассе ячейки вы можете сделать:
-(void)setBackgroundView:(UIView *)backgroundView
{
super.backgroundView = backgroundView;
self.backgroundView.translatesAutoresizingMaskIntoConstraints = NO;
[self.backgroundView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero];
}
Хорошо , мне нужно было иметь 2 разных представления и переключаться между ними... похоже, что backgroundView сильно сломан, но мне удалось получить желаемую функциональность, подобную этой
backgroundLoadingView?.isHidden = true
noItemsBackgroundView?.isHidden = false
backgroundView = noItemsBackgroundView
это означает, что я должен скрыть / показать желаемое, а также назначить желаемый вид свойству
переключиться на loadingView
backgroundLoadingView?.isHidden = false
noItemsBackgroundView?.isHidden = true
backgroundView = backgroundLoadingView
и полностью скрыть это
backgroundView?.isHidden = true
альт. у вас могут быть разные представления в одном представлении, которые вы назначаете фоновому представлению, а затем переключаете его подпредставления вокруг