UITableView 헤더 섹션 사용자 정의


141

UITableView각 섹션의 헤더 를 사용자 정의하고 싶습니다 . 지금까지 구현했습니다

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

UITabelViewDelegate방법. 내가하고 싶은 것은 각 섹션에 대한 현재 헤더를 가져 와서 UILabel하위보기로 추가 하는 것입니다.

지금까지는 그렇게 할 수 없습니다. 기본 섹션 헤더를 가져올 항목을 찾을 수 없기 때문입니다. 첫 번째 질문 은 기본 섹션 헤더를 얻는 방법이 있습니까?

가능하지 않으면 컨테이너 뷰를 만들어야 UIView하지만 이번에는 기본 배경색, 그림자 색 등을 설정해야합니다. 섹션 헤더를주의 깊게 살펴보면 이미 사용자 정의되어 있기 때문입니다.

각 섹션 헤더에 대해 이러한 기본값을 어떻게 얻을 수 있습니까?

다들 감사 해요.


1
사용에있어 무엇이 문제입니까 tableView:titleForHeaderInSection:?
borrrden

그것은 반환합니다 NSString, 나는 사용자 정의 글꼴을 설정해야하므로, 내가 사용하면 할 수 없습니다tableView:titleForHeaderInSection:
limon

또는 이미지를 사용하여 기본 섹션 헤더를 모방 할 수 있습니다. teehanlax.com/blog/ios-6-gui-psd-iphone-5
Desdenova

@limon : 섹션 헤더를 구현하는 방법 : stackoverflow.com/a/32261262/1457385
shallowThought at

답변:


288

당신은 이것을 시도 할 수 있습니다 :

 -(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;
}

bg 색상 watever 색상 설정 가능
Lochana Ragupathy

그게 문제입니다, 당신이 쓴 것을 이미 끝냈습니다. 그러나 섹션 헤더의 기본 배경색을 모르겠습니다. 회색입니다. 그러나 정확히 기본 섹션 헤더가되어야합니다.
limon

15
디지털 컬러 미터
Lochana Ragupathy

UILabel의 backgroundColor도 설정하십시오. 배경이 명확하지 않을 때 약간 혼란 스러웠습니다.
shulmey

3
NSString 줄에있는 목록은 무엇입니까? * string = [list objectAtIndex : section]; 누구나 말해 줄 수있다
Nisha Gupta

45

선택한 답변 tableView :viewForHeaderInSection:이 정확합니다.

여기서 팁을 공유하십시오.

스토리 보드 / xib를 사용하는 경우 다른 프로토 타입 셀을 만들어 "섹션 셀"에 사용할 수 있습니다. 헤더를 구성하는 코드는 행 셀을 구성하는 방법과 유사합니다.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    static NSString *HeaderCellIdentifier = @"Header";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:HeaderCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:HeaderCellIdentifier];
    }

    // Configure the cell title etc
    [self configureHeaderCell:cell inSection:section];

    return cell;
}

14
이 솔루션에는 많은 문제가 있습니다. 우선 "tableView (tableView : UITableView, canEditRowAtIndexPath indexPath : NSIndexPath)-> Bool"을 구현하면 슬라이드 할 때 섹션 헤더가 행과 함께 이동한다는 것을 알 수 있습니다. 이를 피하려면 cell.contentView를 대신 반환해야합니다. 더 큰 문제는이 솔루션을 사용하면 섹션 헤더를 길게 누르면 앱이 중단된다는 것입니다. 올바른 방법은 UITableViewHeaderFooterView를 확장하는 펜촉을 만들고 tableview에 등록 하고이 메소드로 반환하는 것입니다. iOS8에서 테스트
Kachi

@Kachi 당신이 언급 한대로 솔루션을 사용하고 viewForHeaderInSection있지 않습니다 canEditRowAtIndexPath. 나는 당신이 말한 충돌을 결코 확인하지는 않지만, 길게 누르면 충돌이 어떻게 발생하는지 깨달을 수 있습니까?
samwize

