IOS中UITableView中的展开/折叠部分

IOS中UITableView中的展开/折叠部分有人能告诉我表演的方法吗?UITableView可扩展/可折叠动画sectionsUITableView如下所示?

Cats萌萌
浏览 1376回答 3
3回答

繁花不似锦

您必须创建自己的自定义标题行,并将其作为每个节的第一行。子类UITableView否则,已经存在的标题将带来痛苦。根据他们现在的工作方式,我不确定你能轻易地从他们那里得到行动。您可以设置一个单元格,使其看起来像一个标头,并设置tableView:didSelectRowAtIndexPath若要手动展开或折叠它所在的部分,请执行以下操作。我会存储一组布尔值,对应于每个节的“支出”值。那你就可以tableView:didSelectRowAtIndexPath在每个自定义标题行上,切换此值,然后重新加载该特定部分。- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {     if (indexPath.row == 0) {         ///it's the first row of any section so it would be your custom section header         ///put in your code to toggle your boolean value here         mybooleans[indexPath.section] = !mybooleans[indexPath.section];         ///reload this section         [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade];     }}然后设置numberOfRowsInSection检查mybooleans值,如果该节未展开,则返回1;如果展开,则返回1+部分中的项目数。- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {     if (mybooleans[section]) {         ///we want the number of people plus the header cell         return [self numberOfPeopleInGroup:section] + 1;     } else {         ///we just want the header cell         return 1;     }}此外,您还需要更新cellForRowAtIndexPath若要返回任何节中第一行的自定义标题单元格,请执行以下操作。

一只斗牛犬

我得到了一个很好的解决方案,灵感来自苹果的表视图动画和手势..我从苹果的样本中删除了不必要的部分,并将其翻译成了“快速”。我知道答案很长,但是所有的代码都是必需的。幸运的是,您只需复制&超过大部分代码,只需在步骤1和步骤3上做一些修改。1.创造SectionHeaderView.swift和SectionHeaderView.xibimport&nbsp;UIKitprotocol&nbsp;SectionHeaderViewDelegate&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;sectionHeaderView(sectionHeaderView:&nbsp;SectionHeaderView,&nbsp;sectionOpened:&nbsp;Int) &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;sectionHeaderView(sectionHeaderView:&nbsp;SectionHeaderView,&nbsp;sectionClosed:&nbsp;Int)}class&nbsp;SectionHeaderView:&nbsp;UITableViewHeaderFooterView&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;section:&nbsp;Int? &nbsp;&nbsp;&nbsp;&nbsp;@IBOutlet&nbsp;weak&nbsp;var&nbsp;titleLabel:&nbsp;UILabel! &nbsp;&nbsp;&nbsp;&nbsp;@IBOutlet&nbsp;weak&nbsp;var&nbsp;disclosureButton:&nbsp;UIButton! &nbsp;&nbsp;&nbsp;&nbsp;@IBAction&nbsp;func&nbsp;toggleOpen()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.toggleOpenWithUserAction(true) &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;delegate:&nbsp;SectionHeaderViewDelegate? &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;toggleOpenWithUserAction(userAction:&nbsp;Bool)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.disclosureButton.selected&nbsp;=&nbsp;!self.disclosureButton.selected&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;userAction&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;self.disclosureButton.selected&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.delegate?.sectionHeaderView(self,&nbsp;sectionClosed:&nbsp;self.section!) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.delegate?.sectionHeaderView(self,&nbsp;sectionOpened:&nbsp;self.section!) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;override&nbsp;func&nbsp;awakeFromNib()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tapGesture:&nbsp;UITapGestureRecognizer&nbsp;=&nbsp;UITapGestureRecognizer(target:&nbsp;self,&nbsp;action:&nbsp;"toggleOpen") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.addGestureRecognizer(tapGesture) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;change&nbsp;the&nbsp;button&nbsp;image&nbsp;here,&nbsp;you&nbsp;can&nbsp;also&nbsp;set&nbsp;image&nbsp;via&nbsp;IB. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.disclosureButton.setImage(UIImage(named:&nbsp;"arrow_up"),&nbsp;forState:&nbsp;UIControlState.Selected) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.disclosureButton.setImage(UIImage(named:&nbsp;"arrow_down"),&nbsp;forState:&nbsp;UIControlState.Normal) &nbsp;&nbsp;&nbsp;&nbsp;}}这个SectionHeaderView.xib(带有灰色背景的视图)在表视图中应该是这样的(当然,您可以根据需要定制它):注:(A)toggleOpen应将行动与disclosureButton(B)disclosureButton和toggleOpen没有必要采取行动。如果你不需要按钮,你可以删除这两件事。2.创造SectionInfo.swiftimport&nbsp;UIKitclass&nbsp;SectionInfo:&nbsp;NSObject&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;open:&nbsp;Bool&nbsp;=&nbsp;true &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;itemsInSection:&nbsp;NSMutableArray&nbsp;=&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sectionTitle:&nbsp;String? &nbsp;&nbsp;&nbsp;&nbsp;init(itemsInSection:&nbsp;NSMutableArray,&nbsp;sectionTitle:&nbsp;String)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.itemsInSection&nbsp;=&nbsp;itemsInSection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sectionTitle&nbsp;=&nbsp;sectionTitle&nbsp;&nbsp;&nbsp;&nbsp;}}3.在您的桌面视图中import&nbsp;UIKitclass&nbsp;TableViewController:&nbsp;UITableViewController,&nbsp;SectionHeaderViewDelegate&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;SectionHeaderViewIdentifier&nbsp;=&nbsp;"SectionHeaderViewIdentifier" &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sectionInfoArray:&nbsp;NSMutableArray&nbsp;=&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;override&nbsp;func&nbsp;viewDidLoad()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.viewDidLoad() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;sectionHeaderNib:&nbsp;UINib&nbsp;=&nbsp;UINib(nibName:&nbsp;"SectionHeaderView",&nbsp;bundle:&nbsp;nil) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tableView.registerNib(sectionHeaderNib,&nbsp;forHeaderFooterViewReuseIdentifier:&nbsp;SectionHeaderViewIdentifier) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;you&nbsp;can&nbsp;change&nbsp;section&nbsp;height&nbsp;based&nbsp;on&nbsp;your&nbsp;needs &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tableView.sectionHeaderHeight&nbsp;=&nbsp;30 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;You&nbsp;should&nbsp;set&nbsp;up&nbsp;your&nbsp;SectionInfo&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;firstSection:&nbsp;SectionInfo&nbsp;=&nbsp;SectionInfo(itemsInSection:&nbsp;["1"],&nbsp;sectionTitle:&nbsp;"firstSection") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;secondSection:&nbsp;SectionInfo&nbsp;=&nbsp;SectionInfo(itemsInSection:&nbsp;["2"],&nbsp;sectionTitle:&nbsp;"secondSection")) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectionInfoArray.addObjectsFromArray([firstSection,&nbsp;secondSection]) &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;MARK:&nbsp;-&nbsp;Table&nbsp;view&nbsp;data&nbsp;source &nbsp;&nbsp;&nbsp;&nbsp;override&nbsp;func&nbsp;numberOfSectionsInTableView(tableView:&nbsp;UITableView)&nbsp;->&nbsp;Int&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sectionInfoArray.count&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;override&nbsp;func&nbsp;tableView(tableView:&nbsp;UITableView,&nbsp;numberOfRowsInSection&nbsp;section:&nbsp;Int)&nbsp;->&nbsp;Int&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;self.sectionInfoArray.count&nbsp;>&nbsp;0&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sectionInfo:&nbsp;SectionInfo&nbsp;=&nbsp;sectionInfoArray[section]&nbsp;as!&nbsp;SectionInfo &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;sectionInfo.open&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sectionInfo.open&nbsp;?&nbsp;sectionInfo.itemsInSection.count&nbsp;:&nbsp;0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0 &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;override&nbsp;func&nbsp;tableView(tableView:&nbsp;UITableView,&nbsp;viewForHeaderInSection&nbsp;section:&nbsp;Int)&nbsp;->&nbsp;UIView?&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;sectionHeaderView:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SectionHeaderView!&nbsp;=&nbsp;self.tableView.dequeueReusableHeaderFooterViewWithIdentifier(SectionHeaderViewIdentifier &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;as!&nbsp;SectionHeaderView &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sectionInfo:&nbsp;SectionInfo&nbsp;=&nbsp;sectionInfoArray[section]&nbsp;as!&nbsp;SectionInfo &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectionHeaderView.titleLabel.text&nbsp;=&nbsp;sectionInfo.sectionTitle &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectionHeaderView.section&nbsp;=&nbsp;section &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectionHeaderView.delegate&nbsp;=&nbsp;self &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;backGroundView&nbsp;=&nbsp;UIView() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;you&nbsp;can&nbsp;customize&nbsp;the&nbsp;background&nbsp;color&nbsp;of&nbsp;the&nbsp;header&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backGroundView.backgroundColor&nbsp;=&nbsp;UIColor(red:0.89,&nbsp;green:0.89,&nbsp;blue:0.89,&nbsp;alpha:1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectionHeaderView.backgroundView&nbsp;=&nbsp;backGroundView&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sectionHeaderView&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;sectionHeaderView(sectionHeaderView:&nbsp;SectionHeaderView,&nbsp;sectionOpened:&nbsp;Int)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sectionInfo:&nbsp;SectionInfo&nbsp;=&nbsp;sectionInfoArray[sectionOpened]&nbsp;as!&nbsp;SectionInfo &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;countOfRowsToInsert&nbsp;=&nbsp;sectionInfo.itemsInSection.count &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectionInfo.open&nbsp;=&nbsp;true &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;indexPathToInsert:&nbsp;NSMutableArray&nbsp;=&nbsp;NSMutableArray() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;0..<countOfRowsToInsert&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexPathToInsert.addObject(NSIndexPath(forRow:&nbsp;i,&nbsp;inSection:&nbsp;sectionOpened)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tableView.insertRowsAtIndexPaths(indexPathToInsert&nbsp;as&nbsp;[AnyObject],&nbsp;withRowAnimation:&nbsp;.Top) &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;sectionHeaderView(sectionHeaderView:&nbsp;SectionHeaderView,&nbsp;sectionClosed:&nbsp;Int)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sectionInfo:&nbsp;SectionInfo&nbsp;=&nbsp;sectionInfoArray[sectionClosed]&nbsp;as!&nbsp;SectionInfo &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;countOfRowsToDelete&nbsp;=&nbsp;sectionInfo.itemsInSection.count &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectionInfo.open&nbsp;=&nbsp;false &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;countOfRowsToDelete&nbsp;>&nbsp;0&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;indexPathToDelete:&nbsp;NSMutableArray&nbsp;=&nbsp;NSMutableArray() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;0..<countOfRowsToDelete&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexPathToDelete.addObject(NSIndexPath(forRow:&nbsp;i,&nbsp;inSection:&nbsp;sectionClosed)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tableView.deleteRowsAtIndexPaths(indexPathToDelete&nbsp;as&nbsp;[AnyObject],&nbsp;withRowAnimation:&nbsp;.Top) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP