UItableView只有一个部分粘

时间:2018-04-18 18:47:58

标签: ios swift uitableview

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

我的要求是只保留第0节的标题,其他标题应该浮动(就像你将样式设置为组一样)。

另请注意,我的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

非常感谢任何正确方向的暗示

2 个答案:

答案 0 :(得分:0)

这种情况有一个棘手的解决方案。我试图在 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 ..

的Objective-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会导致您的应用程序在某些情况下拒绝。

答案 1 :(得分:-1)

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