UITableView - thay đổi màu tiêu đề của phần


Câu trả lời:


393

Hy vọng phương pháp này từ UITableViewDelegategiao thức sẽ giúp bạn bắt đầu:

Mục tiêu-C:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{
  UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];
  if (section == integerRepresentingYourSectionOfInterest)
     [headerView setBackgroundColor:[UIColor redColor]];
  else 
     [headerView setBackgroundColor:[UIColor clearColor]];
  return headerView;
}

Nhanh:

func tableView(_ tableView: UITableView!, viewForHeaderInSection section: Int) -> UIView!
{
  let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: 30))
  if (section == integerRepresentingYourSectionOfInterest) {
    headerView.backgroundColor = UIColor.redColor()
  } else {
    headerView.backgroundColor = UIColor.clearColor()
  }
  return headerView
}

Cập nhật 2017:

Swift 3:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
    {
        let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: 30))
        if (section == integerRepresentingYourSectionOfInterest) {
            headerView.backgroundColor = UIColor.red
        } else {
            headerView.backgroundColor = UIColor.clear
        }
        return headerView
    }

Thay thế [UIColor redColor]bằng bất cứ điều gì UIColorbạn muốn. Bạn cũng có thể muốn điều chỉnh kích thước của headerView.


17
Nó cũng có thể giúp điều chỉnh kích thước tiêu đề của phần bằng cách sử dụng self.tableView.sectionHeaderHeight. Nếu không, bạn có thể gặp khó khăn khi xem văn bản bạn hiển thị cho tiêu đề của phần.
Tony Lenzi

[UIColor xxxColor]Tuy nhiên, nó hoạt động tốt khi tôi thử một màu tùy chỉnh như màu tôi có thể nhận được từ photoshop (vì vậy sử dụng UIColor red:green:blue:alpha:, nó chỉ có màu trắng. Tôi có làm gì sai không?
Matej

Đăng một câu hỏi riêng biệt và chúng tôi sẽ cố gắng giúp đỡ. Bao gồm mã nguồn.
Alex Reynold

12
Lưu ý rằng câu trả lời này (trong khi chính xác) sẽ chỉ trả về một UIView không có nội dung.
Greg M. Krsak

7
Đây là thông tin khá lỗi thời và chỉ đơn giản là tạo một góc nhìn khác không phải là câu trả lời hay nhất. Ý tưởng là để có được cái nhìn đúng đắn và thay đổi màu sắc hoặc màu trên nó. Câu trả lời dưới đây bằng willDisplayHeaderView là cách tiếp cận tốt hơn nhiều.
Alex Zavatone

741

Đây là một câu hỏi cũ, nhưng tôi nghĩ rằng câu trả lời cần phải được cập nhật.

Phương pháp này không liên quan đến việc xác định và tạo chế độ xem tùy chỉnh của riêng bạn. Trong iOS 6 trở lên, bạn có thể dễ dàng thay đổi màu nền và màu văn bản bằng cách xác định

-(void)tableView:(UITableView *)tableView 
    willDisplayHeaderView:(UIView *)view 
    forSection:(NSInteger)section

phương pháp đại biểu

Ví dụ:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    // Background color
    view.tintColor = [UIColor blackColor];

    // Text Color
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
    [header.textLabel setTextColor:[UIColor whiteColor]];

    // Another way to set the background color
    // Note: does not preserve gradient effect of original header
    // header.contentView.backgroundColor = [UIColor blackColor];
}

Lấy từ bài đăng của tôi ở đây: https://happyteamlabs.com/blog/ios-how-to-customize-table-view-header-and-footer-colors/

Swift 3/4

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){
    view.tintColor = UIColor.red
    let header = view as! UITableViewHeaderFooterView
    header.textLabel?.textColor = UIColor.white
}

2
Tôi không biết điều này thậm chí đã được thêm vào SDK. Xuất sắc! Hoàn toàn là câu trả lời đúng.
JRod

1
OP - Vui lòng cập nhật câu trả lời được chấp nhận cho câu trả lời này. Sạch sẽ hơn nhiều so với các phương pháp cũ.
Kyle Clegg

