顶部有 UICollectionView ,底部有 UITableView 。 CollectionView具有1:3的屏幕,TableView具有2:3的屏幕(使用equalHeight约束设置)。
当滚动 tableView 时,我想更改 UICollectionView 的高度。
当 tableView 向上滚动时,我想将equalHeights约束的乘数分别改为collectionView和tableView的1:5和4:5。这样会确保 tableView的高度增加和 collectionView减少
当 tableView 向下滚动时,equalHeights约束的乘数应重置为默认值。
我尝试向tableView添加滑动和平移手势,但它们无法识别。
如何实现此功能?
P.S:希望通过使用平移手势来实现此功能,以便上下拖动逐步改变高度。
修改/更新
这是我正在使用的代码。
class MyConstant {
var height:CGFloat = 10
}
let myConstant = MyConstant()
MainScreenVC
override func viewWillAppear(_ animated: Bool) {
myConstant.height = self.view.frame.size.height
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if (self.lastContentOffset < scrollView.contentOffset.y) {
NotificationCenter.default.post(name: Notifications.decreaseHeightNotification.name, object: nil)
self.topViewConstraint.constant = -self.view.frame.height / 6
UIView.animate(withDuration: 0.3, animations: {
self.view.layoutIfNeeded()
})
} else if (self.lastContentOffset > scrollView.contentOffset.y) {
NotificationCenter.default.post(name: Notifications.increaseHeightNotification.name, object: nil)
self.topViewConstraint.constant = 0
UIView.animate(withDuration: 0.3, animations: {
self.view.layoutIfNeeded()
})
}
self.lastContentOffset = scrollView.contentOffset.y
}
Cell.Swift
override func awakeFromNib() {
super.awakeFromNib()
NotificationCenter.default.addObserver(self, selector: #selector(decreaseHeight), name: Notification.Name("decreaseHeightNotification"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(increaseHeight), name: Notification.Name("increaseHeightNotification"), object: nil)
self.contentView.translatesAutoresizingMaskIntoConstraints = false
heightConstraint.constant = (myConstant.height / 3) - 10
widthConstraint.constant = heightConstraint.constant * 1.5
}
@objc func decreaseHeight() {
heightConstraint.constant = (myConstant.height / 6) - 10
widthConstraint.constant = (heightConstraint.constant * 1.5)
self.layoutIfNeeded()
}
@objc func increaseHeight() {
heightConstraint.constant = (myConstant.height / 3) - 10
widthConstraint.constant = (heightConstraint.constant * 1.5)
self.layoutIfNeeded()
}
现在当我同时滚动时,屏幕会冻结。还有一种更好的方法来调整collectionViewCell的大小吗?
答案 0 :(得分:3)
我没有测试过,但你可以这样做。在此视图中使用Autolayout。它会更好地工作。
将tableview约束设置为Top,Left,Bottom,Right =&gt;主视图为0,0,0,0,并将tableView放在tableview下,约束为Top,Left,Right,height =&gt;主视图为0,0,0,x。
注意:Tableview位于collectionView。
之上
连接CollectionView的高度约束出口,并定义defaultOffset变量
@IBOutlet weak var defaultHeightConstraint: NSLayoutConstraint
var defaultOffSet: CGPoint?
在viewDidLoad中,
override func viewDidLoad() {
super.viewDidLoad()
tableView.contentInset = UIEdgeInsetsMake(collectionView.size.height, 0, 0, 0)
}
在viewDidAppear中,写下
override func viewDidAppear(_ animated: Bool) {
defaultOffSet = tableView.contentOffset
}
在ViewDidScroll中
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offset = tableView.contentOffset
if let startOffset = self.defaultOffSet {
if offset.y < startOffset.y {
// Scrolling down
// check if your collection view height is less than normal height, do your logic.
let deltaY = fabs((startOffset.y - offset.y))
defaultHeightConstraint.constant = defaultHeightConstraint.constant - deltaY
} else {
// Scrolling up
let deltaY = fabs((startOffset.y - offset.y))
defaultHeightConstraint.constant = defaultHeightConstraint.constant + deltaY
}
self.view.layoutIfNeeded()
}
}
希望它有所帮助。
答案 1 :(得分:0)
由于UITableView
是UIScrollView
的子类,因此您的表格视图delegate
可以接收UIScrollViewDelegate
种方法。
您不需要使用PanGesture
首先实现UITableviewDelegate
并在其中
var oldContentOffset = CGPoint.zero
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let contentOffset = scrollView.contentOffset.y - oldContentOffset.y
if (self.oldContentOffset < scrollView.contentOffset.y) {
// moved to top
} else if (self.oldContentOffset > scrollView.contentOffset.y) {
// moved to bottom
} else {
// didn't move
}
oldContentOffset = scrollView.contentOffset
}
在这里,您可以编写逻辑来更改约束的常量值
<强> UPDATE /修改
另一件事是不要使用乘数作为tabelview height.with集合视图你可以用self.view以1/3的比例给出高度约束。对于tableview,只需给出前导,尾随顶部(UICollectionView)和底部。 因此,当您更改UICollectionView的高度常量时,Tableview高度会自动降低,反之亦然。
您无法从插座更改乘数,因为它是只读的。所以你必须保持self.view.frame.height / 3
的恒定值对你有用
希望它对你有所帮助
答案 2 :(得分:0)
为了更清晰的方法,为什么不使用UIScrollView
作为容器视图,并在其中添加UICollectionView
和UITableView
并给出collectionView
个禁用tableView
滚动时的高度限制,直到collectionView
的高度限制变为0。
以下是片段:
使用UIScrollViewDelegate
扩展您的VC并使用:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.y >= 0 && scrollView.contentOffset.y <= yourLimit {
heightConstraint.constant = collectionViewHeight - scrollView.contentOffset.y
tableView.isScrollEnabled = false
} else if scrollView.contentOffset.y > yourLimit {
heightConstraint.constant = collectionViewHeight
tableView.isScrollEnabled = true
}
}
在自定义小内容后尝试此代码段。它应该主要起作用,如果它不存在,那么一旦这不起作用,我会分享另一种方法。
答案 3 :(得分:0)
为什么不直接在集合视图中添加自定义表格单元格,当 indexPath.row == 0 时,返回自定义表格单元格。