ios - uicollectionview教學 - uicollectionviewflowlayout




UICollectionView在iPhone X的橫向 (3)

UICollectionView旨在靈活適用於各種佈局。 最常見的佈局是具有多行和多列的網格,但可以使用UICollectionView創建非網格佈局。

另一方面, UITableView是為全寬度單元設計的。

因此, UITableView有內置的處理安全區域插入的支持是有意義的,因為表格視圖佈局總是受其影響。 因為UICollectionView使用自定義佈局,所以在每個實現的基礎上解決這些問題是有意義的,而不是試圖提供一種萬能的解決方案。

當使用橫向的iPhone X時,您應該檢查safeAreaInsets以在左側和右側製作合適的大型水槽。 UITableView具有新的insetsContentViewsToSafeArea屬性(默認值為true),以自動將單元格內容保存在安全區域中。

我很驚訝,UICollectionView似乎沒有任何類似的東西。 我期望對於一個垂直滾動的集合視圖,左右兩側將在橫向上嵌入安全區域(相反,如果縱向需要,橫向滾動的集合視圖將被插入)。

確保這種行為的最簡單的方法似乎是添加到集合視圖控制器:

- (void)viewSafeAreaInsetsDidChange {
    [super viewSafeAreaInsetsDidChange];
    UIEdgeInsets contentInset = self.collectionView.contentInset;
    contentInset.left = self.view.safeAreaInsets.left;
    contentInset.right = self.view.safeAreaInsets.right;
    self.collectionView.contentInset = contentInset;
}

假設contentInset.left / right通常是零。

(注意:對於UICollectionViewController,需要是self.view.safeAreaInsets ;在調用的時候, safeAreaInsets的改變奇怪地還沒有傳播到self.collectionView

我錯過了什麼嗎? 該樣板文件非常簡單,但是現在對於觸摸屏幕邊緣的每個集合視圖來說都是非常有必要的。 蘋果似乎很奇怪,沒有提供一些默認啟用的功能。


雖然Nathan對於各種佈局的UICollectionView的多功能性是正確的,但我主要關心的是使用UICollectionViewFlowLayout的“默認”情況。

原來,iOS 11已經添加了一個sectionInsetReference屬性到UICollectionViewFlowLayout 。 它的官方文檔目前沒有描述,但是標題描述為

章節插圖的參考邊界將被定義為相對於。 默認為.fromContentInset

注:內容插圖將始終受到尊重。 例如,如果sectionInsetReference等於.fromSafeArea ,但調整後的內容插入大於安全區域和區段插入的組合,則區段內容將與內容插入對齊。

可能的值是

@available(iOS 11.0, *)
public enum UICollectionViewFlowLayoutSectionInsetReference : Int {
    case fromContentInset
    case fromSafeArea
    case fromLayoutMargins
}

並將其設置為.fromSafeArea會產生所需的結果,即最初處於縱向方向時:

然後當旋轉到風景時,細胞被嵌入,使得它們完全在安全區域內:

...但是,目前有一個錯誤,並且在視圖處於橫向狀態旋轉回肖像時,它將繼續如同左/右safeAreaInsets設置為橫向值:

關於這個問題,我已經提交了雷達( rdar:// 34491993 )。


有同樣的問題。 這對我工作:

override func viewDidLoad() {
    if #available(iOS 11.0, *) {
        collectionView?.contentInsetAdjustmentBehavior = .always
    }
}

.always枚舉的文檔說:

在內容調整中始終包含安全區域插頁。

在手機旋轉的情況下,該解決方案也能正常工作。





iphone-x