UITableView 섹션 헤더의 글꼴 크기 변경


139

UITableView 섹션 헤더에서 텍스트의 글꼴 크기를 변경하는 가장 쉬운 방법을 알려주시겠습니까?

다음 방법을 사용하여 섹션 제목을 구현했습니다.

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

그런 다음이 방법을 사용하여 섹션 헤더 높이를 성공적으로 변경하는 방법을 이해합니다.

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

이 방법을 사용하여 UITableView 셀을 채웠습니다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

그러나 섹션 헤더 텍스트의 글꼴 크기 (또는 글꼴 스타일)를 실제로 늘리는 방법에 붙어 있습니다.

누군가 도와주세요? 감사.


답변:


118

불행히도 이것을 무시해야 할 수도 있습니다.

Objective-C에서 :

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

스위프트에서 :

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

다음과 같이 해보십시오 :

Objective-C에서 :

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

    UILabel *myLabel = [[UILabel alloc] init];
    myLabel.frame = CGRectMake(20, 8, 320, 20);
    myLabel.font = [UIFont boldSystemFontOfSize:18];
    myLabel.text = [self tableView:tableView titleForHeaderInSection:section];

    UIView *headerView = [[UIView alloc] init];
    [headerView addSubview:myLabel];

    return headerView;
}

스위프트에서 :

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

    let myLabel = UILabel()
    myLabel.frame = CGRect(x: 20, y: 8, width: 320, height: 20)
    myLabel.font = UIFont.boldSystemFont(ofSize: 18)
    myLabel.text = self.tableView(tableView, titleForHeaderInSection: section)

    let headerView = UIView()
    headerView.addSubview(myLabel)

    return headerView
}

1
감사합니다. 이것은 완벽하게 작동했습니다. 매우 감사.
JRD8

5
이것이 올바른 해결책이지만이 방법에주의하십시오. 한 줄보다 긴 헤더의 tableView:heightForHeaderInSection:경우 번거로울 수있는 헤더 높이 계산을 수행해야합니다 .
레오 나탄

3
이것을 시도하고 테이블을 위로 스크롤하면 작동하지만 헤더 레이블은 화면에 유지되고 셀을 오버레이합니다. :(
Plasma

2
@ trss 나는 이것이 예상되는 행동이 아니라고 생각합니다. 나는 거기에 머무르는 헤더 섹션에 대해 이야기하지 않고 레이블과 셀 아래에 통과 할 때 셀에 부과되는 슈퍼 섹션에 대해 이야기합니다. 나는 이것을 달성하는 더 좋은 방법을 찾았으며 다시 찾은 후에 다시 게시 할 것입니다.
플라즈마

1
@ mosca1337 다른 뷰를 만들 필요가 없습니다. 실제 'UITableViewHeaderFooterView'가 표시되고 매개 변수를 조정할 수 있습니다.
Juan Boero

368

이를 수행하는 또 다른 방법은 UITableViewDelegate방법 에 응답하는 것 willDisplayHeaderView입니다. 전달 된 뷰는 실제로의 인스턴스입니다 UITableViewHeaderFooterView.

아래 예제는 글꼴을 변경하고 셀 내에서 제목 텍스트를 세로 및 가로로 가운데에 맞 춥니 다. heightForHeaderInSection테이블 뷰의 레이아웃에서 머리글 높이를 변경하도록 응답해야 합니다. (이 willDisplayHeaderView방법으로 헤더 높이를 변경하기로 결정한 경우 입니다.)

그런 다음 titleForHeaderInSection다른 섹션 제목으로 구성된이 헤더를 재사용 하기 위해 메소드에 응답 할 수 있습니다.

목표 -C

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

    header.textLabel.textColor = [UIColor redColor];
    header.textLabel.font = [UIFont boldSystemFontOfSize:18];
    CGRect headerFrame = header.frame;
    header.textLabel.frame = headerFrame;
    header.textLabel.textAlignment = NSTextAlignmentCenter;
}

스위프트 1.2

(참고 : 뷰 컨트롤러가의 자손 인 경우 UITableViewController로 선언해야합니다 override func.)

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

    header.textLabel.textColor = UIColor.redColor()
    header.textLabel.font = UIFont.boldSystemFontOfSize(18)
    header.textLabel.frame = header.frame
    header.textLabel.textAlignment = NSTextAlignment.Center
}

스위프트 3.0

이 코드는 또한 헤더 뷰가 UITableViewHeaderFooterView 이외의 다른 앱인 경우 앱이 중단되지 않도록합니다.

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }
    header.textLabel?.textColor = UIColor.red
    header.textLabel?.font = UIFont.boldSystemFont(ofSize: 18)
    header.textLabel?.frame = header.frame
    header.textLabel?.textAlignment = .center
}

3
이 방법은 위의 방법보다 저에게 훨씬 효과적이었습니다
Plasma

6
내가 본 최고의 답변.
phatmann

