Làm cách nào để đặt chiều cao của tiêu đề bảng trong UITableView?


77

Tôi đã xem qua tài liệu của Apple về lớp UITableView và tham chiếu ủy quyền nhưng không thể tìm thấy cách đặt chiều cao tiêu đề bảng một cách rõ ràng.

Tôi đặt chiều cao ô Bảng bằng cách sử dụng đại biểu sau:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

và đặt chiều cao đầu trang / chân trang của phần bằng cách sử dụng các đại diện sau.

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

Bất cứ ai có thể vui lòng giúp tôi đặt chiều cao đầu trang / chân trang của bảng được không?

Cảm ơn.


1
nó không hoạt động nếu bạn trả về 0; nhưng khi tôi trở 0.1f nó không làm việc cho tôi
igrek

Câu trả lời:


65

Chỉ cần đặt thuộc tính khung của tableHeaderView.


Tôi đã làm điều đó. Tôi đặt hình ảnh của mình thành tableheaderview. Tôi không thể thay đổi chiều cao của tiêu đề bảng. Vấn đề là kích thước HeaderImaze là 640x88 và nó được thay đổi tỷ lệ 320x88 đó là sai vì vậy tôi muốn thiết lập chiều cao tiêu đề bàn của tôi đến 44 khi độ phân giải hình ảnh định chiều rộng là 640.
applefreak

1
Xin chào Roger, tôi nghĩ ý tưởng của bạn sẽ thành công. Tôi đã cố gắng đặt thuộc tính khung bằng cách sử dụng "trơnTableView.tableHeaderView.frame = CGRectMake (0,0,320,44);" Nhưng không có gì xảy ra. Xin lưu ý rằng kích thước hình ảnh của tôi là 640x88 và tôi đang gán nó cho tableHeaderView.
applefreak

Sau đây làm việc cho tôi. Tôi không thể thay đổi chiều cao bảng nhưng tôi đã đặt lại chiều cao hình ảnh. if (headerImage.bounds.size.width == 640) [headerImage setFrame: CGRectMake (0, 0, headerImage.bounds.size.width, headerImage.bounds.size.height / 2)];
applefreak

62

Tôi đã tìm thấy một bản hack hay. Thêm dòng bên dưới sau khi sửa đổi khung đề xuất

self.tableView.tableHeaderView = self.tableView.tableHeaderView;

Bí quyết là (tôi nghĩ) UITableView đang lưu vào bộ nhớ đệm chiều cao (thực tế là khung) khi bạn gán chế độ xem cho thuộc tính tableHeaderView. Dòng trên chỉ gán lại chiều cao.


Tuy nhiên, nếu bạn cố gắng làm sinh động sự thay đổi, nó dường như chỉ hoạt động theo hướng thu hẹp.
Gujamin

1
Hoạt hình hay không, đây là giải pháp nhanh nhất. Hoàn hảo :)
iPhoneNoob

Không thể tin rằng đây là giải pháp! Nó hoạt động để làm cho tiêu đề nhỏ hơn và lớn hơn. Đối với Swift tôi đang làm - tableView.tableHeaderView .frame = CGRectMake (0, 0, self.view.frame.size.width, 100) tableView.tableHeaderView = self.tableView.tableHeaderView
Michael McKenna

39
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    sizeHeaderToFit()
}

private func sizeHeaderToFit() {
    let headerView = tableView.tableHeaderView!

    headerView.setNeedsLayout()
    headerView.layoutIfNeeded()

    let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
    var frame = headerView.frame
    frame.size.height = height
    headerView.frame = frame

    tableView.tableHeaderView = headerView
}

Thông tin chi tiết có thể được tìm thấy tại đây


1
Tuyệt vời. Rất cảm ơn Kris. Chức năng của bạn vẫn hoạt động tốt trong viewDidAppear. Nó sẽ tốt hơn viewDidLayoutSubviews được gọi nhiều lần.
truongky 24/11/16

1
@truongky Không, viewDidLayoutSubviews sẽ hoạt động như xoay hoặc thay đổi kích thước cửa sổ (ví dụ chia đôi màn hình iPad), những gì muốn thay đổi kích thước sau nó, viewWill / DidAppear sẽ không bao giờ cập nhật nó và nó sẽ trông sai.
Vive

2
Đây là kết quả trong một đóng băng do vòng bố trí bất tận đối với tôi như iOS 12,4
Trev14

10

Trong trường hợp bạn vẫn cần nó, bạn đã thử đặt thuộc tính chưa

self.tableView.tableHeaderView 

Nếu bạn tính toán chiều cao bạn cần và đặt chế độ xem mới cho tableHeaderView:

CGRect frame = self.tableView.tableHeaderView.frame;
frame.size.height = newHeight;

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:frame];

Nó sẽ hoạt động.


7

Nó chỉ hoạt động với tôi nếu tôi đặt footer / header của tableview thành nil trước:

self.footer = self.searchTableView.tableFooterView;
CGRect frame = self.footer.frame;
frame.size.height = 200;
self.footer.frame = frame;
self.searchTableView.tableFooterView = nil;
self.searchTableView.tableFooterView = self.footer;

Đảm bảo rằng self.footer là một tham chiếu mạnh để ngăn chế độ xem chân trang bị phân bổ


self.searchTableView.tableFooterView = self.searchTableView.tableFooterView;hoạt động tốt.
superarts.org

4

Swift 4 - bạn có thể quản lý chiều cao với HEIGHT_VIEW, Chỉ cần thêm mã này, Nó hoạt động

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let HEIGHT_VIEW = 60
    tableView.tableFooterView?.frame.size = CGSize(width: tblView.frame.width, height: CGFloat(HEIGHT_VIEW))

    tableView.tableHeaderView?.frame.size = CGSize(width:tblView.frame.width, height: CGFloat(HEIGHT_VIEW))
}

Câu trả lời hay nhất
Michał Ziobro

2
Giải pháp tốt, nhưng "tblView" đó là một cú đấm vào mắt! : 'D
Alessandro Francucci

2

Chỉ cần tạo Footer Wrapper View bằng cách sử dụng constructor, UIView(frame:_) sau đó nếu bạn đang sử dụng tệp xib cho FooterView, hãy tạo dạng xem từ xib và thêm dưới dạng subView vào dạng xem wrapper. sau đó gán trình bao bọc cho tableView.tableFooterView = fixWrapper.

    let fixWrapper = UIView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 54)) // dont remove
    let footer = UIView.viewFromNib("YourViewXibFileName") as! YourViewClassName
    fixWrapper.addSubview(footer)
    tableView.tableFooterView = fixWrapper
    tableFootterCostView = footer

Nó hoạt động hoàn hảo cho tôi! vấn đề là tạo dạng xem chân trang với hàm tạo (frame:_). Mặc dù bạn tạo UIView () và gán thuộc tính khung, nó có thể không hoạt động.


2

Nếu thêm dạng xem làm dạng xem tiêu đề bảng trong IB, hãy đặt khung của dạng xem đó trong IB trong Tab 5 (trình kiểm tra kích thước)


1

Nếu bạn đang sử dụng XIB cho tiêu đề chính của tableView, bạn có thể đặt XIB làm dạng tự do, đặt Chiều cao như bạn muốn và bỏ nhấp vào các khối trên cùng, dưới cùng và mũi tên trên, dưới của Tự động kích thước. Chỉ các phần ngang sẽ được chọn. Dọc sẽ không được chọn như tôi đã đề cập ở trên .


1

Bạn có thể tạo một UIView với chiều cao mong muốn (chiều rộng phải là của UITableView) và bên trong nó, bạn có thể đặt một UIImageView với hình ảnh có kích thước thích hợp: chúng sẽ không tự động kéo dài.

