我找到了下一个答案,使UIView的高度与其内容https://stackoverflow.com/a/39527226/7767664
匹配我对其进行了测试,它可以正常工作(如果情节提要中的UIView高度大小大于或小于其内容,则在运行时它将自动调整大小以匹配内容)。
但是,如果我使用UICollectionViewCell
而不是UIView
,则什么也没有改变,单元格的高度永远不会改变,它始终具有故事板属性中具有的硬编码高度:
我还能做什么?
我在UIControllerView中也有2个部分(2列)。 即使它们的大小内容不同,一行中的两个单元格也应具有相同的大小(在将RecyclerView与GridLayoutManager一起使用时,在Android中本机实现的这种操作非常简单)
更新
它可以与UIView
一起使用,因为我将其最大限制条件设置为“安全Are'a顶部”
我无法使用UICollectionViewCell
更新2
似乎我对这个答案https://stackoverflow.com/a/25896386/7767664
有所进步但我需要newFrame.size.width = CGFloat(ceilf(Float(size.width)))
而不是newFrame.size.height = CGFloat(ceilf(Float(size.height)))
当我们使用此解决方案时,请不要在单元格底部添加任何约束,否则它将无法正常工作
使用此解决方案,我无法真正使用任何边距,否则其中的某些部分在单元格底部变得不可见
我想可以通过https://stackoverflow.com/a/31279726/7767664这个问题来解决
答案 0 :(得分:0)
您可以尝试在collectionView扩展内部或本机collectionViewController类内部调用此函数:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
//return something like the size. I write you an example how to use it.
// You can easily change the value according to your stuff contents height.
return CGSize(width: collectionView.frame.size.width/3, height: 100)
}
答案 1 :(得分:0)
感谢https://stackoverflow.com/a/25896386/7767664和https://stackoverflow.com/a/31279726/7767664
,我解决了我的问题我决定将一个UIView
放在其中的所有UICollecitonViewCell
我将UIView
的行尾,前导,顶部设置为ICollecitonViewCell
,但没有将底部设置为单元格视图(您应该在UIView中使用最新的子视图并连接其底部,而不是与单元格连接查看)
然后我将UIView的引用添加到自定义单元格类中,并将其高度用作单元格的高度:
public class MyCustomItemCell: UICollectionViewCell {
// other child views references ...
@IBOutlet weak var wrapperView: UIView! // view which contains your other views
//forces the system to do one layout pass
var isHeightCalculated: Bool = false
override public func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
//Exhibit A - We need to cache our calculation to prevent a crash.
if !isHeightCalculated {
setNeedsLayout()
layoutIfNeeded()
var newFrame = layoutAttributes.frame
newFrame.size.height = wrapperView.frame.height // use height of our UIView
layoutAttributes.frame = newFrame
isHeightCalculated = true
}
return layoutAttributes
}
}