1
내가 의미하는 것은이 솔루션을 구현하고 canEditRowAtIndexPath를 구현하면 cell.contentView를 반환하지 않으면 삭제중인 최상위 행과 함께 헤더가 미끄러지는 것을 볼 수 있습니다. 다음 SO 게시물을 참조하십시오. stackoverflow.com/questions/26009722/… 메시지를 할당 해제 된 객체로 보내려고하면 길게 누르면 충돌이 발생합니다. SO 게시물 : stackoverflow.com/questions/27622290/…
Kachi

1
UITableViewCell헤더보기로 사용하지 마십시오 . 시각적 결함을 디버깅하는 것은 매우 어려울 것입니다. 셀이 대기열에서 분리되는 방식으로 인해 헤더가 때때로 사라지고 헤더에 UITableViewCell속하지 않을 때까지 왜 그런지 몇 시간 동안 찾고 있습니다 UITableView.
raven_raven

UITableViewCell헤더로 a를 사용하는 것은 단순히 잘못되었습니다.
Alex Zavatone

31

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
}

1
뷰 내부의 텍스트에 따라 레이블 높이를 동적으로 만드는 방법은 무엇입니까?
Pratik Shah

override키워드는 중복됩니다. 또한 헤더 뷰를 다시 작성하지 않고 재사용하는 것이 좋습니다.
Vadim Bulavin

17

기본 헤더보기를 사용하는 경우 기본 헤더보기 만 사용하여 텍스트를 변경할 수 있습니다

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

스위프트

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

보기를 사용자 정의하려면 새보기를 직접 작성해야합니다.


10

UITableViewHeaderFooterView를 사용하지 않습니까?


-(UIView *) tableView : (UITableView *) tableView viewForHeaderInSection : (NSInteger) 섹션도 사용하지 않는 경우에만 사용할 수 있습니다.
SAHM

1
완벽하게 유효한 답변. 또한 UITableViewHeaderFooterView를 사용하면 셀과 같은 뷰 재활용의 이점이 있습니다.
Gregzo

6
@dmarsi 나는 그들이 더 이상 사용되지 않는다는 증거를 찾지 못했습니다.
Fawkes

8

headerInSection이 표시되지 않으면 시도해보십시오.

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

주어진 섹션의 헤더 높이를 반환합니다.


1
답을 정교하게 생각하십니까?
CinCout

메소드 후크로 섹션 헤더의 '높이'를 지정하지 않으면 헤더 섹션이 표시되지 않습니다. 높이를 지정하지 않으면 UITableView는 기본적으로 헤더를 표시하지 않습니다. @CinCout
theprojectabot

6

lochana 및 estemendoza의 신속한 3 버전 답변 :

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;
}

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
}

5

다른 답변은 기본 헤더보기를 다시 작성하는 것이 좋지만 실제로 주요 질문에 대답하지는 않습니다.

기본 섹션 헤더를 얻는 방법이 있습니까?

방법이 있습니다- tableView:willDisplayHeaderView:forSection:대리인에게 구현 하십시오. 기본 헤더보기는 두 번째 매개 변수로 전달되며 여기에서이를 UITableViewHeaderFooterView원하는대로 캐스트 한 다음 하위보기를 추가 / 변경할 수 있습니다.

오브제 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
}

당신은 그것을 캐스팅 할 필요가 없습니다. 원하는 것을보기에 추가하면됩니다. 실제로 새 객체를 만들면 할당하지 않으면 아무 작업도 수행되지 않습니다 view.
Alex Zavatone

@AlexZavatone 맞습니다. 뷰를 추가하는 경우에만 캐스트 할 필요가 없습니다. 텍스트 레이블과 같은 일부 기본보기를 사용자 정의하려는 경우에 유용합니다.
Craig Brown

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;
}

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은 스토리 보드에서 작성된 사용자 정의 UITableViewCell입니다.


SectionHeaderTableViewCell-선언되지 않은 식별자 사용
Boris Gafurov

@BorisGafurov SectionHeaderTableViewCell은 UITableViewCell에 스토리 보드에서 만든 예제 이름입니다.
Anish Kumar

2

내가 당신이라면, NSString이 주어진 UIView를 반환하는 메소드를 만들 것입니다. 예를 들어

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

