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

时间:2011-07-28 15:11:13

标签: iphone objective-c ios uitableview

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

是否可以根据它们当前是否浮动来更改节标题?具体来说,我想添加一个小阴影,只有当它粘在视图的顶部时才显示在标题下面。

谢谢!

4 个答案:

答案 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(因为您的影子需要位于视图之上,而不是在视图之上)。

您可以使用以下方法:

  1. 使用scrollView:didScroll:获取有关滚动事件的通知。
  2. 在此方法中,检查是否需要将阴影视图添加到(浮动)标题视图中。
  3. 如果是,请添加。 (仅[view addSubview:shadowView]。)CGRectMake(0.f, yourDefaultHeaderHeight, 320.f, yourShadowHeight)之类的内容应该是frame的{​​{1}}。
  4. 现在,更新shadowView的{​​{1}},以便它可以显示您的boundsview
  5. 如果您发现标题不再浮动(使用shadowView),请删除阴影视图。
  6. 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
    }
}