8

我有一个UICollectionView,我正在尝试根据 CollectionView 中是否有任何数据使用 backgroundView 属性设置背景图像。我有导航,它将更改数据,并重新加载集合视图(调用[self.collectionView reloadData])。出于某种原因,我得到了非常奇怪的结果。首先,有时当我设置属性时,它会出现在 collectionView 单元格的顶部并遮住它们。其次,当我尝试更改属性时,它不会在屏幕上更改。这让我发疯了!实现起来似乎很简单!

所以在代码中。在viewDidLoadUICollectionViewController

- (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 被调用,我可以验证 backgroundImage 属性是否设置为 nil(我什至在此处设置断点并检查值,它是 nil)。但是背景图像仍然可见。

此外,如果我将 nil 更改为另一个图像,则永远不会显示此新图像。

更奇怪的是。如果我显示了一些单元格并设置了背景图像,则该图像会整齐地显示在单元格后面。如果我随后使用新数据集重新加载数据,则图像会显示在单元格前面,使它们变得模糊。我不知道这是怎么发生的,因为背景视图应该在所有其他视图之后。

有谁知道为什么会这样。它是否被缓存在任何地方?还是我只是在做一些傻事?我在这里完全不知所措-在这上面花费的时间比编写它使用的自定义布局还要多!

4

5 回答 5

3

试试这个

self.collectionView.backgroundView =[[UIView alloc]initWithFrame:self.collectionView.bounds]; 
UIImageView *imgVW=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"TakePhoto"]];
[self.collectionView.backgroundView addSubView:imgVW];
于 2013-05-17T09:32:09.287 回答
1

正如这篇文章中指出的那样,UICollectionView 的 backgroundView 属性严重损坏

当 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

于 2015-11-27T11:25:12.803 回答
0

好的,我找到了针对我的具体问题的解决方案,尽管我仍然不明白为什么我会遇到问题中提到的奇怪行为,但至少这种方式可以让我更改背景图像。

基本上我创建一个属性来保存 aUIImageView然后设置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我为保持对背景视图的引用而定义的属性在哪里。

如果有人对问题中提到的奇怪行为有任何见解,我真的很想听听!

于 2013-05-17T10:26:44.283 回答
0

我真的不知道这是否相关,但经过长时间的搜索后我发现了这个。希望这可以节省一些时间。

与 UICollectionView 一样,UITableView 具有在 AutoLayout 之前构建的背景视图。如果你使用 autoLayout,你应该确保 backgroundView 有一个框架。否则就是会消失。在您的单元子类中,您可以执行以下操作:

    -(void)setBackgroundView:(UIView *)backgroundView
{
    super.backgroundView = backgroundView;
    self.backgroundView.translatesAutoresizingMaskIntoConstraints = NO;
    [self.backgroundView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero];
}
于 2015-01-08T13:28:20.613 回答
0

好的,我需要有 2 个不同的视图并在它们之间切换......看起来 backgroundView 很糟糕,但我设法获得了这样的所需功能

backgroundLoadingView?.isHidden = true
noItemsBackgroundView?.isHidden = false
backgroundView = noItemsBackgroundView

这意味着我必须隐藏/显示所需的视图,并将所需的视图分配给属性

切换到 loadingView

    backgroundLoadingView?.isHidden = false
    noItemsBackgroundView?.isHidden = true
    backgroundView = backgroundLoadingView

并完全隐藏它

backgroundView?.isHidden = true

alt。您可以在一个视图中有不同的视图,您可以将它们分配给背景视图,然后切换其子视图

于 2019-11-22T15:11:32.450 回答