如何在不使用UICollectionView
方法的情况下调整reload
的单元格大小?
只想在某个事件上调用以下方法。我不想重新加载UICollectionView
或其任何部分或行。
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
任何帮助将不胜感激。
提前致谢...
答案 0 :(得分:20)
我通过以下代码行解决了我的问题。
COLLECTIONVIEW?.collectionViewLayout.invalidateLayout()
答案 1 :(得分:0)
我可以确认Payal Maniyar的解决方案也适用于UICollectionCompositional版面。 在我的情况下,我有一个CollectionViewCell,它仅嵌入UITextView。合成布局正确地找出了单元格中文本视图的初始大小。 (注意:您可以通过在UITextView中禁用滚动来实现此目的,因为它已经在另一个可滚动视图中了)。问题出在用户直接在文本视图中键入内容时,我想更改单元格的高度而不重新加载它。我想避免重新加载单元的原因有两个。当用户键入时,a)重新加载的单元格闪烁; b)文本视图失去焦点;因此,迫使用户再次单击文本视图以继续输入。所以我的解决方案如下:
我有一个仅包含UITextView的单元格,其中该单元格也是UITextView的委托,例如:
class MyCollectionCell: UICollectionViewCell {
@IBOutlet private weak var myTextView: UITextView!
//this local variable used to determine if the intrinsic content size has changed or not
private var textViewHeight: CGFloat = .zero
...
...
override func awakeFromNib() {
super.awakeFromNib()
myTextView.delegate = self
}
...
...
}
将此单元格修改为UITextViewDelegate
extension MyCollectionCell: UITextViewDelegate {
func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
//this assumes that collection view already correctly laid out the cell
//to the correct height for the contents of the UITextView
//textViewHeight simply needs to catch up to it before user starts typing
let fittingSize = textView.sizeThatFits(CGSize(width: myTextView.frame.width, height: CGFloat.greatestFiniteMagnitude))
textViewHeight = fittingSize.height
return true
}
func textViewDidChange(_ textView: UITextView) {
//flag to determine whether textview's size is changing
var shouldResize = false
//calculate fitting size after the content has changed
let fittingSize = textView.sizeThatFits(CGSize(width: myTextView.frame.width, height: CGFloat.greatestFiniteMagnitude))
//if the current height is not equal to
if textViewHeight != fittingSize.height {
shouldResize = true
//save the new height
textViewHeight = fittingSize.height
}
//notify the cell's delegate (most likely a UIViewController)
//that UITextView's intrinsic content size has changed
//perhaps with a protocol such as this:
delegate?.textViewDidChange(newText: textView.text, alsoRequiresResize: shouldResize)
}
然后,当委托人收到通知时,也许会保存更新的文本并更新如下布局:
myCollectionView.collectionViewLayout.invalidateLayout()
此解决方案的最好之处在于,您不必调用collectionView(_:layout:sizeForItemAt:)来调整单元格的大小,因为您并非一开始就使用笨拙的FlowLayout。
干杯!