10
Điều này dường như không làm việc cho tôi. Màu văn bản hoạt động nhưng không phải là màu cho nền tiêu đề. Tôi đang dùng iOS 7.0.4
zeeple 7/214

10
user1639164, bạn có thể sử dụng header.backgroundView.backgroundColor = [UIColor blackColor]; để đặt tông màu cho nền tiêu đề.
慭 慭 流

2
@Kent đã được một thời gian rõ ràng, nhưng đối với những người trong tương lai, header.contentView.backgroundColor = [UIColor blackColor];tùy chọn sẽ cung cấp cho bạn một tiêu đề mờ đục
SparkyRobinson

98

Đây là cách thay đổi màu văn bản.

UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(10, 3, tableView.bounds.size.width - 10, 18)] autorelease];
label.text = @"Section Header Text Here";
label.textColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.75];
label.backgroundColor = [UIColor clearColor];
[headerView addSubview:label];

18
Cảm ơn DoctorG - Điều này rất hữu ích. BTW - để giữ nhãn hiện có được cung cấp bởi dataSource, tôi đã sửa đổi dòng thứ 2 như vậy: nhãn.text = [tableView.dataSource tableView: tableView titleForHeaderInSection: phần]; Có thể là hình thức xấu, nhưng nó làm việc cho tôi. Có lẽ điều này có thể giúp đỡ người khác.
JJ Rohrer

1
@JJ Hình thức đó thực sự tốt, vì bạn đang gọi cùng một phương thức ban đầu bạn sử dụng để xác định tiêu đề phần của bảng.
Tim

3
Tôi đã gỡ bỏ autorelease và thay đổi nó thành một bản phát hành rõ ràng. Các phương thức định dạng UITableView được gọi nhiều, nhiều lần. Tránh sử dụng autorelease khi có thể.
memmons

@Harkonia, thay vì thay đổi câu trả lời đã gửi, vui lòng đề nghị thay đổi trong một nhận xét cho câu trả lời. Nó được coi là hình thức xấu để thay đổi mã của người khác bằng một chỉnh sửa. Lỗi chính tả, định dạng và ngữ pháp xấu là trò chơi công bằng.
Tin Man

1
Thay vì addSubview: UILabel, bạn chỉ nên trả về UILabel trong viewForHeaderInSection. UILable đã là một UIView rồi :)
Nas Banov

52

Bạn có thể làm điều này nếu bạn muốn tiêu đề với màu tùy chỉnh:

[[UITableViewHeaderFooterView appearance] setTintColor:[UIColor redColor]];

Giải pháp này hoạt động rất tốt kể từ iOS 6.0.


1
hm ... nó không làm việc cho tôi đã thử trình giả lập iOS 6 và thiết bị iOS 7. Bạn đã thử nghiệm theo cách này? Tôi nên đặt nó ở đâu?
Maxim Kholyavkin

Nó có thể được thực hiện trong ứng dụng: didFinishLaunchingWithOptions: phương thức ủy nhiệm ứng dụng.
Leszek Zarna

lỗi của tôi: Tôi đã cố sử dụng cách này trong khi UITableViewStylegrouped BTW: để thay đổi màu văn bản theo cách này nên được sử dụng stackoverflow.com/a/20778406/751932
Maxim Kholyavkin

Nếu nó trong UIView tùy chỉnh, chỉ cần đặt nó vào phương thức - init.
felixwcf

31

Giải pháp sau đây hoạt động cho Swift 1.2 với iOS 8+

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    // This changes the header background
    view.tintColor = UIColor.blueColor()

    // Gets the header view as a UITableViewHeaderFooterView and changes the text colour
    var headerView: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    headerView.textLabel.textColor = UIColor.redColor()

}

22

Đặt màu nền trên UITableViewHeaderFooterView đã không được chấp nhận. Vui lòng sử dụng contentView.backgroundColorthay thế.


21

Đừng quên thêm đoạn mã này từ đại biểu hoặc chế độ xem của bạn sẽ bị cắt hoặc xuất hiện phía sau bảng trong một số trường hợp, liên quan đến chiều cao của chế độ xem / nhãn của bạn.

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

