我知道这个问题已经问了很多次,但解决方案没有问题。
我在uitableview单元格中有集合视图,我在故事板中准备了一个表视图和集合视图的单元格,我的问题是假设我滚动单元格1集合视图,然后单元格4集合也自动滚动到该位置。我怎么能处理这种情况..
请注意我现在制作一个静态的屏幕设计
我的代码
// MARK:
// MARK: table view delegate method
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if Appconstant.isIpad()
{
return 215.0
}
return 185.0
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 6
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let strCell = "WorkoutCell" //+ "\(indexPath.row)"
let cell = tableView.dequeueReusableCellWithIdentifier(strCell) as? WorkoutCell
// if cell == nil
// {
// cell = work
// }
return cell!
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
let cell2 = cell as! WorkoutCell
cell2.collecionWorkout.reloadData()
}
// MARK:
// MARK: collectionview delegate and data source
//1
func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
return true
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
//2
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsetsMake(0.0, 10.0, 0.0, 10.0)
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: NSIndexPath) -> CGSize {
// Adjust cell size for orientation
if Appconstant.isIpad() {
return CGSize(width: 160, height: 150)
}
return CGSize(width: 140.0, height: 130.0)
}
//3
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("WorkoutCollectionCell", forIndexPath: indexPath)
// Configure the cell
return cell
}
uitableview单元格代码
class WorkoutCell: UITableViewCell {
@IBOutlet weak var collecionWorkout: UICollectionView!
var flowLayout : UICollectionViewFlowLayout!
override func awakeFromNib() {
super.awakeFromNib()
self.flowLayout = UICollectionViewFlowLayout()
if Appconstant.isIpad()
{
self.flowLayout.itemSize = CGSize(width: 160, height: 150)
}
else
{
self.flowLayout.itemSize = CGSize(width: 140, height: 130)
}
self.flowLayout.scrollDirection = .Horizontal
self.flowLayout.minimumInteritemSpacing = 10.0
flowLayout.sectionInset = UIEdgeInsetsMake(0.0, 10.0, 0.0, 10.0);
collecionWorkout.collectionViewLayout = flowLayout
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
我滚动的第一小区
单元格4自动滚动
答案 0 :(得分:4)
有两种情况。
1-重置UICollectionView偏移位置:
要重置集合视图位置,只需在cellForRowAtIndexPath中调用cell.collectionView.contentOffset = .zero
2-保持上一个滚动位置:
要保持先前的滚动位置,您需要为每个单元格的偏移量列表与数据模型一起存储在包含的视图控制器中。然后,您可以将给定单元格的偏移量保存在didEndDisplayingCell
中,并在cellForRowAtIndexPath
中而不是.zero
中进行设置。
答案 1 :(得分:2)
UITableView
适用于reusability
的概念。每当滚动tableView
时,cells
中的tableView
肯定会被重用。
现在出现两种情况,
获取新单元格-重新使用tableViewCell
时,其内部的collectionView
也将被重新使用,因此这就是{{1 }}保留前一个单元格。
contentOffset
-如果我们已手动滚动到Scroll to previous cell
中的某个特定cell
,则在滚动回该位置时可能希望保留其位置。
要在collectionView
中获得这种功能,我们需要-为tableView
手动重置contentOffset
,并且需要将1st case
保留在第二个中。
您可以遵循的另一种方法是使用 contentOffset
。
这是怎么回事。
在combination of UIScrollview and UIStackView
中,创建一个UIScrollView。向其中添加垂直的UIStackView。
在storyboard
中添加4 UICollectionViews
。该号码可以根据您的要求进行配置。
将您的stackView
添加为所有controller
的{{1}}和dataSource
。
即
delegate
现在,由于我们使用的是collectionViews
,因此class ViewController: UIViewController, UICollectionViewDataSource {
override func viewDidLoad() {
super.viewDidLoad()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCell
cell.label.text = "\(indexPath.row)"
return cell
}
}
class CustomCell: UICollectionViewCell {
@IBOutlet weak var label: UILabel!
}
都不会被重用。因此,所有stackView
中的collectionViews
将保持不变。