이 메소드의 구현에서 UIView를 작성하고 설정하려는 특성으로 UILabel을 추가하고 제목을 주어진 제목으로 설정하십시오.


예, 그렇게 할 수 있지만 내 질문은 기본 섹션 헤더 배경, 그림자 값을 얻는 방법이며 나머지는 쉽게 구현할 수 있습니다.
limon

기본 섹션 헤더 배경은 무엇을 의미합니까
Lochana Ragupathy

1
가장 쉬운 방법은 Digital Color Meter 응용 프로그램을 사용하여 원하는 색상을 얻는 것입니다. 내가 알 수있는 한 코드로 코드를 가져 오는 것은 어려울 것입니다 ...
cpprulez

2

Swift에서 @samwize의 솔루션 (그에게 투표하십시오!). 머리글 / 바닥 글 섹션에도 동일한 재활용 메커니즘을 사용하여 훌륭하게 :

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let settingsHeaderSectionCell:SettingsHeaderSectionCell = self.dequeueReusableCell(withIdentifier: "SettingsHeaderSectionCell") as! SettingsHeaderSectionCell

    return settingsHeaderSectionCell
}

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]];
    }
}

섹션 헤더에서 textLabel의 글꼴을 변경하려면 willDisplayHeaderView에서 수행하십시오. 텍스트를 설정하려면 viewForHeaderInSection 또는 titleForHeaderInSection에서 수행 할 수 있습니다. 행운을 빕니다!


2

복사하여 붙여 넣을 2019 전체 예제

스토리 보드에서 먼저 "그룹화"를 설정하십시오. 초기에 발생해야하며 나중에 설정할 수 없으므로 스토리 보드에서 기억하기가 더 쉽습니다.

여기에 이미지 설명을 입력하십시오

다음,

Apple 버그로 인해 heightForHeaderInSection을 구현 해야 합니다 .

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

아직 10 년 동안 Apple 버그가 여전히 있습니다 heightForHeaderInSection. 전화 를하지 않으면 첫 번째 헤더 (예 : 인덱스 0)가 표시되지 않습니다 .

그래서, tableView.sectionHeaderHeight = 70단순히 작동하지 않습니다 이 생겼습니다 .

프레임을 설정하면 아무것도 달성되지 않습니다.

에서는 viewForHeaderInSection단순히 UIView의를 만들 ().

그것은 / 무의미 아무것도 달성하지 당신이 경우 (... 프레임) UIView의 아이폰 OS는 단순히 테이블의 결정에 따라 뷰의 크기를 설정하기 때문이다.

따라서 첫 번째 줄은 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
}

그게 다야-다른 것은 시간 낭비입니다.

또 다른 "거친"애플 문제.


위에서 사용한 편의 확장은 다음과 같습니다.

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
    }
}

1

신속하게 테이블 뷰 헤더를 마술처럼 추가

최근에 이것을 시도했습니다.

전체 UITableView에 하나의 헤더가 필요했습니다.

TableView 상단에 UIImageView를 원했던 것처럼. 그래서 UITableViewCell 위에 UIImageView를 추가하고 자동으로 tableViewHeader로 추가되었습니다. 이제 ImageView를 ViewController에 연결하고 이미지를 추가했습니다.

처음 이런 일을했기 때문에 혼란 스러웠습니다. 혼란을 없애기 위해 MainStoryBoard의 xml 형식을 열고 Image View가 헤더로 추가 된 것을 발견했습니다.

그것은 나를 위해 일했다. xCode와 빠른 감사합니다.



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
    }
}


0

tableView 헤더에 제목을 추가하려는 경우보기를 추가하지 마십시오. swift 3.x에서 코드는 다음과 같습니다.

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    var lblStr = ""
    if section == 0 {
        lblStr = "Some String 1"
    }
    else if section == 1{
        lblStr = "Some String 2"
    }
    else{
        lblStr = "Some String 3"
    }
    return lblStr
}

헤더의 제목을 가져 오기 위해 배열을 구현할 수 있습니다.


0

iOS는 자신의 섹션 헤더를 다시 작성하는 대신 원래 질문으로 돌아가서 (4 년 후) 기본 질문을 만든 직후에 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];
}

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];
}

0

스위프트 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
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.