【问题标题】:UItableView with only one section stickyUItableView 只有一个部分的粘性
【发布时间】:2018-09-29 02:57:07
【问题描述】:

我有一个 UITableView,其中有很多部分。如果我将 UITableView 类型设为普通类型,则所有部分在滚动时都粘在顶部。

我的要求是只粘贴第零节的标题,其他标题应该浮动(比如当你将样式设置为组时)。

另请注意,我的 TableView 具有折叠和展开功能,我使用这些部分所做的。

我的 UItableView 样式设置为plain

public enum UITableViewStyle : Int {
    case plain // regular table view
}

我已经使用

实现了自定义部分标题
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat

高度赞赏任何正确方向的提示

【问题讨论】:

  • 你不能让一些部分有粘性和一些浮动。相反,我建议使用不同的单元格作为第零节以外的节的标题。
  • 抱歉.. 我已经编辑了我的答案。有一种方法是测试方法,在写下面的答案时忘记删除。
  • 如果您想通过应用商店发布您的项目,请不要使用私有 api。即使您通过了一次审核,您的应用也可以随时下架。我推荐@hardikparmar 的解决方案。
  • 查看我的答案@Ekra
  • @Ekra 你是在不使用私有 API 的情况下做到的吗?

标签: ios swift uitableview


【解决方案1】:

正如我所说,你不能有一些部分是粘性的,一些是浮动的。相反,我建议使用不同的单元格作为除第零节以外的每个节的标题。仅对于第零节,您应该使用节标题视图。将 tableview 样式设置为 Plain only。

【讨论】:

    【解决方案2】:

    对于这种情况有一个棘手的解决方案。我曾尝试在 Swift 中编写解决方案,但目前我无法找到解决方案,但我已经在 Objective-C 中实现了上述解决方案。

    您需要继承 UITableView 并公开私有 api 并覆盖它们,这样您就可以实现您想要的。

    下面是一个 TableView 示例。

    MYTableView.h

    @interface MYTableView : UITableView
    @property (assign,nonatomic)BOOL shouldFloatHeader;
    @property (assign,nonatomic)BOOL shouldFloatFooter;
    - (BOOL)allowsHeaderViewsToFloat;
    - (BOOL)allowsFooterViewsToFloat;
    @end
    

    MYTableView.m

    @implementation MYTableView
    - (BOOL)allowsHeaderViewsToFloat{
        return _ shouldFloatHeader;
    }
    - (BOOL)allowsFooterViewsToFloat{
        return shouldFloatFooter;
    }
    @end
    

    现在你也可以在 swift 中使用上面的TableView。我已经运行并测试了它。

    现在要使第一部分具有粘性而所有其他部分不具有粘性,我们需要在这里使用一些技巧。下面是一个插图。 有UITableViewDelegate 方法didEndDisplayingHeader 只需实现此方法并像这样切换shouldFloatHeader..

    目标-C

    -(void)tableView:(MYTableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section {
        if (section >= 1) {
            tableView.shouldFloatHeader = YES;
        }else {
            tableView.shouldFloatHeader = NO;
        }
    }
    

    斯威夫特

    func tableView(_ tableView: MYTableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
            if section >= 1 {
                tableView.shouldFloatHeader = true
            }else {
                tableView.shouldFloatHeader = false
            }
        }
    

    在某些情况下,使用私有 API 可能会导致您的应用程序被拒绝。

    【讨论】:

      猜你喜欢
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 2020-06-11
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多