2013-05-17 6 views
8

私はUICollectionViewを持っており、CollectionViewにデータがあるかどうかに基づいてbackgroundViewプロパティを使用して背景イメージを設定しようとしています。データを変更するナビゲーションがあり、コレクションビュー([self.collectionView reloadData])を再読み込みします。何らかの理由で私は非常に奇妙な結果を得ています。まず、プロパティを設定すると、collectionViewセルの上に表示され、それらを隠すことがあります。次に、プロパティを変更しようとすると、画面上で変更されません。 これは私をナットにしています!実装するのはとても簡単なことでした。UICollectionViewのbackgroundViewプロパティを変更できません

だからコードです。 UICollectionViewController

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

ためviewDidLoadの負荷セクション方法はちょうど私が、その後も存在する場合に基づいて、追加するためにどのようなビューを決定した背景ビューを設定するためのメソッドを呼び出し、コレクションビューのために使用していたデータをロードします以下のように任意のデータ:

- (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を別のイメージに変更すると、この新しいイメージは表示されません。

さらに奇妙です。いくつかのセルが表示され、背景イメージを設定すると、このイメージはセルの後ろにきれいに表示されます。新しいデータセットでデータを再ロードすると、セルの前にイメージが表示され、セルが隠されます。私は、バックグラウンドビューが他のすべての背後にあるべきであるとして、これがどのように起こるか分かりません。

これはなぜ起こっているのですか?それはどこにでもキャッシュされていますか?または私はちょうど何かばかげているのですか?私はここで全然犠牲になっています - それはそれが使用するカスタムレイアウトを書くより多くの時間を費やしました!

+0

複数の「UICollectionViews」が作成され、サブビューとして追加されましたか?それはあなたが見ている行動を説明するでしょう。 – bobnoble

+0

コメントありがとうbobnoble。もしこれが起こったのではないかと思った。私が知る限りでは、コードのチェックとInstruments Allocationツールの実行の両方から、いいえ、ただ1つのUICollectionViewがあります。 – SimonB

+0

あなたのsetupBackgroundImageがメインスレッド以外のスレッドで呼び出されることがありますか? – honus

答えて

0

を試してみて、私は私の質問で述べた奇妙な行動を取得していますなぜ私はまだ理解していないが、私は、私の特定の問題への解決策を見つけ、少なくともこの方法は私がすることができます背景画像を変更します。

基本的には、UIImageViewを保持するプロパティを作成し、UICollectionViewをこのプロパティに設定します。次に、私が保存したプロパティを使用して画像ビュー内の画像を変更することができます。 self.backgroundImageView

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

は、私は、バックグラウンドビューへの参照を維持する目的のために定義したプロパティです。

誰かが質問に記載された奇妙な行動についての洞察を持っていれば、本当にそれを聞いてみたいと思うでしょう!

+0

あなたの背景ではないと確信していますかイメージ形式の問題?私はcollecitoview backgroudimageを設定しようとしたときに同じ問題がありました。 png形式の他の画像を使用するように変更した後は正常に動作します。 self.CollectionView.backgroundView = [[UIImageVIew alloc] initWithImage:[UIImage imageNamed:@ "newPic"]]; –

3

は、[OK]を、この

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

これが関連しているかどうかは本当にわかりませんが、長い検索の後にこれを見つけました。これで誰かが時間を節約できることを願っています。

UICollectionViewと同様に、UITableViewはAutoLayoutより前にビルドされた背景ビューを持っています。 autoLayoutを使用する場合は、backgroundViewにフレームがあることを確認する必要があります。それ以外の場合は消えます。あなたが行うことができますあなたの細胞サブクラスで:CMD +はUICollectionViewCellクラスをクリックしたとき

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

この記事で指摘したようにUICollectionView’s backgroundView property is horribly broken

1は苦い読書を持つことができます。


// 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を使用してください

関連する問題