Điều này không còn cần thiết nữa nếu bạn theo dõi iOS6 và sau đó trả lời bởi Dj S.
Bjinse

21

Bạn có thể làm điều đó trên main.storyboard trong khoảng 2 giây.

  1. Chọn xem bảng
  2. Đi đến Thanh tra thuộc tính
  3. Danh sách mục
  4. Cuộn xuống để xem phân nhóm
  5. Thay đổi "nền"

Có một cái nhìn ở đây


18

Nếu bạn không muốn tạo chế độ xem tùy chỉnh, bạn cũng có thể thay đổi màu như thế này (yêu cầu iOS 6):

-(void) tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    if ([view isKindOfClass: [UITableViewHeaderFooterView class]]) {
        UITableViewHeaderFooterView* castView = (UITableViewHeaderFooterView*) view;
        UIView* content = castView.contentView;
        UIColor* color = [UIColor colorWithWhite:0.85 alpha:1.]; // substitute your color here
        content.backgroundColor = color;
    }
}

13

Đặt màu nền và màu văn bản của khu vực phần: (Nhờ William JockuschDj S)

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    if ([view isKindOfClass: [UITableViewHeaderFooterView class]]) {
        UITableViewHeaderFooterView* castView = (UITableViewHeaderFooterView*) view;
        castView.contentView.backgroundColor = [UIColor grayColor];
        [castView.textLabel setTextColor:[UIColor grayColor]];
    }
}

13

Swift 4

Để thay đổi màu nền , màu nhãn văn bảnphông chữ cho Chế độ xem tiêu đề của Phần UITableView, chỉ cần ghi đè willDisplayHeaderViewcho chế độ xem bảng của bạn như sau:

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        let header = view as! UITableViewHeaderFooterView
        header.backgroundView?.backgroundColor = .white
        header.textLabel?.textColor = .black
        header.textLabel?.font = UIFont(name: "Helvetica-Bold", size: 14)
} 

Điều này làm việc hoàn hảo cho tôi; hy vọng nó cũng giúp bạn


Đặt màu nền trên UITableViewHeaderFooterView đã không được chấp nhận. Thay vào đó, bạn phải đặt UIView tùy chỉnh với màu nền mong muốn của mình thành thuộc tính nền.
mojtaba al moussawi

10

Dưới đây là cách thêm hình ảnh trong chế độ xem tiêu đề:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{
    UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];
    UIImageView *headerImage = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-gery-bar.png"]] autorelease];

    headerImage.frame = CGRectMake(0, 0, tableView.bounds.size.width, 30);

    [headerView addSubview:headerImage];

    return headerView;
}

8

Đối với iOS8 (Beta) và Swift, chọn Màu RGB bạn muốn và thử điều này:

override func tableView(tableView: UITableView!, viewForHeaderInSection section: Int) -> UIView! {
    var header :UITableViewHeaderFooterView = UITableViewHeaderFooterView()

    header.contentView.backgroundColor = UIColor(red: 254.0/255.0, green: 190.0/255.0, blue: 127.0/255.0, alpha: 1)
    return header

}

("Ghi đè" là có từ khi iMim sử dụng UITableViewControll thay vì UIViewContoder bình thường trong dự án của tôi, nhưng nó không bắt buộc phải thay đổi màu tiêu đề của phần)

Văn bản của tiêu đề của bạn sẽ vẫn được nhìn thấy. Lưu ý rằng bạn sẽ cần điều chỉnh chiều cao tiêu đề của phần.

Chúc may mắn.


6

Chuyển 2

Tôi đã có thể thay đổi thành công màu nền của phần với hiệu ứng làm mờ được thêm vào (rất tuyệt). Để thay đổi màu nền của phần dễ dàng:

  1. Đầu tiên, vào Storyboard và chọn Chế độ xem bảng
  2. Đi đến Thanh tra thuộc tính
  3. Danh sách mục
  4. Cuộn xuống để xem
  5. Thay đổi "Nền"