2
서브 클래스에 대한 다른 이유 (예 : 뷰 추가)가 없다고 가정하면 정보를 조정하는 "적절한"방법입니다. 또한이 방법을 사용하여 동적 유형의 헤더 텍스트를 업데이트 할 수 있습니다. 간단히 사용 : header.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];및 / 또는 header.detailTextLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];필요한 다른 단계와 함께 (여기 참조 : captechconsulting.com/blog/john-szumski/… )
leanne

3
이렇게하면 헤더보기의 크기가 조정되지 않으므로 Zapfino와 같이 글꼴이 크거나 크게 다른 경우 (이유 묻지 않음) 텍스트가 잘립니다. 직접 크기를 계산 해야하는 경우 혼란스럽고 수행하면 안됩니다.
레오 나탄

@CocoaPriest 베타 버전에서 충돌하지 않습니다. (GM seed 2)
Patrick Bassut

96

mosca1337의 답변이 올바른 해결책이지만 해당 방법에주의하십시오. 한 줄보다 긴 텍스트를 가진 헤더의 경우, tableView:heightForHeaderInSection:번거로울 수있는 헤더의 높이를 계산해야합니다 .

훨씬 선호되는 방법은 모양 API를 사용하는 것입니다.

[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont boldSystemFontOfSize:28]];

글꼴을 변경하는 동시에 높이 자체를 관리하기 위해 테이블을 그대로 둡니다.

최적의 결과를 얻으려면 테이블 뷰를 서브 클래 싱하고 포함 체인 (in appearanceWhenContainedIn:)에 추가 하여 특정 테이블 뷰에 대해서만 글꼴이 변경되도록하십시오.


1
서브 클래 싱이라면 어쨌든 - tableView:viewForHeaderInSection:오른쪽 에서 커스텀 뷰를 반환 합니까? 이 경우 글꼴을 바로 설정할 수 있습니다. 이것이 @ mosca1337의 솔루션이하는 일입니다.
trss

1
하하, 어제 끝나고 우습다. 테이블 뷰를 서브 클래 싱하여 컨테이너 목록에 추가하십시오. ;-)
Leo Natan

2
이 솔루션은 실제 바닥 글 / 헤더 크기를 계산할 때 많은 버그가 발생합니다. 사용자 정의 글꼴을 설정하는 동안 제목이 잘릴 때 몇 가지 예를 보여줄 수 있습니다.
kas-kad

5
스위프트 3 :UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)
에릭 Hodgins

3
iOS 11에서는 글꼴에 맞게 레이블의 크기가 올바르게 조정되지 않습니다. 또한보기를로드 한 후 위아래로 스크롤하면 기본 글꼴로 재설정됩니다.
nickdnk

25

iOS 7에서는 이것을 사용합니다.


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

    header.textLabel.font = [UIFont boldSystemFontOfSize:10.0f];
    header.textLabel.textColor = [UIColor orangeColor];
}

다음은 헤더 크기 조정 이 가능한 Swift 3.0 버전입니다.

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let header = view as? UITableViewHeaderFooterView {
        header.textLabel!.font = UIFont.systemFont(ofSize: 24.0)
        header.textLabel!.textColor = UIColor.orange          
    }
}

6
새 글꼴에 맞게 머리글보기의 크기가 조정되지 않습니다.
레오 나탄

@LeoNatan 새 글꼴에 맞게 헤더보기의 크기를 어떻게 조정할 수 있습니까?이 방법으로 수행 할 수 있습니까?
SAHM

위의 답변을 보았 음을 분명히하고 싶지만 사용자가 선택한 글꼴 (접근성)이 특정 크기를 초과 할 때 크기를 제한하기 위해 글꼴을 변경하고 싶습니다 (항상 그런 것은 아닙니다). willDisplayHeaderView에서 글꼴을 확인하고 변경해야한다고 생각하므로 글꼴이 변경되면보기 높이를 다시 계산할 수있는 방법이 있습니까?
SAHM

19

스위프트 3 :

크기 조정하는 가장 간단한 방법 :

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

    let header = view as! UITableViewHeaderFooterView

    if let textlabel = header.textLabel {
        textlabel.font = textlabel.font.withSize(15)
    }
}

그것이 내가 찾는 가장 쉬운 방법입니다.
Ryan

스위프트 4에서 작동합니다! "재정의 기능"을 잊지 마십시오.
Matvey

8

스위프트 2.0 :

  1. 기본 섹션 헤더를 완전히 사용자 정의 가능한 UILabel로 바꾸십시오.

viewForHeaderInSection을 다음과 같이 구현하십시오.

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

    let sectionTitle: String = self.tableView(tableView, titleForHeaderInSection: section)!
    if sectionTitle == "" {
      return nil
    }

    let title: UILabel = UILabel()

    title.text = sectionTitle
    title.textColor = UIColor(red: 0.0, green: 0.54, blue: 0.0, alpha: 0.8)
    title.backgroundColor = UIColor.clearColor()
    title.font = UIFont.boldSystemFontOfSize(15)

    return title
  }
  1. 기본 헤더를 변경하십시오 (기본값 유지).

willDisplayHeaderView를 다음과 같이 구현하십시오.

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

    if let view = view as? UITableViewHeaderFooterView {
      view.backgroundView?.backgroundColor = UIColor.blueColor()
      view.textLabel!.backgroundColor = UIColor.clearColor()
      view.textLabel!.textColor = UIColor.whiteColor()
      view.textLabel!.font = UIFont.boldSystemFontOfSize(15)
    }
  }

알아두기 : 정적 셀을 사용하는 경우 첫 번째 섹션 헤더는 UITableView의 상단으로 인해 다른 섹션 헤더보다 높게 채워집니다. 이 문제를 해결하려면 :

heightForHeaderInSection을 다음과 같이 구현하십시오.

  override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 30.0 // Or whatever height you want!
  }

4

Leo Natan의 신속한 4 버전 답변 입니다

UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)

사용자 정의 글꼴을 설정하려면 사용할 수 있습니다

if let font = UIFont(name: "font-name", size: 12) {
    UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = font
}

불행히도 프레임 크기는 조정되지 않습니다.
nickdnk

3

이 방법을 사용하면 글꼴 크기, 글꼴 스타일 및 머리글 배경 도 설정할 수 있습니다. 이 방법에는 2 가지가 있습니다

첫 번째 방법

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section{
        UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
        header.backgroundView.backgroundColor = [UIColor darkGrayColor];
        header.textLabel.font=[UIFont fontWithName:@"Open Sans-Regular" size:12];
        [header.textLabel setTextColor:[UIColor whiteColor]];
    }

두 번째 방법

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 30)];
//    myLabel.frame = CGRectMake(20, 8, 320, 20);
    myLabel.font = [UIFont fontWithName:@"Open Sans-Regular" size:12];
    myLabel.text = [NSString stringWithFormat:@"   %@",[self tableView:FilterSearchTable titleForHeaderInSection:section]];

    myLabel.backgroundColor=[UIColor blueColor];
    myLabel.textColor=[UIColor whiteColor];
    UIView *headerView = [[UIView alloc] init];
    [headerView addSubview:myLabel];
    return headerView;
}

1

스위프트 2 :

OP가 요청한대로 시스템 굵은 글꼴 또는 기타로 설정하지 말고 크기 조정하십시오.

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        if let headerView = view as? UITableViewHeaderFooterView, textLabel = headerView.textLabel {

            let newSize = CGFloat(16)
            let fontName = textLabel.font.fontName
            textLabel.font = UIFont(name: fontName, size: newSize)
        }
    }

0

이것은 신속한 5 솔루션입니다.

헤더 섹션보기를 완전히 제어하려면 이전 게시물에서 보여준 것처럼 컨트롤러에서 tableView (: viewForHeaderInsection : :) 메소드를 사용해야합니다. 그러나 성능을 향상 시키려면 매번 새 뷰를 생성하지 말고 테이블 셀 재사용과 같이 헤더 뷰를 재사용하는 것이 좋습니다. 이것은 tableView.dequeueReusableHeaderFooterView (withIdentifier :) 메소드에 의한 것입니다. 그러나 내가 가진 문제는 일단이 재사용 기능을 사용하기 시작하면 글꼴이 예상대로 작동하지 않는다는 것입니다. 색상, 정렬, 미세하지만 글꼴과 같은 다른 것들. 몇 가지 토론이 있지만 다음과 같이 작동하게했습니다.

문제는 tableView.dequeueReusableHeaderFooterView (withIdentifier :)는 항상 셀을 반환하는 tableView.dequeneReuseCell (:)과 다릅니다. 사용 가능한 사람이 없으면 전자는 nil을 반환합니다. 재사용 헤더보기를 리턴하더라도 원래 클래스 유형이 아니라 UITableHeaderFooterView입니다. 따라서 판단을 내리고 자신의 코드에 따라 행동해야합니다. 기본적으로, 그것이 없으면 새로운 헤더보기를 얻으십시오. 0이 아닌 경우 강제로 캐스팅하여 제어 할 수 있습니다.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let reuse_header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "yourHeaderID")
        if (reuse_header == nil) {
            let new_sec_header = YourTableHeaderViewClass(reuseIdentifier:"yourHeaderID")
            new_section_header.label.text="yourHeaderString"
            //do whatever to set color. alignment, etc to the label view property
            //note: the label property here should be your custom label view. Not the build-in labelView. This way you have total control.
            return new_section_header
        }
        else {
            let new_section_header = reuse_section_header as! yourTableHeaderViewClass
            new_sec_header.label.text="yourHeaderString"
            //do whatever color, alignment, etc to the label property
            return new_sec_header}

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