请允许我用Storyboard来表明我的需求。 如图,在这个tableview里面有两个大的cell,一个是另外tableview,一个是collectionview。而且这两个大的cell的高度不是固定的,当点击加载更多的时候,对应的cell里面的tableview长度会增长,cell也会增长(换言之,在这两个cell里面所有内容都需要被全部展示,而不是滑动)。请问如果是这种需求的话,该如何设计呢?
走同样的路,发现不同的人生
你的情况其实仅仅一个collectionView就可以搞定了,根据数据源分组对应分几个section,展示更多时候,就修改对应section中的数据源,刷UI就好了,你所“必须”要关注的是你的CollectionView的contentSize以及如何Layout,还有优化的话考虑Cache layout类中的attributes.
今天剛剛這麼寫了collectionView嵌套collectionView(被要求的,不是沒事找事),說下思路(TableView嵌套做法類似,XIB/SB與純代碼區別請忽略...)PS: 有寫錯的地方,希望- -CollectionView大神來噴..Orz 1)自訂cell 需要掛collectionView的cell裡面貼如下碼:
//.h @class WBrowserWhisperFlowLayout; static NSString *BrowserWhisperCoverFlowCellIdentifier = @"BrowserWhisperCoverFlowCellIdentifier"; @interface WBrowserWhisperCoverFlowCell : UICollectionViewCell @property (nonatomic, strong) WBrowserWhisperFlowLayout *layout; @property (nonatomic, strong) UICollectionView *collectionView; - (void)setCollectionViewDataSourceDelegate:(id<UICollectionViewDataSource, UICollectionViewDelegate>)dataSourceDelegate; // .m - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { _layout = [[WBrowserWhisperFlowLayout alloc] init]; _layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0); _layout.itemSize = CGSizeMake(CGRectGetWidth(self.frame) - 100, 200); _layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:_layout]; [_collectionView registerClass:[WBrowserWhisperCoverFlowItemCell class] forCellWithReuseIdentifier:BrowserWhisperCoverFlowItemCellIdentifier]; _collectionView.backgroundColor = [UIColor whiteColor]; _collectionView.showsHorizontalScrollIndicator = NO; _collectionView.pagingEnabled = YES; [self.contentView addSubview:_collectionView]; } return self; } - (void)layoutSubviews { [super layoutSubviews]; _collectionView.frame = self.contentView.bounds; } - (void)setCollectionViewDataSourceDelegate:(id<UICollectionViewDataSource, UICollectionViewDelegate>)dataSourceDelegate { _collectionView.dataSource = dataSourceDelegate; _collectionView.delegate = dataSourceDelegate; [_collectionView reloadData]; }
2)記得在cell中的CollectionView是在cell之後初始化的,也就是在初始化這個cell的之後要立即設定這個cell中CollectionView的資料來源跟代理,不然Crash沒商量。
3.1)修改cell中CollectionView的資料來源(若有變化,例如資料主動/被動修改),然後修改該CollectionView屬性(layoutAttribute會被修改)以及重新layout兩個CollectionView。 (tableView則是reloat對應的indexPath)
4)繼續吐槽:CollectionView的精髓在於會不會寫layout。 。 CollectionView讓TableView可以say goodbye了,但要花一定的時間學習否則很難用好,推薦資源:
在 cell 裡再加 UITableView,理論上或許可行(讓外層 cell 作為內層 tableView 的 delegate),但我從來沒見過這樣的寫法,也感覺這樣很不好。原因有2:
對應的cell裡面的tableview長度會增長,cell也會增長(換言之,在這兩個cell裡面所有內容都需要被全部展示,而不是滑動)
但 UITableView 的高度是固定的,裡面是 ScrollView。它天然是適合滾動的,而不是全部顯示。
我覺得這個需求可以考慮能否把這上下兩個大 cell 考慮為兩個 section?上面的大cell 改成第一個section,裡面的cell 裡左邊有圖片、右邊兩個label 的,footer 或最後一個cell 是「加載更多」;下面的大cell 改成第二個section,裡面根據你collectionView 的情況而定。例如本來是一行排5個,可以是每個 cell 裡排5個;也可以是全排在一個 view 裡,把這個 view 添加到唯一的 cell 上或添加到 headerView 上。然後 footer 或最後一個 cell 是加載更多。
請使用這個方法。
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
如果要在uitablewview加一個uitableview的話,可以上網找找有沒有開源的。我記得我是看過的。 如果你在uitableview裡加一個uicollection的話。我提供一個想法。因為之前的專案裡遇到過一個類似的問題。說一下我的思路。
因為uitableview是支援定義cell的,可以在cell裡寫一個collectionview,然後在定義你的collectioncell。絕對是可行的,而且個人感覺代碼量不是很多。載入資料的時候每次都會向cell傳遞數據,然後collectionview就會載入這些資料。 你可以透過程式碼來在cell裡計算高度,這個是可以實現的。
因為電腦不在身邊...就不貼代碼了,如果需要的話可以給我留言我周一貼一段我寫的uitableview+collection搭配的代碼
有人有解決方案嗎?求解決衝突。
解決方案
你的情况其实仅仅一个collectionView就可以搞定了,根据数据源分组对应分几个section,展示更多时候,就修改对应section中的数据源,刷UI就好了,你所“必须”要关注的是你的CollectionView的contentSize以及如何Layout,还有优化的话考虑Cache layout类中的attributes.
巢狀方案
今天剛剛這麼寫了collectionView嵌套collectionView(被要求的,不是沒事找事),說下思路(TableView嵌套做法類似,XIB/SB與純代碼區別請忽略...)
PS: 有寫錯的地方,希望- -CollectionView大神來噴..Orz
1)自訂cell
需要掛collectionView的cell裡面貼如下碼:
2)記得在cell中的CollectionView是在cell之後初始化的,也就是在初始化這個cell的之後要立即設定這個cell中CollectionView的資料來源跟代理,不然Crash沒商量。
3.1)修改cell中CollectionView的資料來源(若有變化,例如資料主動/被動修改),然後修改該CollectionView屬性(layoutAttribute會被修改)以及重新layout兩個CollectionView。 (tableView則是reloat對應的indexPath)
4)繼續吐槽:CollectionView的精髓在於會不會寫layout。 。 CollectionView讓TableView可以say goodbye了,但要花一定的時間學習否則很難用好,推薦資源:
建議不要在 cell 裡套 tableView
在 cell 裡再加 UITableView,理論上或許可行(讓外層 cell 作為內層 tableView 的 delegate),但我從來沒見過這樣的寫法,也感覺這樣很不好。原因有2:
但 UITableView 的高度是固定的,裡面是 ScrollView。它天然是適合滾動的,而不是全部顯示。
可能的代替做法
我覺得這個需求可以考慮能否把這上下兩個大 cell 考慮為兩個 section?上面的大cell 改成第一個section,裡面的cell 裡左邊有圖片、右邊兩個label 的,footer 或最後一個cell 是「加載更多」;下面的大cell 改成第二個section,裡面根據你collectionView 的情況而定。例如本來是一行排5個,可以是每個 cell 裡排5個;也可以是全排在一個 view 裡,把這個 view 添加到唯一的 cell 上或添加到 headerView 上。然後 footer 或最後一個 cell 是加載更多。
請使用這個方法。
如果要在uitablewview加一個uitableview的話,可以上網找找有沒有開源的。我記得我是看過的。
如果你在uitableview裡加一個uicollection的話。我提供一個想法。因為之前的專案裡遇到過一個類似的問題。說一下我的思路。
因為uitableview是支援定義cell的,可以在cell裡寫一個collectionview,然後在定義你的collectioncell。絕對是可行的,而且個人感覺代碼量不是很多。載入資料的時候每次都會向cell傳遞數據,然後collectionview就會載入這些資料。
你可以透過程式碼來在cell裡計算高度,這個是可以實現的。
因為電腦不在身邊...就不貼代碼了,如果需要的話可以給我留言我周一貼一段我寫的uitableview+collection搭配的代碼
有人有解決方案嗎?求解決衝突。