Sau đó, để tạo hiệu ứng mờ, thêm vào mã:

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    // This is the blur effect

    let blurEffect = UIBlurEffect(style: .Light)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)

    // Gets the header view as a UITableViewHeaderFooterView and changes the text colour and adds above blur effect
    let headerView: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    headerView.textLabel!.textColor = UIColor.darkGrayColor()
    headerView.textLabel!.font = UIFont(name: "HelveticaNeue-Light", size: 13)
    headerView.tintColor = .groupTableViewBackgroundColor()
    headerView.backgroundView = blurEffectView

}

5

Tôi biết câu trả lời của nó, chỉ trong trường hợp, Trong Swift sử dụng như sau

    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let tableViewWidth = self.tableView.bounds

        let headerView = UIView(frame: CGRectMake(0, 0, tableViewWidth.size.width, self.tableView.sectionHeaderHeight))
        headerView.backgroundColor = UIColor.greenColor()

        return headerView
    }

4

iOS 8+

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        tableView.tableHeaderView?.backgroundColor = UIColor.blue()
}

4

Dựa trên câu trả lời @Dj S, sử dụng Swift 3. Điều này hoạt động rất tốt trên iOS 10.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    // Background color
    view.tintColor = UIColor.black

    // Text Color
    let headerView = view as! UITableViewHeaderFooterView
    headerView.textLabel?.textColor = UIColor.white
}

3

Tôi có một dự án sử dụng các ô xem bảng tĩnh, trong iOS 7.x. willDisplayHeaderView không kích hoạt. Tuy nhiên, phương pháp này hoạt động tốt:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    NSLog(@"%s", __FUNCTION__);
    CGRect headerFrame = CGRectMake(x, y, w, h);    
    UIView *headerView = [[UIView alloc] initWithFrame:headerFrame];  
    headerView.backgroundColor = [UIColor blackColor];

3
 -(void) tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view
  forSection:(NSInteger)section
  {
        if ([view isKindOfClass: [UITableViewHeaderFooterView class]])
        {
             UITableViewHeaderFooterView *castView = (UITableViewHeaderFooterView *) view;
             UIView *content = castView.contentView;
             UIColor *color = [UIColor whiteColor]; // substitute your color here
             content.backgroundColor = color;
             [castView.textLabel setTextColor:[UIColor blackColor]];
        }
 }

3

Tôi nghĩ rằng mã này không quá tệ.

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tableView.dequeueReusableHeaderFooterViewWithIdentifier(MyHeaderView.reuseIdentifier) as MyHeaderView
    let backgroundView = UIView()
    backgroundView.backgroundColor = UIColor.whiteColor()
    headerView.backgroundView = backgroundView
    headerView.textLabel.text = "hello"
    return headerView
}

3

Swift 4 làm cho nó rất dễ dàng. Đơn giản chỉ cần thêm nó vào lớp của bạn và đặt màu khi cần thiết.

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        view.backgroundColor = UIColor(red: 0.094, green: 0.239, blue: 0.424, alpha: 1.0)
    }

hoặc nếu một màu đơn giản

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        view.backgroundColor = UIColor.white
    }

Đã cập nhật cho Swift 5

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        view.tintColor = UIColor(red: 0.094, green: 0.239, blue: 0.424, alpha: 1.0)
    }

hoặc nếu một màu đơn giản

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        view.tintColor = UIColor.white
    }

1
Điều này dường như không hoạt động nữa trong iOS 13
GarySabo

4
trong iOS 13 thay thế "view.backgroundColor" thành "view.tintColor".
Bogdan Razvan

2

Trong iOS 7.0.4, tôi đã tạo một tiêu đề tùy chỉnh với XIB của riêng nó. Không có gì được đề cập ở đây trước khi làm việc. Nó phải là lớp con của UITableViewHeaderFooterView để hoạt động với dequeueReusableHeaderFooterViewWithIdentifier:và có vẻ như lớp đó rất cứng đầu về màu nền. Vì vậy, cuối cùng tôi đã thêm một UIView (bạn có thể làm điều đó bằng mã hoặc IB) với tên customBackgroudView, và sau đó đặt thuộc tính backgroundColor. Trong layoutSubview: Tôi đặt khung của khung nhìn đó thành giới hạn. Nó hoạt động với iOS 7 và không có trục trặc.

