2

Navigation Controller と Tab Bar Controller の一部である UICollectionViewController があります。Navigation Controller の冒頭で、View の下部にツールバーを表示するように Interface Builder を設定しました。Navigation Controller の最初の View Controller では[self.navigationController setToolbarHidden:YES animated:YES];、ツールバーを非表示にするために使用しています。次に、UICollectionViewController で使用します。

-(void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:NO animated:YES];
}

ツールバーを表示するため。この部分は完全に機能します。私の問題は、UICollectionView にある UICollectionViewCell に起因します。UICollectionView のフルサイズにしたいのですが、AutoLayout を使用しているので、以下を使用しています。

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return self.collectionView.frame.size;
}

ただし、ビューが初めて読み込まれると、間違った値が返されます。ビューと CollectionView が初めて読み込まれると、ツールバーの高さを含む collectionView のサイズが返され、次の警告が表示されます。

アイテムの高さは、UICollectionView の高さからセクション インセットの上部と下部の値を引いた値よりも小さくする必要があります。

そして、セルはロードされません。ただし、警告の後に強制する[self.collectionView reloadData];と、正しい値が返されself.collectionView.frame.size、セルが読み込まれます。

私はこれに本当に不満を感じており、誰でも提供できる助けをいただければ幸いです。

編集: Mundi のコメントを読んだ後、コードの一部を次のように変更しました。

-(void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:NO animated:YES];
    [self.collectionView reloadData];
}

そして、問題は解決しました。しかし、今、私は新しいが関連する問題を抱えています。[self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];(selectedIndexPath は最初のビュー コントローラーからプッシュされます)を追加するviewWillAppearと、UICollectionView アイテムのサイズについて同じ警告が表示されます。次のようなコードがある場合:

-(void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:NO animated:YES];
    [self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
    [self.collectionView reloadData];
}

そのサイズの警告は表示されませんが、collectionView は常にインデックス 0 ではなくselectedIndexPath. 順序を次のように変更すると、次のようになります。

-(void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:NO animated:YES];
    [self.collectionView reloadData];
    [self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
}

そのサイズの警告が表示され、メソッドを呼び出して reloadData を呼び出すまで、セルは読み込まれません。ただし、正しい indexPath から開始されます。

4

1 に答える 1

1

この問題は、実際にはビューのライフサイクルを扱うことに関するものです。viewWillAppearすべてのサブビューは既に配置されているため、ツールバーを非表示にするのが遅すぎる可能性があります。

ツールバーを表示した後に呼び出すソリューションreloadDataは、ビューが表示される前にすべてが発生するため、それほど悪くはありません。これは論理的です。ジオメトリが変更されたため、レイアウトを再計算する必要があります。

hidesBottomBarWhenPushedビュー コントローラのプロパティを試してみてください。おそらく、何もコーディングしなくても、この問題を処理できます。

于 2013-07-27T07:57:53.677 に答える