在iOS设备上,UITableView中的节标题有一个很好的行为,当你滚动一个部分时,它们会粘在或“浮动”到屏幕的顶部。我的特定情况下的节标题是从其他XIB文件加载的。
是否可以根据它们当前是否浮动来更改节标题?具体来说,我想添加一个小阴影,只有当它粘在视图的顶部时才显示在标题下面。
谢谢!
答案 0 :(得分:2)
这是我创建的用于更新每个标头是否有阴影的函数。在这种情况下,所有节头都是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++;
}
}
答案 1 :(得分:1)
我还没有测试过,但我没有看到为什么它不可能的原因。
只需确保设置正确bounds
(因为您的影子需要位于视图之上,而不是在视图之上)。
您可以使用以下方法:
scrollView:didScroll:
获取有关滚动事件的通知。[view addSubview:shadowView]
。)CGRectMake(0.f, yourDefaultHeaderHeight, 320.f, yourShadowHeight)
之类的内容应该是frame
的{{1}}。shadowView
的{{1}},以便它可以显示您的bounds
:view
。shadowView
),请删除阴影视图。 CGRectMake(0.f, 0.f - yourShadowHeight, 320.f, yourDefaultHeaderHeight + 2 * yourShadowHeight)
scrollView:didScroll:
headerView
应为bounds
,因为如果仅使用0.f - yourShadowHeight
,则会模糊(我不知道为什么......)。< / p>
答案 2 :(得分:0)
你必须在标题中拥有自己的UIView。那你需要一个参考。然后使用您的UIScrollViewDelegate挂钩scrollViewWillBeginDragging:
。在该函数中,将阴影添加到自定义视图。
挂钩scrollViewDidEndDragging:willDecelerate:
并删除此功能中的阴影。
答案 3 :(得分:0)
@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
}
}