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)
这样的东西应该是shadowView
的frame
。
现在,更新view
的bounds
,这样它就可以显示您的shadowView
:CGRectMake(0.f, 0.f - yourShadowHeight, 320.f, yourDefaultHeaderHeight + 2 * yourShadowHeight)
。
当您发现标题不再浮动时(使用scrollView:didScroll:
),请移除阴影视图。
你的headerView
s 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 部分标题在“浮动”时可以更改吗?的主要内容,如果未能解决你的问题,请参考以下文章