UITableView 部分标题在“浮动”时可以更改吗?

Posted

技术标签:

【中文标题】UITableView 部分标题在“浮动”时可以更改吗?【英文标题】:Can UITableView Section Headers be Changed when They are 'Floating'? 【发布时间】:2011-07-28 15:11:13 【问题描述】:

ios 设备上,UITableView 中的部分标题有一个很好的行为,当您滚动浏览一个部分时,它们会粘在屏幕顶部或“浮动”到屏幕顶部。在我的特殊情况下,节标题是从其他 XIB 文件加载的。

是否可以根据当前是否浮动来更改节标题?具体来说,我想添加一个小阴影,仅当它粘在视图顶部时才会出现在标题下方。

谢谢!

【问题讨论】:

【参考方案1】:

这是我创建的用于更新每个标题是否有阴影的函数。在这种情况下,所有节标题都是 UIView 子类ListHeader。它们由viewForHeaderInSection 函数保留和返回。

- (void) updateHeaderShadows 
    int i=0;
    int sectionHeight = 0;
    int totalHeight = 0;
    UIView * sectionHeader;
    while (i<[self numberOfSectionsInTableView:self.tableView]) 
        sectionHeight = [self.tableView rectForSection:i].size.height;
        sectionHeader = [self tableView:self.tableView viewForHeaderInSection:i];
        if ([sectionHeader respondsToSelector:@selector(shadow)]) 
             if (sectionHeader.frame.origin.y == totalHeight || sectionHeader.frame.origin.y == totalHeight + sectionHeight - sectionHeader.frame.size.height) 
                 [((ListHeader *) sectionHeader).shadow setHidden:YES];
              else 
                 [((ListHeader *) sectionHeader).shadow setHidden:NO];
             
        
        totalHeight += sectionHeight;
        i++;
    

【讨论】:

【参考方案2】:

我尚未对其进行测试,但我看不出有任何理由说明它不可能。 只要确保你设置了正确的bounds(因为你的阴影需要在你的视野之上,而不是在它之上)。

您可以使用以下方法:

    使用scrollView:didScroll: 获取有关滚动事件的通知。 在此方法中,检查是否需要将阴影视图添加到(浮动)标题视图中。 如果有,请添加。 (只是[view addSubview:shadowView]。)像CGRectMake(0.f, yourDefaultHeaderHeight, 320.f, yourShadowHeight) 这样的东西应该是shadowViewframe。 现在,更新viewbounds,这样它就可以显示您的shadowViewCGRectMake(0.f, 0.f - yourShadowHeight, 320.f, yourDefaultHeaderHeight + 2 * yourShadowHeight)。 当您发现标题不再浮动时(使用scrollView:didScroll:),请移除阴影视图。

你的headerViews bounds 应该是0.f - yourShadowHeight,因为如果你只使用0.f,它会模糊(我不知道为什么......)。

【讨论】:

谢谢蒂姆。你能在第2步扩展一点吗?您如何确定任何给定的标题视图是否浮动? BOOL isFloating = (headerView.frame.origin.y + scrollView.contentOffset.y == 0); =)! (我不确定contentOffset.y 是正数还是负数,所以如果不起作用,请将+ 替换为- :)! 由于某种原因,当标题浮动时,标题原点和内容偏移量并没有完全对齐,并且添加一点摆动空间会使阴影闪烁进出。 感谢您为我指明正确的方向!我有类似的工作。有空我会在下面贴出来。【参考方案3】:

您必须在标题中拥有自己的 UIView。那么你需要一个参考。然后用你的 UIScrollViewDelegate 连接到scrollViewWillBeginDragging:。在该函数中,将阴影添加到自定义视图。

挂钩scrollViewDidEndDragging:willDecelerate: 并移除此函数中的阴影。

【讨论】:

【参考方案4】:

@Anthony Mattox 对 Swift 的回答

protocol SectionHeaderWithShadowProtocol where Self: UIView 
    var shadow: Bool  get set 


class SectionHeaderView: UITableViewHeaderFooterView, SectionHeaderWithShadowProtocol 
    @IBOutlet weak var shadowView: UIView!
    var shadow: Bool = false 
        didSet 
            shadowView.isHidden = shadow
        
    



func scrollViewDidScroll(_ scrollView: UIScrollView) 
    updateHeaderShadows()


func updateHeaderShadows() 
    var i = 0
    var sectionHeight: CGFloat = 0
    var totalHeight: CGFloat = 0
    while i < numberOfSections() 
        sectionHeight = tableView.rect(forSection: i).size.height
        if let sectionHeader = tableView.headerView(forSection: i) as? SectionHeaderWithShadowProtocol 
            if sectionHeader.frame.origin.y == totalHeight || sectionHeader.frame.origin.y == totalHeight + sectionHeight - sectionHeader.frame.size.height 
                sectionHeader.shadow = false
             else 
                sectionHeader.shadow = true
            
        
        totalHeight += sectionHeight
        i += 1
    

【讨论】:

以上是关于UITableView 部分标题在“浮动”时可以更改吗?的主要内容,如果未能解决你的问题,请参考以下文章

浮动uiview子视图在滚动时消失

如何在 UITableView 上浮动所有部分标题视图(或保持所有可见)?

使用情节提要在 UItableview 上浮动按钮

UItableView只有一个部分粘

tvOS 9.1 UITableView 标题视图不浮动

是否可以使用 UITableViewStylePlain 禁用 UITableView 中的浮动标题?