web-dev-qa-db-ja.com

UICollectionView contentOffsetはカスタムレイアウトで変更されます

カスタムのUICollectionViewLayoutを備えたUICollectionViewがあります(実際、 this Nice layout を使用しています)。

contentOffset = CGPointZero in viewDidLoad。ただし、viewDidLoadの後、オフセットは-20になり、コンテンツは次のようにプッシュダウンされます。


picture

(ラインと同じ高さになるはずです)。インターフェイスビルダーでコレクションビューのレイアウトを読み込んでいます。私の問題は this one に非常に似ているようですが、そこにある解決策は私にとってはうまくいきません。

レイアウト実装でcollectionViewContentSizeを変更して、常にcollectionViewのサイズよりも大きくなるようにしました。これは、コンテンツを下にスクロールして(collectionViewの高さよりも短い)、余分なスペースを非表示にできることを意味しますが、上にスクロールして表示することもできます。

何も機能していないようです!

23
Evan Cordell

私が思いついた唯一の解決策は、ほとんど容認できない動作でした:

_- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (self.collectionView.contentOffset.y < 0) {
        self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0);
    }
}
_

collectionViewContentSizefmax(self.collectionView.frame.size.height + 20, [self stackedSectionHeight])にコンテンツの高さを設定するだけでなく

これにより、セクションヘッダーの上のスペースは削除されますが、上部の「バウンス」は削除されます。かなり次善のソリューションですが、かなり許容できます。

誰かがそれを持っているか、見つけたらこの答えを更新します。

16
Evan Cordell

これが起こる理由を見つけました。この質問から受け入れられた答えを確認してください: ステータスバーとナビゲーションバーは、iOS 7のビューの境界線上に表示されます

実際、IBのUIViewControllerのedgesForExtendedLayoutまたはautomaticallyAdjustsScrollViewInsetsプロパティ(Storyboardを使用する場合)をviewDidLoadに設定するだけで、問題が修正されます。

IOS6以前ではクラッシュが発生するため、このプロパティのチェックを使用できることを忘れないでください。

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

よろしく!

48
alexey.hippie

スクロールビュー内にスクロールビューがあるiOS 11で、この問題が発生し始めました。それを理解するためにほぼ一日かかった。

コンテンツのインセット調整動作を設定してみてください。

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
}

これにより、collectionviewフレームが囲むscrollviewの安全な領域を通過するため、collectionviewがコンテンツのインセットを少し下に調整するように修正されました。

3
David Rees
let oldContentSizeHeight: CGFloat = self.colName.contentSize.height
        self.colName.reloadData()
        self.colName.layoutIfNeeded()
        self.view.layoutIfNeeded()
        self.colName.contentOffset.y = self.colName.contentOffset.y + (self.colName.contentSize.height - oldContentSizeHeight)
0
Ankit Gabani

これはSwift 4.2正解のバージョンですが、これを実行可能にするには、プロトコルUIScrollViewDelegateを追加する必要があります。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if self.collectionView.contentOffset.y < 0 {
        self.collectionView.contentOffset = CGPoint(x: self.collectionView.contentOffset.x, y: 0.0)
    }
}