8

CollectionViewにUICollectionViewデータがあるかどうかに基づいて、backgroundView プロパティを使用して背景画像を設定しようとしています。データを変更するナビゲーションがあり、コレクション ビューをリロードします (を呼び出します[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 が呼び出され、backgroundImage プロパティが nil に設定されていることを確認できます (ここでブレークポイントを設定して値を確認したところ、nil でした)。しかし、背景画像はまだ表示されています。

さらに、nil を別の画像に変更すると、この新しい画像は表示されません。

そしてさらに奇妙な。いくつかのセルを表示して背景画像を設定すると、この画像はセルの後ろにきれいに表示されます。次に、新しいデータ セットで reloadData を実行すると、画像がセルの前に表示され、セルが見えなくなります。背景ビューが他のすべてのビューの背後にある必要があるため、これがどのように発生するのかわかりません。

なぜこれが起こっているのか誰にも分かりません。どこかにキャッシュされていますか?それとも私は何かばかげたことをしていますか?私はここで完全に途方に暮れています-使用するカスタムレイアウトを書くよりも、これに多くの時間を費やしました!

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 プロパティはひどく壊れています

UICollectionViewCellクラスをcmd +クリックすると、苦い読み物になる可能性があります。


// 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;

新しいものは古いものの下に挿入されます。最後の 1 時間は、何が機能していないのかを見つけようとして、デバッグと罵倒に費やしました。

removeFromSuperviewを使用するだけです

于 2015-11-27T11:25:12.803 に答える
0

わかりました、特定の問題の解決策を見つけましたが、質問に記載されている奇妙な動作が発生する理由はまだわかりませんが、少なくともこの方法で背景画像を変更できます。

基本的に、 a を保持するプロパティを作成し、このプロパティに を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バックグラウンド ビューへの参照を保持する目的で定義したプロパティはどこにありますか。

質問に記載されている奇妙な動作について誰かが洞察を持っている場合は、ぜひ聞いてみたいと思います!

于 2013-05-17T10:26:44.283 に答える