programing

UITableView 헤더 섹션 커스터마이즈

lastmoon 2023. 4. 17. 22:17
반응형

UITableView 헤더 섹션 커스터마이즈

커스터마이즈하고 UITableView각 섹션의 헤더., 는는을 했습니다.

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

★★★★★★★★★★★★★★★★★」UITabelViewDelegate 그냥 '헤더'를 추가하는 입니다.UILabel서브뷰로서

아직까지는 그렇게 할 수 없어요.기본 섹션 헤더를 가져올 항목을 찾을 수 없었기 때문입니다.첫 번째 질문, 기본 섹션 헤더를 얻을있는 방법은 없나요?

않으면 .UIView하지만 이번에는 기본 배경색, 섀도색 등을 설정해야 합니다.왜냐하면 섹션의 헤더를 자세히 살펴보면 이미 커스터마이즈되어 있기 때문입니다.

각 섹션 헤더에 대해 이러한 기본값을 얻으려면 어떻게 해야 합니까?

다음과 같이 시험해 보십시오.

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

" " 를 :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;
}

로차나 테하스의 빠른 버전 답변:

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
}

기본 헤더 뷰를 사용하는 경우 이 뷰의 텍스트를 변경할 수 있는 것은

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

Swift의 경우:

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

보기를 사용자 정의하려면 사용자가 직접 새 보기를 만들어야 합니다.

UITable View를 사용하지 않는 이유HeaderFooterView?

If 헤더InSection이 표시되지 않습니다. 시도해 보십시오.

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

지정된 섹션의 헤더 높이를 반환합니다.

Swift 3 버전의 locana와 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;
}

다른 답변은 기본 헤더 보기를 다시 만들 수 있지만, 실제로 주요 질문에 답하지는 않습니다.

디폴트 섹션 헤더를 얻을 수 있는 방법이 있습니까?

방법이 있습니다. 딜러에게 실행하기만 하면 됩니다.디폴트 헤더뷰는 두 번째 파라미터로 넘어갑니다.이 파라미터에서 서브뷰를 에 캐스팅하여 필요에 따라 서브뷰를 추가하거나 변경할 수 있습니다.

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
}

이거 먹어봐...

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
}

이것이 가능한 가장 쉬운 해결책입니다.커스텀 섹션헤더를 작성하기 위해 다음 코드를 직접 사용할 수 있습니다.

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

메모: 섹션HeaderTableViewCell은 Storyboard에서 작성된 커스텀 UITableViewCell입니다.

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

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

스토리보드에 첫 번째 "그룹화"를 설정합니다.이 작업은 초기화 시 수행되어야 하며 나중에 설정할 수 없으므로 스토리보드에서 실행하는 것을 기억하기가 쉽습니다.

여기에 이미지 설명 입력

다음 분.

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

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

버그가 있는데, 동안 이 없으면 첫 헤더 0이 버그는 첫 번째 헤더(인덱스 0)를 표시하지 않을 뿐입니다.heightForHeaderInSectiondiscl.discl.discl을 클릭합니다.

so,는,tableView.sectionHeaderHeight = 70그냥 작동하지 않아요, 고장났어요.

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

»viewForHeaderInSectionUIView()를 사용합니다.

iOS는 표에 따라 뷰 크기를 설정하기만 하면 되기 때문에 UIView(프레임...)를 사용해도 의미가 없습니다.

이 첫 요.viewForHeaderInSectionlet 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의 또 다른 "fussy" 문제입니다.


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

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

제가 당신이라면, NSString이 주어지면 UIView를 반환하는 방법을 만들겠습니다.예를들면

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

이 메서드에서는 UIView를 작성할 때 설정할 속성을 지정하여 UILabel을 추가합니다.이 메서드의 제목은 당연히 지정된 속성으로 설정됩니다.

@samwise의 Swift 솔루션(그러니 그를 밀어주세요!)헤더/풋터 섹션에도 동일한 재활용 메커니즘을 사용하여 뛰어난 성능을 발휘합니다.

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

    return settingsHeaderSectionCell
}
- (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 글꼴을 변경하려면 willDisplay에서 변경합니다.Header View(헤더 뷰)텍스트를 설정하려면 viewForHeaderInSection 또는 titleForHeaderInSection에서 설정할 수 있습니다.행운을 빕니다.

테이블 뷰 헤더를 마법처럼 빠르게 추가

얼마 전에 해봤어요.

UITableView 전체에 헤더가 1개만 필요했습니다.

TableView 상단에 UIImageView를 원하는 것처럼.그래서 UITableViewCell 위에 UIImageView를 추가하면 자동으로 테이블로 추가됩니다.View헤더. 이제 ImageView를 ViewController에 연결하고 이미지를 추가합니다.

이런 거 처음 해봐서 헷갈렸어요.혼란을 해소하기 위해 MainStoryBoard의 xml 형식을 열어보니 Image View가 헤더로 추가되었습니다.

그것은 나에게 효과가 있었다.xCode와 신속한 대응 감사합니다.

이 위임 메서드를 호출합니다.

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

return @"Some Title";
}

그러면 동적 제목을 가진 기본 헤더를 자동으로 추가할 수 있습니다.

재사용 가능한 커스터마이즈 가능한 머리글/바닥글을 사용할 수 있습니다.

https://github.com/sourov2008/UITableViewCustomHeaderFooterSection

스위프 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
    }
}

titleForHeaderInSection 외에도 머리글, 바닥글 보기를 변경할 수 있습니다.여기서 코멘트 확인: 섹션 제목 손실 없이 UITable 섹션 backgroundColor

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
}

배열을 구현하여 헤더의 제목을 가져올 수 있습니다.

원래 질문(4년 후)으로 돌아가서 iOS는 자신의 섹션 헤더를 재구축하는 것이 아니라 기본 섹션 헤더를 구축한 직후에 (will Display Header View:for Section:를 사용하여) 사용자에게 전화를 걸 수 있습니다.예를 들어 섹션 헤더의 오른쪽 끝에 그래프 버튼을 추가하려고 합니다.

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

사용하다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];
}

스위프트 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
    }

Swift 5의 코드

이를 구현하려면 tableView 위임 함수를 2개 사용합니다.

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인 라벨 및 버튼이 생성됩니다.

언급URL : https://stackoverflow.com/questions/15611374/customize-uitableview-header-section

반응형