自定义UITableView标题部分

时间:2013-03-25 09:23:17

标签: ios objective-c swift uitableview

我想为每个部分自定义UITableView标头。到目前为止,我已经实施了

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

这个UITabelViewDelegate方法。我想要做的是获取每个部分的当前标题,并添加UILabel作为子视图。

到目前为止,我无法做到这一点。因为,我找不到任何东西来获取默认节标题。第一个问题,有没有办法获取默认栏目标题

如果不可能,我需要创建一个UIView的容器视图,但这次我需要设置默认的背景颜色,阴影颜色等。因为,如果你仔细查看部分的标题,它是已定制。

如何为每个节标题获取这些默认值?

谢谢大家。

23 个答案:

答案 0 :(得分:278)

你可以试试这个:

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 18)];
    /* Create custom view to display section header... */
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, tableView.frame.size.width, 18)];
    [label setFont:[UIFont boldSystemFontOfSize:12]];
     NSString *string =[list objectAtIndex:section];
    /* Section header is in 0th index... */
    [label setText:string];
    [view addSubview:label];
    [view setBackgroundColor:[UIColor colorWithRed:166/255.0 green:177/255.0 blue:186/255.0 alpha:1.0]]; //your background color...
    return view;
}

答案 1 :(得分:29)

快速版Lochana Tejas回答:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView(frame: CGRectMake(0, 0, tableView.frame.size.width, 18))
    let label = UILabel(frame: CGRectMake(10, 5, tableView.frame.size.width, 18))
    label.font = UIFont.systemFontOfSize(14)
    label.text = list.objectAtIndex(indexPath.row) as! String
    view.addSubview(label)
    view.backgroundColor = UIColor.grayColor() // Set your background color

    return view
}

答案 2 :(得分:17)

如果使用默认标题视图,则只能使用

更改其上的文本
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

对于Swift:

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

如果您想自定义视图,则需要自己创建一个新视图。

答案 3 :(得分:11)

为什么不使用UITableViewHeaderFooterView

答案 4 :(得分:8)

如果没有显示headerInSection,可以试试这个。

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

这将返回给定部分标题的高度。

答案 5 :(得分:5)

试试这个......

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
{
    // Background view is at index 0, content view at index 1
    if let bgView = view.subviews[0] as? UIView
    {
        // do your stuff
    }

    view.layer.borderColor = UIColor.magentaColor().CGColor
    view.layer.borderWidth = 1
}

答案 6 :(得分:5)

斯威夫特3版本的lochana和estemendoza答案:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let view = UIView(frame: CGRect(x:0, y:0, width:tableView.frame.size.width, height:18))
    let label = UILabel(frame: CGRect(x:10, y:5, width:tableView.frame.size.width, height:18))
    label.font = UIFont.systemFont(ofSize: 14)
    label.text = "This is a test";
    view.addSubview(label);
    view.backgroundColor = UIColor.gray;
    return view

}

另外,请注意,您还必须实施:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 100;
}

答案 7 :(得分:4)

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    //put your values, this is part of my code
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 30.0f)];
    [view setBackgroundColor:[UIColor redColor]];
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 5, 150, 20)];
    [lbl setFont:[UIFont systemFontOfSize:18]];
    [lbl setTextColor:[UIColor blueColor]];
    [view addSubview:lbl];

    [lbl setText:[NSString stringWithFormat:@"Section: %ld",(long)section]];

    return view;
}

答案 8 :(得分:4)

这是最简单的解决方案。以下代码可以直接用于创建自定义节标题。

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    SectionHeaderTableViewCell *headerView = [tableView dequeueReusableCellWithIdentifier:@"sectionHeader"];

    //For creating a drop menu of rows from the section
    //==THIS IS JUST AN EXAMPLE. YOU CAN REMOVE THIS IF-ELSE.==
    if (![self.sectionCollapsedArray[section] boolValue])
    {
        headerView.imageView.image = [UIImage imageNamed:@"up_icon"];
    }
    else
    {
        headerView.imageView.image = [UIImage imageNamed:@"drop_icon"];
    }

    //For button action inside the custom cell
    headerView.dropButton.tag = section;
    [headerView.dropButton addTarget:self action:@selector(sectionTapped:) forControlEvents:UIControlEventTouchUpInside];

    //For removing long touch gestures.
    for (UIGestureRecognizer *recognizer in headerView.contentView.gestureRecognizers)
    {
        [headerView.contentView removeGestureRecognizer:recognizer];
        [headerView removeGestureRecognizer:recognizer];
    }

    return headerView.contentView;
}

注意:SectionHeaderTableViewCell是在Storyboard中创建的自定义UITableViewCell。

答案 9 :(得分:4)

其他答案可以很好地重新创建默认标题视图,但实际上并没有回答您的主要问题:

  

有没有办法获得默认的节标题?

有一种方法 - 只需在您的代理中实施tableView:willDisplayHeaderView:forSection:即可。默认标题视图将传递到第二个参数,然后您可以将其转换为UITableViewHeaderFooterView,然后根据需要添加/更改子视图。

<强>的OBJ-C

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view;

    // Do whatever with the header view... e.g.
    // headerView.textLabel.textColor = [UIColor whiteColor]
}

<强>夫特

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)
{
    let headerView = view as! UITableViewHeaderFooterView

    // Do whatever with the header view... e.g.
    // headerView.textLabel?.textColor = UIColor.white
}

答案 10 :(得分:2)

如果我是你,我会创建一个方法,在给定要包含的NSString的情况下返回UIView。例如

+ (UIView *) sectionViewWithTitle:(NSString *)title;

在此方法的实现中,创建一个UIView,使用您要设置的属性向其添加UILabel,当然将其标题设置为给定的属性。

答案 11 :(得分:2)

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    if([view isKindOfClass:[UITableViewHeaderFooterView class]]){

        UITableViewHeaderFooterView *headerView = view;

        [[headerView textLabel] setTextColor:[UIColor colorWithHexString:@"666666"]];
        [[headerView textLabel] setFont:[UIFont fontWithName:@"fontname" size:10]];
    }
}

如果要更改section标题中textLabel的字体,请在willDisplayHeaderView中进行更改。要设置文本,您可以在viewForHeaderInSection或titleForHeaderInSection中执行此操作。祝你好运!

答案 12 :(得分:1)

@samwize在Swift中的解决方案(所以赞成他!)。对于页眉/页脚部分也使用相同的回收机制:

  @foreach ($view_360s as $view_360)

          <input type="text" name="iframe_title[]" class="form_input iframe_title" value="{{$view_360->title}}" />

       @endforeach

答案 13 :(得分:1)

swif 4.2

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }

    header.textLabel?.textAlignment = .center // for all sections

    switch section {
    case 1:  //only section No.1
        header.textLabel?.textColor = .black
    case 3:  //only section No.3
        header.textLabel?.textColor = .red
    default: //
        header.textLabel?.textColor = .yellow
    }
}

答案 14 :(得分:1)

调用此委托方法

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

return @"Some Title";
}

这将有机会自动添加带有动态标题的默认标题。

您可以使用可重复使用且可自定义的页眉/页脚。

https://github.com/sourov2008/UITableViewCustomHeaderFooterSection

答案 15 :(得分:1)

在swift

中神奇地添加表格视图标题

最近我试过这个。

我在整个UITableView中只需要一个且只有一个标头。

就像我想在TableView顶部使用UIImageView一样。所以我在UITableViewCell的顶部添加了一个UIImageView,并自动添加为tableViewHeader。现在我将Im​​ageView连接到ViewController并添加了Image。

我很困惑,因为我第一次做了这样的事情。因此,为了清除我的困惑,打开MainStoryBoard的xml格式,发现图像视图已添加为标题。

它对我有用。谢谢xCode和swift。

答案 16 :(得分:0)

回到原来的问题(4年后),iOS可以简单地在你构建默认的一个之后立即打电话给你(使用willDisplayHeaderView:forSection :)。例如,我想在节标题的右边缘添加一个图形按钮:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    UITableViewHeaderFooterView * header = (UITableViewHeaderFooterView *) view;
    if (header.contentView.subviews.count >  0) return; //in case of reuse
    CGFloat rightEdge = CGRectGetMaxX(header.contentView.bounds);
    UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(rightEdge - 44, 0, 44, CGRectGetMaxY(header.contentView.bounds))];
    [button setBackgroundImage:[UIImage imageNamed:@"graphIcon"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(graphButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:button];
}

答案 17 :(得分:0)

如果您只想为tableView标题添加标题,请不要添加视图。在swift 3.x中代码如下:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="customBackgroundForTouch">
<p  > Welcome to Javatpoint.com, Here you get tutorials on latest technologies.</p>  
<p>This is second paragraph</p>  
</div>  

<div class="customBackgroundForTouch">
<p  > Welcome to Javatpoint.com, Here you get tutorials on latest technologies.</p>  
<p>This is second paragraph</p>  
</div>

您可以实现一个数组来获取标题的标题。

答案 18 :(得分:0)

使用tableView: willDisplayHeaderView:自定义视图即将显示。

这使您能够获取已为标题视图创建的视图并对其进行扩展,而不必自己重新创建整个标题视图。

以下示例基于BOOL为标题部分着色,并向标题添加详细文本元素。

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
//    view.tintColor = [UIColor colorWithWhite:0.825 alpha:1.0]; // gray
//    view.tintColor = [UIColor colorWithRed:0.825 green:0.725 blue:0.725 alpha:1.0]; // reddish
//    view.tintColor = [UIColor colorWithRed:0.925 green:0.725 blue:0.725 alpha:1.0]; // pink

    // Conditionally tint the header view
    BOOL isMyThingOnOrOff = [self isMyThingOnOrOff];

    if (isMyThingOnOrOff) {
        view.tintColor = [UIColor colorWithRed:0.725 green:0.925 blue:0.725 alpha:1.0];
    } else {
        view.tintColor = [UIColor colorWithRed:0.925 green:0.725 blue:0.725 alpha:1.0];
    }

    /* Add a detail text label (which has its own view to the section header… */
    CGFloat xOrigin = 100; // arbitrary
    CGFloat hInset = 20;
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(xOrigin + hInset, 5, tableView.frame.size.width - xOrigin - (hInset * 2), 22)];

    label.textAlignment = NSTextAlignmentRight;

    [label setFont:[UIFont fontWithName:@"Helvetica-Bold" size:14.0]
    label.text = @"Hi.  I'm the detail text";

    [view addSubview:label];
}

