Ios 向下滚动后更改节标题视图

Ios 向下滚动后更改节标题视图,ios,objective-c,cocoa-touch,ios7,Ios,Objective C,Cocoa Touch,Ios7,我想在用户向下滚动时修改节标题视图,类似于音乐应用程序中的内容 (注意视图背景颜色如何更改并获得底部边框) 当视图位于部分顶部或处于滚动位置时,是否有好的跟踪方法 更新: 到目前为止,我唯一的解决方案是保留一个包含所有节头视图的数组,并更改scrollViewDidScroll:delegate方法中第一个可见节的视图(使用tableView.indexPathsForVisibleRows数组获取第一个可见节索引) 如果有人能想出一个更简单的方法,那就太好了 可能存在一个更简单的解决方案,但

我想在用户向下滚动时修改节标题视图,类似于音乐应用程序中的内容 (注意视图背景颜色如何更改并获得底部边框)

当视图位于部分顶部或处于滚动位置时,是否有好的跟踪方法

更新:

到目前为止,我唯一的解决方案是保留一个包含所有节头视图的数组,并更改scrollViewDidScroll:delegate方法中第一个可见节的视图(使用tableView.indexPathsForVisibleRows数组获取第一个可见节索引)


如果有人能想出一个更简单的方法,那就太好了

可能存在一个更简单的解决方案,但这将是实现您想要的一种方法:

  • 删除tableHeader,并将其作为单独的子视图添加到viewController视图中(注意:不要使用uitableviewController,因为该viewController将tableview作为其视图,而您不希望这样做)

  • 向下移动tableView,使其正好位于以前的tableheader视图下

  • 计算并设置tableView(它是一个UIScrollView)的contentOffset,这样单元格就不会跳转到新位置

此外,您还可以尝试返回一个sectionHeaderView(它与tableView一起向下滚动,而不是向上滚动,例如,请参见您的联系人列表中的工作原理)。将该视图作为单元格或节标题进行处理。

您可以在scrollViewDidScroll方法中修改节标题视图的颜色(以及任何您想要的颜色)。此示例在用户向下滚动时使浮动标题视图的颜色变暗,并将该颜色的白色值保持在0.9和0.6之间。如果向下滚动超过5点,它还会在标题视图中取消隐藏底部边框线

RDHeaderView的.m文件:

- (id)init{
    self = [super init];
    if (self) {
        UIView *line = [[UIView alloc] init];
        [line setTranslatesAutoresizingMaskIntoConstraints:NO];
        line.backgroundColor = [UIColor darkGrayColor];
        [self addSubview:line];
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[line]|" options:0 metrics:nil views:@{@"line":line}]];
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[line]|" options:0 metrics:nil views:@{@"line":line}]];
        [line addConstraint:[NSLayoutConstraint constraintWithItem:line attribute:NSLayoutAttributeHeight relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:1]];
        self.bottomLine = line;
        self.bottomLine.hidden = YES;
    }
    return self;
}
“表视图”控制器中的相关方法:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    RDHeaderView *header = [[RDHeaderView alloc] init];
    header.contentView.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1];
    return header;
}


-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSInteger topSection = [[self.tableView indexPathsForVisibleRows].firstObject section];
    NSInteger sectionYOffset = [self.tableView rectForHeaderInSection:topSection].origin.y;
    RDHeaderView *pinnedHeader = (RDHeaderView *)[self.tableView headerViewForSection:topSection];
    pinnedHeader.bottomLine.hidden = ((scrollView.contentOffset.y - sectionYOffset) > 5)? NO: YES;
    CGFloat colorOffset = fmaxf(0.6, 0.9 - (scrollView.contentOffset.y - sectionYOffset)/1000.0);
    if (colorOffset > 0.9) colorOffset = 0.9;
    pinnedHeader.contentView.backgroundColor = [UIColor colorWithWhite:colorOffset alpha:1];
}


-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 80;
}

很抱歉,这将更改所有节标题视图,您知道,我在表视图中有多个节。想到了一个类似的解决方案,其中我跟踪所有截面位置,并使用滚动视图代理方法相应地更改视图。我正在寻找一个动态的解决方案(如果有的话)@EdLess,我已经改变了我的答案,以显示我是如何在多个部分完成它的。