前言
??隨著硬件性能的不斷提升衫哥,以往為了減少設(shè)備性能的消耗而進(jìn)行預(yù)計(jì)算視圖高度正逐步被xib約束布局替換厂僧,舉個(gè)例子她肯,我們可以直接在xib中設(shè)置好各視圖控件的相對約束位置怜校,之后根據(jù)具體的寬度來計(jì)算對應(yīng)的高度间影,該方法能有效的降低手動(dòng)計(jì)算產(chǎn)生誤差的情況。
??當(dāng)然也不能完全不考慮性能問題茄茁,針對計(jì)算出來的高度需要進(jìn)行緩存魂贬,減少同一視圖的重復(fù)計(jì)算。
UICollectionView中的使用
布局設(shè)置
??設(shè)置子視圖與Collection View Cell
容器的相對位置裙顽。
??由于高度需要通過子視圖來計(jì)算付燥,所以我給子視圖設(shè)置了一個(gè)固定高度 128,且設(shè)置好上下間距 8愈犹,這樣根據(jù)自動(dòng)布局的計(jì)算键科,最后得到的高度就是 128+8+8=144,但是這個(gè)高度與當(dāng)前contentView
的高度 200 不符合漩怎,引起了沖突勋颖。
??為了消除這個(gè)沖突但又不影響高度的計(jì)算,我們有兩個(gè)方法來解決勋锤,下面我們來看看具體是如何操作的饭玲。
方案一
??修改子視圖底部間距優(yōu)先值,默認(rèn)優(yōu)先值為1000叁执,適當(dāng)調(diào)低優(yōu)先值茄厘,這個(gè)時(shí)候會(huì)變成一條虛線,沖突解除徒恋,并且不會(huì)影響后續(xù)的計(jì)算蚕断。
方案二
??調(diào)整Collection View Cell
容器的高度與設(shè)置的高度相同,但是這個(gè)方案會(huì)導(dǎo)致每次布局輕微的調(diào)整就引起沖突入挣,所以不推薦使用該方案
??至此就可以實(shí)現(xiàn)自動(dòng)布局了
注意事項(xiàng)
Q1: 在部分iOS版本中會(huì)出現(xiàn)無論怎么調(diào)用 UIView
的systemLayoutSizeFitting
方法返回的結(jié)果都是初始設(shè)置的值?
??這是因?yàn)?code>UICollectionViewCell中的contentView
視圖約束并沒有設(shè)定好亿乳,這個(gè)時(shí)候我們只需要對其設(shè)置約束即可。
open func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) - > CGSize
class Cell: UICollectionViewCell {
override init(frame: CGRect) {
super.init(frame: frame)
contentView.translatesAutoresizingMaskIntoConstraints = false
[contentView.topAnchor.constraint(equalTo: topAnchor),
contentView.leftAnchor.constraint(equalTo: leftAnchor),
contentView.rightAnchor.constraint(equalTo: rightAnchor),
contentView.bottomAnchor.constraint(equalTo: bottomAnchor)
].forEach({ $0.isActive = true })
}
required init?(coder: NSCoder) {
super.init(coder: coder)
contentView.translatesAutoresizingMaskIntoConstraints = false
[contentView.topAnchor.constraint(equalTo: topAnchor),
contentView.leftAnchor.constraint(equalTo: leftAnchor),
contentView.rightAnchor.constraint(equalTo: rightAnchor),
contentView.bottomAnchor.constraint(equalTo: bottomAnchor)
].forEach({ $0.isActive = true })
}
}
Q2: 當(dāng)快速滑動(dòng)時(shí)出現(xiàn)布局抖動(dòng)的問題径筏?
??由于初始情況并不明確到底cell
有多大灵巧,這時(shí)候當(dāng)實(shí)際計(jì)算結(jié)果偏差過大時(shí)就會(huì)出現(xiàn)這種抖動(dòng)情況屯换,我們可以給UICollectionViewFlowLayout
添加一個(gè)預(yù)估值estimatedItemSize
以減少抖動(dòng)的情況,注意如果約束布局沒有確定寬或高,則會(huì)直接沿用estimatedItemSize中設(shè)置的值串塑。
func setupCollection() {
let layout = UICollectionViewFlowLayout()
layout.estimatedItemSize = CGSize(width: 100, height: 100)
collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: layout)
}