カスタムのUICollectionViewLayoutを備えたUICollectionViewがあります(実際、 this Nice layout を使用しています)。
contentOffset = CGPointZero
in viewDidLoad。ただし、viewDidLoadの後、オフセットは-20になり、コンテンツは次のようにプッシュダウンされます。
(ラインと同じ高さになるはずです)。インターフェイスビルダーでコレクションビューのレイアウトを読み込んでいます。私の問題は this one に非常に似ているようですが、そこにある解決策は私にとってはうまくいきません。
レイアウト実装でcollectionViewContentSize
を変更して、常にcollectionViewのサイズよりも大きくなるようにしました。これは、コンテンツを下にスクロールして(collectionViewの高さよりも短い)、余分なスペースを非表示にできることを意味しますが、上にスクロールして表示することもできます。
何も機能していないようです!
私が思いついた唯一の解決策は、ほとんど容認できない動作でした:
_- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (self.collectionView.contentOffset.y < 0) {
self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0);
}
}
_
collectionViewContentSize
のfmax(self.collectionView.frame.size.height + 20, [self stackedSectionHeight])
にコンテンツの高さを設定するだけでなく
これにより、セクションヘッダーの上のスペースは削除されますが、上部の「バウンス」は削除されます。かなり次善のソリューションですが、かなり許容できます。
誰かがそれを持っているか、見つけたらこの答えを更新します。
これが起こる理由を見つけました。この質問から受け入れられた答えを確認してください: ステータスバーとナビゲーションバーは、iOS 7のビューの境界線上に表示されます
実際、IBのUIViewControllerのedgesForExtendedLayout
またはautomaticallyAdjustsScrollViewInsets
プロパティ(Storyboardを使用する場合)をviewDidLoad
に設定するだけで、問題が修正されます。
IOS6以前ではクラッシュが発生するため、このプロパティのチェックを使用できることを忘れないでください。
if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
self.automaticallyAdjustsScrollViewInsets = NO;
}
よろしく!
スクロールビュー内にスクロールビューがあるiOS 11で、この問題が発生し始めました。それを理解するためにほぼ一日かかった。
コンテンツのインセット調整動作を設定してみてください。
if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
}
これにより、collectionviewフレームが囲むscrollviewの安全な領域を通過するため、collectionviewがコンテンツのインセットを少し下に調整するように修正されました。
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)
これは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)
}
}