web-dev-qa-db-ja.com

UICollectionViewは上マージンを追加します

親指を水平に表示するUICollectionViewコントロールを配置したい(親指の1行のみ)。何らかの理由で、UICollectionViewが親指を44ピクセル下に押しているため、「0」の高さは実際には「44」です。ナビゲーションバーの高さを考慮するために、このスペースを追加しているのではないかと思います(ただ仮定します)。 UICollectionViewは画面の一部のみにあるため、このマージンは必要ありません。削除する方法はありますか?

75
bashan

問題は、コレクションビューのコンテンツインセットにある可能性があります。 self.automaticallyAdjustsScrollViewInsets = NO;をView ControllerのviewDidLoadメソッドに追加してみてください。

187

ストーリーボードでもこれを設定できます。

ViewControllerを選択したことを確認し、「スクロールビューのインセットを調整」のチェックを外します。

enter image description here

ただし、このIB /ストーリーボードメソッドがiOS6で何を行うかはテストしていません。コードメソッドでは、VCがメソッドに応答することを確認する必要があります。

if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
self.automaticallyAdjustsScrollViewInsets = NO;
}
87
siburb

私は追加することがわかりました:

self.edgesForExtendedLayout = UIRectEdgeNone;

View Controllerでは、受け入れられた答えを機能させることができなかったため、UICollectionViewをロードして問題を解決しました。

私がこの答えを見つけた質問は here で見つけることができ、自動調整されたスクロールビューインセット、拡張レイアウト、拡張レイアウト用のEdgeの違いの非常に詳細で興味深い説明を提供します。

読む価値あり

16
simon_smiley

スウィフト3:

まず、viewControllers automaticallyAdjustsScrollViewInsetsをfalseに設定します。

self.automaticallyAdjustsScrollViewInsets = false

次に、それに応じてエッジのインセットを調整できるはずです。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    //top, left, bottom, right
    return UIEdgeInsets(top: 10, left: 0, bottom: 0, right: 0)
}
5
Josh O'Connor

コレクションビューのデリゲートフローレイアウトを使用して、この値を0に強制することができます。

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(PADDING_TOP, PADDING_LEFT, PADDING_BOTTOM, PADDING_RIGHT);
}

パディングの値を変更します。

5
Jordan Montel

いくつかの他の人が言及したように、viewController.automaticallyAdjustsScrollViewInsetsiOS 11から非推奨 になりました。私の解決策...

Swift 4.2、Xcode 10.1、iOS 12.1:

何らかの理由で、collectionView.contentSize.heightがコレクションビューの解決された高さよりも小さく表示されていました。最初に、スーパービューの高さの1/2に対して自動レイアウト制約を使用していました。 これを修正するために、ビューの「安全な領域」に関連するように制約を変更しました。

これにより、collectionView.contentSize.heightを使用して、コレクションビューに垂直にセルの高さを設定できました。

private func setCellSize() {
    let height: CGFloat = (collectionView.contentSize.height) / CGFloat(numberOfRows)
    let width: CGFloat = view.frame.width - CGFloat(horizontalCellMargin * 2)

    let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: width, height: height)
}

Before

height relative to superviewbad collection view layout

After

height relative to safe areagood collection view layout

0
Andrew Kirna