Bạn cũng có thể đặt lề trên và dưới UIImageView bên trong, bằng cách đặt chiều cao hơn cho chế độ xem vùng chứa.

Ngoài ra, bạn có thể chỉ định một biến đổi Bản dịch để đặt hình ảnh ở giữa chế độ xem tiêu đề vùng chứa của nó chẳng hạn.


1

Nếu bạn đặt theo chương trình tableHeaderView, thì chỉ cần đặt nó bên trong viewDidLayoutSubviews.

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        setupTableViewHeader()
    }

    private func setupTableViewHeader() {
        // Something you do to set it up programatically...
        tableView.tableHeaderView = MyHeaderView.instanceFromNib() 
    }

Nếu bạn không đặt nó theo chương trình, bạn cần làm tương tự như những gì @Kris đã trả lời dựa trên liên kết này

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        sizeHeaderToFit()
    }

    private func sizeHeaderToFit() {
        if let headerView = tableView.tableHeaderView {
            headerView.setNeedsLayout()
            headerView.layoutIfNeeded()

            let height = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
            var frame = headerView.frame
            frame.size.height = height
            headerView.frame = frame

            tableView.tableHeaderView = headerView
        }
    }


1

Câu trả lời @kris rất hữu ích cho tôi, bất cứ ai muốn nó trong Objective-C.

Đây là mã

-(void)viewDidLayoutSubviews{
     [super viewDidLayoutSubviews];
     [self sizeHeaderToFit];
}

-(void)sizeHeaderToFit{
     UIView *headerView = self.tableView.tableHeaderView;
     [headerView setNeedsLayout];
     [headerView layoutIfNeeded];
     CGFloat height = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
     CGRect frame = headerView.frame;
     frame.size.height = height;
     headerView.frame = frame;
     self.tableView.tableHeaderView = headerView;
}

0

Trong Xcode 10, bạn có thể đặt đầu trang và chân trang của phần cao từ tab "Trình kiểm tra kích thước"

Tiêu đề Trình kiểm tra kích thước


-1

Với autolayout, bạn có thể làm điều gì đó như:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = <your-header-height>

hoặc nếu tiêu đề của bạn có độ cao khác nhau, hãy tiếp tục và triển khai:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return <your-header-height>
}

OP đã yêu cầu tiêu đề tableView, không phải tiêu đề phần;)
Climbatize

-1

Nếu bạn đã thay đổi chiều cao của headerView của tableView, chỉ cần đặt lại khung của headerView, sau đó đặt lại headerView của tableView:

self.headerView.frame = newFrame;
self.tableView.tableHeaderView = self.headerView;

Điều này làm nhiều hơn yêu cầu. Đừng sử dụng nó cho một nhiệm vụ đơn giản như vậy. SetNeedsLayout đơn giản là đủ trong trường hợp bạn đang mô tả.
Vive

-2

Sử dụng thuộc tính mặc định của chế độ xem bảng:

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

Cảm ơn


1
Không, nó không hoạt động. Tôi đã thử nó. Nó chỉ thay đổi kích thước cho đầu trang / chân trang của phần chứ không chỉ cho đầu trang / chân trang của bảng. Tui bỏ lỡ điều gì vậy?
applefreak

42
Chúng tôi không thảo luận về tiêu đề SEction. đó là về tableView tiêu đề
iSaalis

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

hoặc bạn cũng có thể sử dụng như thế này

tableView.estimatedSectionHeaderHeight 

Chúng tôi không thảo luận về tiêu đề SEction. nó là về tiêu đề tableView
Arthur Garza

Tôi sử dụng đầu trang và chân trang của phần làm đầu trang và chân trang cho bảng. Vì vậy, điều này là hợp lệ cho tôi và hữu ích. Tôi thấy nó dễ dàng hơn các giải pháp khác.
David J
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.