【发布时间】:2021-01-05 22:50:15
【问题描述】:
在我的DetailViewController 中,我有两个collectionViews,我正在尝试动态更改它们的高度。我可以通过使用DetailViewController 中的观察者更改两个高度约束IBOutlets 来成功实现这一点。但是,如果我从 DetailViewController 推送另一个 ViewController 然后返回,则它不起作用。
这是“DetailViewController”中的代码
@IBOutlet weak var deadlineCollectionViewHeight: NSLayoutConstraint!
@IBOutlet weak var tasksCollectionViewHeight: NSLayoutConstraint!
private var CVcontentSizeObservation: [NSKeyValueObservation]?
private var initialCollectionViewsHeight: InitialCollectionViewsHeight?
override func viewDidLoad() {
super.viewDidLoad()
initialCollectionViewsHeight = InitialCollectionViewsHeight(deadlines:
deadlineCollectionViewHeight.constant, tasks: tasksCollectionViewHeight.constant)
observeCollectionView()
}
private func observeCollectionView(){
CVcontentSizeObservation = [
deadlinesCollectionView.observe(\.contentSize, options: .new, changeHandler: {[weak self] (cv, _) in
guard let self = self else { return }
if cv.collectionViewLayout.collectionViewContentSize.height < self.initialCollectionViewsHeight!.deadlines{
self.deadlineCollectionViewHeight.constant = cv.collectionViewLayout.collectionViewContentSize.height
}
}),
tasksCollectionView.observe(\.contentSize, options: .new, changeHandler: {[weak self] (cv, _) in
guard let self = self else { return }
if cv.collectionViewLayout.collectionViewContentSize.height < self.initialCollectionViewsHeight!.tasks{
self.tasksCollectionViewHeight.constant = cv.collectionViewLayout.collectionViewContentSize.height
}
})
]
}
private struct InitialCollectionViewsHeight{
var deadlines: CGFloat
var tasks: CGFloat
}
问题
如果我从家庭 VC 推送 DetailViewController,这会正常工作,但如果我从那里推送另一个 VC 然后返回,我会得到错误的结果。
第一张图片显示了DetailViewController 最初被推送后的正确行为。但是,如果我按下“编辑按钮”按钮并按下一个新的 VC,则在我将其关闭并从堆栈中弹出 VC 后会得到错误的结果(即:我返回到DetailViewController),如中所示第二张图片
【问题讨论】:
-
尽管我不确定您为什么会遇到这种行为,但我可能会采用不同的方法:UICollectionView 的想法本身就是动态的。您不需要根据集合视图的内容大小手动更改约束。相反,您应该使用约束来指定您的内容视图可以“存在”的合法区域,然后它应该自行决定如何调整自己的大小。
-
@Petar 问题是,一旦我设置了collectionview 高度约束,框架就会固定并且高度不会改变。我错了吗?
-
是的,忽略我的悲伤——你不能用滚动视图来做到这一点,因为它们没有内在的内容大小。由于您要添加 2 个滚动视图,您应该指定至少其中一个的高度。你写的东西是有道理的,我认为问题出在其他地方 - 看起来整个视图都被打破了:注意信息标签也不在原来的位置。愿意分享您的代码吗?
标签: ios swift uicollectionview