// in MyTableHeaderView.xib drop an UIView at top of the first child of the owner
// first child becomes contentView

// in MyTableHeaderView.h
@property (nonatomic, weak) IBOutlet UIView * customBackgroundView;

// in MyTableHeaderView.m
-(void)layoutSubviews;
{
    [super layoutSubviews];

    self.customBackgroundView.frame = self.bounds;
}
// if you don't have XIB / use IB, put in the initializer:
-(id)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
    ...
    UIView * customBackgroundView = [[UIView alloc] init];
    [self.contentView addSubview:customBackgroundView];
    _customBackgroundView = customBackgroundView;
    ...
}


// in MyTableViewController.m
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    MyTableHeaderView * header = [self.tableView
                                          dequeueReusableHeaderFooterViewWithIdentifier:@"MyTableHeaderView"];
    header.customBackgroundView.backgroundColor = [UIColor redColor];
    return header;
}

2

Chỉ cần thay đổi màu của lớp của chế độ xem tiêu đề

- Bảng (UIView *) Xem: (UITableView *) bảng Xem viewForHeaderInSection: (NSInteger) 
{
  UIView * headerView = [[[UIView alloc] initWithFrame: CGRectMake (0, 0, tableView.bound.size. Thong, 30)] autorelease];
 headerView.layer.backgroundColor = [UIColor ClearColor] .CGColor
}


2

Nếu bất cứ ai cần nhanh chóng, giữ tiêu đề:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView(frame: CGRect(x: 0,y: 0,width: self.tableView.frame.width, height: 30))
    view.backgroundColor = UIColor.redColor()
    let label = UILabel(frame: CGRect(x: 15,y: 5,width: 200,height: 25))
    label.text = self.tableView(tableView, titleForHeaderInSection: section)
    view.addSubview(label)
    return view
}

2

Tôi nhận được tin nhắn từ Xcode thông qua nhật ký giao diện điều khiển

[TableView] Đặt màu nền trên UITableViewHeaderFooterView đã không được chấp nhận. Thay vào đó, vui lòng đặt UIView tùy chỉnh với màu nền mong muốn của bạn vào thuộc tính backgroundView.

Sau đó, tôi chỉ cần tạo một UIView mới và đặt nó làm nền của HeaderView. Không phải là một giải pháp tốt nhưng nó dễ dàng như Xcode đã nói.


2

Trong trường hợp của tôi, nó hoạt động như thế này:

let headerIdentifier = "HeaderIdentifier"
let header = self.tableView.dequeueReusableHeaderFooterView(withIdentifier: headerIdentifier)
header.contentView.backgroundColor = UIColor.white

2

Chỉ cần đặt màu nền của chế độ xem nền:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){         
  let tableHeader = view as! UITableViewHeaderFooterView        
  tableHeader.backgroundView?.backgroundColor = UIColor.white     
}

1

Với RubyMotion / RedPotion, dán phần này vào TableScreen của bạn:

  def tableView(_, willDisplayHeaderView: view, forSection: section)
    view.textLabel.textColor = rmq.color.your_text_color
    view.contentView.backgroundColor = rmq.color.your_background_color
  end

Hoạt động như một lá bùa!


1

Đối với nhanh 5+

Trong willDisplayHeaderViewphương pháp

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

     //For Header Background Color
     view.tintColor = .black

    // For Header Text Color
    let header = view as! UITableHeaderFooterView
    header.textLabel?.textColor = .white
}

Tôi hy vọng cái này sẽ giúp bạn :]


0

Mặc dù func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)sẽ hoạt động tốt, bạn có thể đạt được điều này mà không cần thực hiện phương pháp ủy nhiệm khác. trong func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?phương pháp của bạn , bạn có thể sử dụng view.contentView.backgroundColor = UIColor.whitethay vì view.backgroundView?.backgroundColor = UIColor.whitekhông hoạt động. (Tôi biết đó backgroundViewlà tùy chọn, nhưng ngay cả khi nó ở đó, điều này không gây ra mà không thực hiệnwillDisplayHeaderView

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.