亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自動布局的UICollectionView自尺寸單元

自動布局的UICollectionView自尺寸單元

慕勒3428872 2019-07-08 15:12:25
自動布局的UICollectionView自尺寸單元我在試著自我調整UICollectionViewCells使用自動布局,但我似乎無法讓單元格按照內容進行調整。我很難理解單元格的大小是如何從單元格的內容中更新的。下面是我嘗試過的設置:習俗UICollectionViewCell帶著UITextView在它的內容視圖中。滾動UITextView是殘疾的。ContentView的水平約束是:“H:Guide[_textView(320)]”,即UITextView被固定在單元格的左側,顯式寬度為320。contentView的垂直約束是:“V:x-0-[_textView]”,即UITextView被釘在牢房頂部。這個UITextView將高度約束設置為UITextView報告將符合文本。下面是將單元格背景設置為紅色的樣子,UITextView背景設置為藍色:我把我一直在玩的項目放在GitHub上這里.
查看完整描述

3 回答

?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

更新SWIFT 4

systemLayoutSizeFittingSize重命名為systemLayoutSizeFitting


為IOS 9更新

在看到我的GitHub解決方案在iOS 9下崩潰后,我終于有時間對這個問題進行充分的調查。我現在已經更新了回購,以包括幾個不同的配置,為自我大小單元。我的結論是,自我大小的細胞在理論上是偉大的,但在實踐中是混亂的。在使用自調整大小的單元格時,請注意。

TL;DR

看看我的GitHub項目


自調整單元格只支持流布局,所以請確保這是您正在使用的。

要使自調整單元格工作,需要設置兩件事。

1.成套estimatedItemSize在……上面UICollectionViewFlowLayout

一旦您設置了estimatedItemSize財產。

self.flowLayout.estimatedItemSize = CGSize(width: 100, height: 100)

2.在單元格子類上添加對調整大小的支持。

這有兩種口味:自動布局自定義覆蓋preferredLayoutAttributesFittingAttributes.

使用自動布局創建和配置單元格

我不想詳細介紹這件事,因為這是一件很棒的事所以貼關于為單元格配置約束。只是小心一點Xcode 6中斷如果您支持IOS 7,則需要確保在單元格的內容視圖上設置自動調整大小掩碼,并且在加載單元格時,將內容視圖的邊界設置為單元格的邊界(即awakeFromNib).

您需要注意的是,您的單元格需要比表視圖單元格受到更嚴重的約束。例如,如果您希望您的寬度是動態的,那么您的單元格需要一個高度約束。同樣,如果希望高度是動態的,則需要對單元格設置寬度約束。

實施preferredLayoutAttributesFittingAttributes在您的自定義單元格中

調用此函數時,您的視圖已經配置了內容(即cellForItem已經打電話了)。假設您的約束已被適當設置,您可以有如下實現:

//forces the system to do one layout passvar isHeightCalculated: Bool = falseoverride func preferredLayoutAttributesFittingAttributes
(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
    //Exhibit A - We need to cache our calculation to prevent a crash.
    if !isHeightCalculated {
        setNeedsLayout()
        layoutIfNeeded()
        let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
        var newFrame = layoutAttributes.frame
        newFrame.size.width = CGFloat(ceilf(Float(size.width)))
        layoutAttributes.frame = newFrame
        isHeightCalculated = true
    }
    return layoutAttributes}

在IOS 9上,如果您不小心,這種行為可能會導致您的實現崩潰(請參閱更多信息)。這里)。當你實現preferredLayoutAttributesFittingAttributes您需要確保只更改布局屬性的框架一次。如果不這樣做,布局將無限期地調用您的實現,并最終崩潰。一種解決方案是將計算出來的大小緩存在單元格中,并在任何時候重復使用單元格或更改其內容,就像我對isHeightCalculated財產。

體驗你的布局

此時,您應該在您的集合視圖中具有“功能”動態單元格。在我的測試中,我還沒有找到足夠的開箱即用解決方案,所以如果有,請隨意評論。我還是覺得UITableView贏得動態尺寸IMHO的戰斗。

警告

要非常注意,如果您使用原型單元格來計算估計的ItemSize-如果您的XIB使用大小類..這樣做的原因是,當您從XIB加載單元時,它的大小類將被配置為Undefined..這只會在iOS 8和更高版本上被打破,因為在iOS 7上,大小類將根據設備加載(ipad=正則-any,iphone=Compact-any)。您可以在不加載XIB的情況下設置估計ItemSize,也可以從XIB加載單元格,將其添加到集合視圖(這將設置traitCollection),執行布局,然后從SuperView中刪除它?;蛘撸部梢宰屇膯卧窀采wtraitCollection獲取并返回適當的特征。由你決定。

如果我錯過了什么,請告訴我,希望我能幫上忙,并祝你好運編碼。


查看完整回答
反對 回復 2019-07-08
?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

在iOS 10中有一個新的常量稱為UICollectionViewFlowLayout.automaticSize(原)UICollectionViewFlowLayoutAutomaticSize),因此:

self.flowLayout.estimatedItemSize = CGSize(width: 100, height: 100)

你可以用這個:

self.flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

它具有更好的性能,特別是當集合視圖中的單元格具有常量wid時。


查看完整回答
反對 回復 2019-07-08
  • 3 回答
  • 0 關注
  • 3101 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號