答案 19 :(得分:0)

除了titleForHeaderInSection之外,您只需更改页眉,页脚的视图即可。 在这里查看我的评论:Change UITable section backgroundColor without loosing section Title

答案 20 :(得分:0)

要复制和粘贴的完整2019示例

首先在情节提要上设置“分组”:它必须在int时间发生,您以后不能真正设置,因此更容易记住在情节提要上进行设置:

enter image description here

下一步

由于苹果的错误,

必须必须实现 heightForHeaderInSection

func tableView(_ tableView: UITableView,
                   heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat(70.0)
}

仍然存在一个Apple错误-至今已有十年-如果您没有heightForHeaderInSection调用,它根本不会显示第一个标题(即索引0)。

因此,tableView.sectionHeaderHeight = 70根本不起作用,它已损坏

设置框架一无所获:

viewForHeaderInSection中,只需创建一个UIView()。

如果您 UIView(frame ...),这是毫无意义的,一无所获,因为iOS只是根据表确定视图的大小。

所以viewForHeaderInSection的第一行就是let view = UIView(),这就是您返回的视图。

func tableView(_ tableView: UITableView,
                       viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView()

    let l = UILabel()
    view.addSubview(l)
    l.bindEdgesToSuperview()
    l.backgroundColor = .systemOrange
    l.font = UIFont.systemFont(ofSize: 15)
    l.textColor = .yourClientsFavoriteColor

    switch section {
    case 0:
        l.text =  "First section on screen"
    case 1:
        l.text =  "Here's the second section"
    default:
        l.text =  ""
    }

    return view
}

就是这样-其他任何事情都是浪费时间。

另一个“麻烦”的Apple问题。


上面使用的便利扩展名是:

extension UIView {

    // incredibly useful:

    func bindEdgesToSuperview() {

        guard let s = superview else {
            preconditionFailure("`superview` nil in bindEdgesToSuperview")
        }

        translatesAutoresizingMaskIntoConstraints = false
        leadingAnchor.constraint(equalTo: s.leadingAnchor).isActive = true
        trailingAnchor.constraint(equalTo: s.trailingAnchor).isActive = true
        topAnchor.constraint(equalTo: s.topAnchor).isActive = true
        bottomAnchor.constraint(equalTo: s.bottomAnchor).isActive = true
    }
}

答案 21 :(得分:0)

Swift 4.2

在Swift 4.2中,表的名称有所更改。

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let view = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 18))
        let label = UILabel(frame: CGRect(x: 10, y: 5, width: tableView.frame.size.width, height: 18))
        label.font = UIFont.systemFont(ofSize: 14)
        label.text = list.objectAtIndex(section) as! String
        view.addSubview(label)
        view.backgroundColor = UIColor.gray // Set your background color

        return view
    }

答案 22 :(得分:0)

Swift 5 代码

我们可以通过使用两个 tableView 委托函数来实现:

1] 我们可以为该部分提供自定义高度:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 49
}
    

2] 然后我们可以创建自定义标题:

 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let sectionV = UIView.init(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: 48) )
    let titleLbl = UILabel.init(frame: CGRect(x: 25, y: 24, width: tableView.frame.width-150, height: 20) )
    let viewAllBtn = UIButton.init(frame: CGRect(x: tableView.frame.width-150, y: 15, width: self.view.frame.width - titleLbl.frame.width, height: 45))
    viewAllBtn.titleLabel?.font = UIFont.systemFont(ofSize: 15)
    viewAllBtn.setTitle("View All", for: .normal)
    viewAllBtn.setTitleColor(.systemBlue, for: .normal)
    viewAllBtn.tag = section
    titleLbl.text = dashboardTempData.data?[section].title
    titleLbl.font = UIFont.systemFont(ofSize: 21, weight: UIFont.Weight.medium)
    sectionV.backgroundColor = .systemBackground
    sectionV.addSubview(titleLbl)
    sectionV.addSubview(viewAllBtn)
    sectionV.bringSubviewToFront(viewAllBtn)
    return sectionV
}

它将创建一个标签和按钮,其部分标题高度为 49