Có thể tắt các tiêu đề nổi trong UITableView bằng UITableViewStylePlain không?


177

Tôi đang sử dụng UITableViewđể bố trí nội dung 'trang'. Tôi đang sử dụng các tiêu đề của chế độ xem bảng để bố trí một số hình ảnh nhất định, v.v. và tôi thích nó hơn nếu chúng không nổi mà vẫn tĩnh khi chúng được đặt thành kiểu UITableViewStyleGrouped.

Khác sau đó sử dụng UITableViewStyleGrouped, có cách nào để làm điều này? Tôi muốn tránh sử dụng được nhóm lại vì nó thêm một lề xuống tất cả các ô của tôi và yêu cầu vô hiệu hóa chế độ xem nền cho từng ô. Tôi muốn kiểm soát hoàn toàn bố cục của mình. Lý tưởng nhất là "UITableViewStyleBareBones", nhưng tôi không thấy tùy chọn đó trong tài liệu ...

Cảm ơn nhiều,



59
Sử dụng kiểu bảng UITableViewStylegrouped - đây là câu trả lời cho tất cả những ai đang tìm cách vô hiệu hóa các tiêu đề nổi và không đọc toàn bộ câu hỏi (nó đã xảy ra với tôi ...).
trung bình Joe

@Kasztan Đây là một giải pháp dòng không hoạt động tuyệt vời! Cảm ơn.
Lee Fastenau 13/03/2015

Câu trả lời:


27

Bạn sẽ có thể giả mạo điều này bằng cách sử dụng một ô tùy chỉnh để thực hiện các hàng tiêu đề của bạn. Chúng sẽ cuộn giống như bất kỳ ô nào khác trong chế độ xem bảng.

Bạn chỉ cần thêm một số logic trong của bạn cellForRowAtIndexPathđể trả về đúng loại ô khi nó là một hàng tiêu đề.

Có lẽ bạn sẽ phải tự quản lý các phần của mình, tức là có mọi thứ trong một phần và giả mạo các tiêu đề. (Bạn cũng có thể thử trả về chế độ xem ẩn cho chế độ xem tiêu đề, nhưng tôi không biết điều đó có hiệu quả không)


11
Vâng ... có vẻ như một chút hack. Điều này có vẻ như là một phần giám sát của Apple, vì rõ ràng mã ở đó để làm điều đó, chúng ta chỉ cần có thể đặt cờ.
Tricky

2
Kiểm tra câu trả lời của tôi dưới đây để biết cách chính xác để đạt được hiệu quả mà không cần bất kỳ hack đặc biệt nào, chỉ cần quản lý ô đầu tiên của mỗi phần làm tiêu đề phần của nó!
Sumit Anantwar

338

Một cách có lẽ dễ dàng hơn để đạt được điều này:

Mục tiêu-C:

CGFloat dummyViewHeight = 40;
UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, dummyViewHeight)];
self.tableView.tableHeaderView = dummyView;
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0);

Nhanh:

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

Phần tiêu đề bây giờ sẽ cuộn giống như bất kỳ ô thông thường.


5
Friggin này hoạt động như một bùa mê !! Sự hiện diện của tiêu đề xem tiêu đề bảng sẽ ngăn các tiêu đề phần nổi. Và một tiêu đề vô hình với nội dung phù hợp cho bảng thực hiện mẹo .. Cảm ơn bạn rất nhiều! tự hỏi tại sao câu trả lời này không được chú ý nhiều
Shyam Bhat

4
Vẫn không tin! Không có API riêng, không đào sâu vào các lớp, không có gì! Tôi đã phải đối mặt với vấn đề này từ lâu và đã thêm các chế độ xem bảng trên đầu các chế độ xem cuộn (với tính năng cuộn bảng xem bị tắt), điều này sẽ làm cho các tiêu đề bảng cuộn bình thường. nhưng chỉ bắt đầu tìm kiếm nếu apple cung cấp bất kỳ phương pháp mới nào gần đây để khắc phục điều này .. rất vui vì tôi đã vấp phải câu trả lời của bạn. cảm ơn một lần nữa
Shyam Bhat

13
nhược điểm duy nhất tôi thấy là tiêu đề hàng đầu sẽ không được hiển thị nữa (bạn chỉ có thể nhìn thấy nó thông qua cuộn lên). Ít nhất với tôi nó không được hiển thị
Ruzard

5
Bạn vẫn có thể hiển thị bảngHeadView của bảng bằng cách tăng chiều cao của nó lên trên cùng, bằng một số bằng chiều cao của tiêu đề phần và giảm nội dung bên trong cùng một số.
Shyam Bhat

2
Tôi ước tôi có thể nâng cao điều này một lần nữa, tôi khá chắc chắn rằng đây ít nhất là lần thứ ba tôi kết thúc câu hỏi này và điều này đã giải quyết vấn đề của tôi.
Ell Neal

252

(Dành cho những người từng đến đây do kiểu bảng sai) Thay đổi kiểu Bảng từ đơn giản sang được nhóm, thông qua trình kiểm tra thuộc tính hoặc qua mã:

let tableView = UITableView(frame: .zero, style: .grouped)

3
Điều này thật đúng với gì mà tôi đã tìm kiếm. Cảm ơn!
ninjudd

4
"Khác sau đó sử dụng UITableViewStylegrouped, có cách nào để làm điều này không?"
Michael Peterson

27
Thật tốt là tôi đã học cách kiểm tra tất cả các câu trả lời trước khi thực hiện câu trả lời được đánh giá cao nhất :)
Tung Fam

1
Bây giờ những người này, là câu trả lời bạn đang tìm kiếm. Xin lưu ý rằng bạn cũng có thể tìm thấy thuộc TableView Styletính trong AttributionInspector.
Cristian Holdunu

4
Câu hỏi đặc biệt đề cập đến việc tìm kiếm một cách "Khác sau đó sử dụng UITableViewStylegrouped"
Ferdz

73

CẢNH BÁO : giải pháp này thực hiện một phương thức API dành riêng. Điều này có thể ngăn ứng dụng được Apple chấp thuận phân phối trên AppStore.

Tôi đã mô tả các phương thức riêng mà lần lượt các tiêu đề phần nổi trong blog của tôi

Về cơ bản, bạn chỉ cần phân lớp UITableViewvà trả về NOhai phương thức của nó:

- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;

40
Một câu trả lời không xứng đáng với một downvote chỉ vì nó tham chiếu các API riêng tư (không phải ai cũng đang viết mã để được gửi đến AppStore). Điều này là đúng gấp đôi khi câu trả lời xảy ra là chính xác. Phân lớp (hoặc, dễ dàng hơn, tạo danh mục UITableView) trả về NO cho các phương thức này ngăn các tiêu đề nổi. Nếu bạn muốn thấy điều này thêm vào như là một API công cộng, vui lòng gửi một báo cáo lỗi: bugreport.apple.com
jemmons

5
Nếu chúng tôi triển khai chức năng đó trong Ứng dụng, Apple sẽ nhận ra bạn đang sử dụng API riêng như thế nào? Từ tất cả những gì họ biết, tôi chỉ thực hiện một phương thức trong một lớp con của UITableView và họ thậm chí không thể thấy điều đó nếu không lắp ráp mã, và nó sẽ không dễ dàng như vậy. Nó không GỌI một phương thức trong một API riêng, nó chỉ thực hiện một phương thức ....
Javier Soto

3
@jemmons nếu bạn không muốn tôi đánh giá thấp câu trả lời của bạn đánh dấu là "API riêng được sử dụng ở đây". Loại từ chối trách nhiệm :)
kas-kad

2
Liên kết "blog của tôi" của bạn bị hỏng
MartinMoizard

12
@jemmons "không phải ai cũng viết mã để gửi tới AppStore" Appstore không thực sự là vấn đề. Vấn đề là apple có thể thay đổi các API riêng mà không liên lạc hoặc phản đối sẽ làm hỏng ứng dụng của bạn. Đó là lý do tốt hơn về lý do tại sao bạn không nên sử dụng API riêng tư hơn là bị Apple từ chối
aryaxt

29

Ok, tôi biết là muộn nhưng tôi phải làm điều đó. Tôi đã dành 10 giờ để tìm kiếm một giải pháp làm việc nhưng không tìm thấy câu trả lời hoàn chỉnh. Đã tìm thấy một số gợi ý nhưng khó khăn cho người mới bắt đầu để hiểu. Vì vậy, tôi đã phải đặt 2 xu của mình và hoàn thành câu trả lời.

Như đã được đề xuất trong một vài câu trả lời, giải pháp làm việc duy nhất mà tôi có thể thực hiện là bằng cách chèn các ô bình thường vào chế độ xem bảng và xử lý chúng dưới dạng Tiêu đề Mục, nhưng cách tốt hơn để đạt được là bằng cách chèn các ô này vào hàng 0 của mỗi phần. Bằng cách này, chúng ta có thể xử lý các tiêu đề không nổi tùy chỉnh này rất dễ dàng.

Vì vậy, các bước là.

  1. Triển khai UITableView với kiểu UITableViewStylePlain.

    -(void) loadView
    {
        [super loadView];
    
        UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
        tblView.delegate=self;
        tblView.dataSource=self;
        tblView.tag=2;
        tblView.backgroundColor=[UIColor clearColor];
        tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
  2. Triển khai titleForHeaderInSection như bình thường (bạn có thể nhận được giá trị này bằng cách sử dụng logic của riêng bạn, nhưng tôi thích sử dụng các đại biểu tiêu chuẩn).

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. Thực hiện sốOfSectionsInTableView như bình thường

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. Triển khai numberOfRowsInSection như bình thường.

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    {
        int rowCount = [[cellArray objectAtIndex:section] count];
        return rowCount +1; //+1 for the extra row which we will fake for the Section Header
    }
  5. Trả về 0,0f trong heightForHeaderInSection.

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.0f;
    }
  6. KHÔNG thực hiện viewForHeaderInSection. Loại bỏ hoàn toàn phương pháp thay vì trả về con số không.

  7. Trong heightForRowAtIndexPath. Kiểm tra xem (indexpath.row == 0) và trả về chiều cao ô mong muốn cho tiêu đề của phần, phần khác trả về chiều cao của ô.

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row == 0)
        {
            return 80; //Height for the section header
        }
        else
        {
            return 70; //Height for the normal cell
        }
    }
  8. Bây giờ trong cellForRowAtIndexPath, hãy kiểm tra xem (indexpath.row == 0) và triển khai ô như bạn muốn tiêu đề phần là và đặt kiểu chọn thành không. ELSE triển khai ô như bạn muốn ô bình thường.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
            if (cell == nil)
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
    
                cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
            }
    
            cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
    
            return cell;
        }
        else
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
    
                cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
                cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
            }
    
            cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
    
            return cell;
        }
    }
  9. Bây giờ triển khai willSelectRowAtIndexPath và trả về nil nếu indexpath.row == 0. Điều này sẽ quan tâm rằng didSelectRowAtIndexPath không bao giờ bị sa thải cho hàng tiêu đề Mục.

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return nil;
        }
    
        return indexPath;
    }
  10. Và cuối cùng trong didSelectRowAtIndexPath, kiểm tra xem (indexpath.row! = 0) và tiếp tục.

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row != 0)
        {
            int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
    
            //Do what ever you want the selection to perform
        }
    }

Với điều này bạn đã hoàn thành. Bây giờ bạn có một tiêu đề phần không cuộn hoàn toàn cuộn.


1
Đã triển khai 'willSelectRowAtIndexPath' để điều khiển không bao giờ đạt đến 'didSelectRowAtIndexPath' khi chọn hàng Header.
Sumit Anantwar

Trên thực tế, tôi gấp + mở ra các hàng khi tiêu đề được chọn. Nhưng thật tốt khi biết bạn có thể làm điều đó
Yariv Nissim

Câu trả lời tuyệt vời, nhưng tại sao 'if (indexPath.row! = 0)' kiểm tra 'didSelectRowAtIndexPath'? Có phải chỉ để được an toàn hơn? Hàng không bao giờ có thể là 0 với triển khai 'willSelectRowAtIndexPath' của bạn, phải không?
Glenn85

1
@ Glenn85, Xin lỗi vì đã trả lời trễ. Vâng, nó chỉ là cho một bảo mật thêm.
Sumit Anantwar

28

Trong Trình tạo giao diện, nhấp vào vấn đề Bảng xem của bạn

xem bảng vấn đề

Sau đó điều hướng đến Trình theo dõi thuộc tính và thay đổi Kiểu đơn giản thành Nhóm;) Dễ dàng

dễ dàng


17

Điều thú vị về UITableViewStylegrouped là tableView thêm kiểu vào các ô chứ không phải cho TableView.

Kiểu được thêm dưới dạng backgroundView vào các ô dưới dạng một lớp có tên là UIGroupTableViewCellBackground, xử lý vẽ nền khác nhau theo vị trí của ô trong phần.

Vì vậy, một giải pháp rất đơn giản sẽ là sử dụng UITableViewStylegrouped, đặt nềnColor của bảng thành ClearColor và chỉ cần thay thế nềnView của ô trong cellForRow:

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];

1
Đây phải là câu trả lời hàng đầu. Có một bài viết về nó ở đây: corecocoa.wordpress.com/2011/09/17/ trên
Sam

Giải pháp này không thực sự hiệu quả. Tôi tiếp tục có thêm một không gian xung quanh tại các tế bào xung quanh. Bất kỳ ý tưởng ?
gsempe

2
Không phải nội dungView của các ô vẫn được chuyển sang phải?
Piotr Tomasik

15

Thay đổi kiểu xem bảng của bạn:

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

Theo tài liệu táo cho UITableView:

UITableViewStylePlain- Chế độ xem bảng đơn giản. Bất kỳ tiêu đề hoặc chân trang phần nào được hiển thị dưới dạng dấu tách dòng và nổi khi chế độ xem bảng được cuộn.

UITableViewStylegrouped- Một khung nhìn bảng có các phần thể hiện các nhóm hàng khác nhau. Các phần đầu trang và chân trang không nổi.


5

Có một cách khó khăn khác. Ý tưởng chính là nhân đôi số phần và phần thứ nhất chỉ hiển thị phần tiêu đề trong khi phần thứ hai hiển thị các ô thực.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }
    return _rowCount;
}

Điều cần làm sau đó là triển khai các đại biểu headerInSection:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerview;
    }
    return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerheight;
    }
    return 0;
}

Cách tiếp cận này cũng có ít tác động đến các nguồn dữ liệu của bạn:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int real_section = (int)indexPath.section / 2;
    //your code
}

So sánh với các phương pháp khác, cách này an toàn trong khi không thay đổi khung hoặc nội dung. Hy vọng điều này có thể giúp đỡ.


5

Cách dễ nhất để có được những gì bạn muốn là đặt kiểu bảng của bạn là UITableViewStyleGrouped, kiểu phân cách là UITableViewCellSeparatorStyleNone:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN; // return 0.01f; would work same 
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

Đừng thử xem lại chân trang dưới dạng nil, đừng quên đặt chiều cao tiêu đề và chế độ xem tiêu đề, sau khi bạn phải có được những gì bạn muốn.


4

Mặc dù điều này có thể không giải quyết được vấn đề của bạn, nhưng nó đã làm cho tôi khi tôi muốn làm một điều tương tự. Thay vì đặt tiêu đề, tôi sử dụng chân trang của phần trên. Điều đã cứu tôi là phần này nhỏ và tĩnh trong tự nhiên, vì vậy nó không bao giờ cuộn xuống dưới đáy của chế độ xem.


Ý tưởng tuyệt vời. Tôi thích bản hack này.
Steve Moser

hơi buồn cười đánh giá cao ý tưởng, nhưng hack là một hack. các tiêu đề sẽ bắt đầu nổi ở phía dưới vì vậy không thực sự giải quyết được vấn đề
Shyam Bhat

4

Dành cho Swift 3+

Chỉ cần sử dụng UITableViewStyleGroupedvà đặt chiều cao của chân thành 0 bằng cách sau:

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

1
Bạn có thể trả về 0 thay vì .leastNormalMagnitude. Ngoài ra bạn cần thực hiệntableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
Ilias Karim

@IliasKarim Đặt nó thành 0 giúp nó có chiều cao khác không. Ngoài ra, không cần thiết phải thực hiện viewForFooterInSectionchức năng trong trường hợp này.
Tamás Sengel

0.leastNormalMagnitudecó tác dụng tương tự. Thực hiện viewForFooterSectionphương pháp là cần thiết. Bạn nên trở về con số không. Đây là trên Swift 5.1 với Xcode 11.3.1.
Ilias Karim

3

Trong khi suy nghĩ làm thế nào để tiếp cận vấn đề này, tôi đã nhớ một chi tiết rất quan trọng về UITableViewStylegrouped. Cách UITableView thực hiện kiểu được nhóm (các đường viền tròn xung quanh các ô) là bằng cách thêm một nền tảng tùy chỉnh vào UITableViewCells chứ không phải cho UITableView. Mỗi ô được thêm một nền Xem theo vị trí của nó trong phần (các hàng trên lấy phần trên của đường viền của phần, các ô ở giữa có đường viền bên và phần dưới cùng được - tốt, phần dưới cùng). Vì vậy, nếu chúng ta chỉ muốn một kiểu đơn giản và chúng ta không có chế độ xem nền tùy chỉnh cho các ô của mình (đó là trường hợp trong 90% số lần), thì tất cả những gì chúng ta cần làm là sử dụng UITableViewStylegrouped và xóa nền tùy chỉnh . Điều này có thể được thực hiện bằng cách làm theo hai bước sau:

Thay đổi kiểu xem bảng của chúng tôi thành UITableViewStylegrouped Thêm dòng sau vào cellForRow, ngay trước khi chúng tôi trả lại ô:

cell.backgroundView = [[[UIView alloc] initWithFrame: cell.bound] autorelease];

Và đó là nó. Kiểu bảngView sẽ trở nên giống hệt như UITableViewStylePlain, ngoại trừ các tiêu đề nổi.

Hi vọng điêu nay co ich!


2

Có lẽ bạn có thể sử dụng scrollViewDidScrolltrên bảngView và thay đổi contentInsetdựa trên tiêu đề hiển thị hiện tại.

Nó dường như làm việc cho trường hợp sử dụng của tôi!

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard   let tableView = scrollView as? UITableView,
            let visible = tableView.indexPathsForVisibleRows,
            let first = visible.first else {
            return
        }

        let headerHeight = tableView.rectForHeader(inSection: first.section).size.height
        let offset =  max(min(0, -tableView.contentOffset.y), -headerHeight)
        self.tableView.contentInset = UIEdgeInsetsMake(offset, 0, -offset, 0)
   }
}

1

Một cách khác để làm điều đó là tạo một phần trống ngay trước phần bạn muốn tiêu đề và đặt tiêu đề của bạn trên phần đó. Bởi vì phần trống, tiêu đề sẽ cuộn ngay lập tức.


1

Bạn có thể thêm một Phần (có hàng 0) ở trên, sau đó đặt phầnFooterView ở trên làm tiêu đề của phần hiện tại, footerView không nổi. Hy vọng nó sẽ giúp.


FooterViews nổi, giống như HeaderViews. Họ chỉ nổi ở dưới cùng của màn hình, không phải trên cùng.
Đánh dấu A. Donohoe

0

Bỏ qua XAK. Không khám phá bất kỳ phương pháp riêng tư nào nếu bạn muốn ứng dụng của mình có cơ hội được apple chấp nhận.

Điều này là dễ nhất nếu bạn đang sử dụng Interface Builder. Bạn sẽ thêm một UIView ở đầu chế độ xem (nơi hình ảnh sẽ đi), sau đó thêm chế độ xem bảng của bạn bên dưới đó. IB nên kích thước nó cho phù hợp; nghĩa là, mặt trên của mặt bàn chạm vào đáy của UIView bạn vừa thêm và chiều cao của nó bao phủ phần còn lại của màn hình.

Suy nghĩ ở đây là nếu UIView đó không thực sự là một phần của chế độ xem bảng, thì nó sẽ không cuộn với chế độ xem bảng. tức là bỏ qua tiêu đề xem bàn.

Nếu bạn không sử dụng trình tạo giao diện, thì sẽ phức tạp hơn một chút vì bạn phải điều chỉnh vị trí và chiều cao chính xác cho chế độ xem bảng.


Điều này không trả lời câu hỏi. Tricky đang đề cập đến titleHeaderViews là các khung nhìn nằm giữa các ô, không phải là khung nhìn tiêu đề bảng, đó là những gì bạn dường như đang đề xuất.
Daniel Wood


0

Để loại bỏ hoàn toàn các phần tiêu đề phần nổi, bạn có thể làm điều này:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] init];
}

return nil không hoạt động.

Để vô hiệu hóa các tiêu đề phần nổi nhưng vẫn hiển thị, bạn có thể cung cấp chế độ xem tùy chỉnh với các hành vi của chính nó.


0

Một biến thể trên giải pháp của @ samvermette:

/// Allows for disabling scrolling headers in plain-styled tableviews
extension UITableView {

    static let shouldScrollSectionHeadersDummyViewHeight = CGFloat(40)

    var shouldScrollSectionHeaders: Bool {
        set {
            if newValue {
                tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: bounds.size.width, height: UITableView.shouldScrollSectionHeadersDummyViewHeight))
                contentInset = UIEdgeInsets(top: -UITableView.shouldScrollSectionHeadersDummyViewHeight, left: 0, bottom: 0, right: 0)
            } else {
                tableHeaderView = nil
                contentInset = .zero
            }
        }

        get {
            return tableHeaderView != nil && contentInset.top == UITableView.shouldScrollSectionHeadersDummyViewHeight
        }
    }

}

0

Đoạn mã chỉ hiển thị một tiêu đề dính cho phần đầu tiên. Các phần khác tiêu đề sẽ nổi với một tế bào.

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

    if section == 1 {
        tableView.contentInset = .zero
    }

}

func tableView(_ tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
    if section == 0 {
        tableView.contentInset = .init(top: -tableView.sectionHeaderHeight, left: 0, bottom: 0, right: 0)
    }
}

-1

Điều này có thể đạt được bằng cách chỉ định chế độ xem tiêu đề theo cách thủ công trong phương thức viewDidLoad của UITableViewControll thay vì sử dụng viewForHeaderInSection và heightForHeaderInSection của đại biểu. Ví dụ: trong lớp con của UITableViewControll, bạn có thể làm một cái gì đó như thế này:

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *headerView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 40)];
    [headerView setBackgroundColor:[UIColor magentaColor]];
    [headerView setTextAlignment:NSTextAlignmentCenter];
    [headerView setText:@"Hello World"];
    [[self tableView] setTableHeaderView:headerView];
}

Chế độ xem tiêu đề sau đó sẽ biến mất khi người dùng cuộn. Tôi không biết tại sao điều này hoạt động như thế này, nhưng nó dường như đạt được những gì bạn đang muốn làm.


Đây không phải là một phần, đây là cho 1 tiêu đề ở trên cùng.
makdad

-1

Có lẽ bạn chỉ có thể làm cho nền tiêu đề xem trong suốt:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    view.tintColor = [UIColor clearColor];
}

Hoặc áp dụng nó trên toàn cầu:

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];

-2

Tôi có một giải pháp khác thậm chí đơn giản hơn, được sử dụng mà không cần tự động thanh toán và với mọi thứ được thực hiện thông qua XIB:

1 / Đặt tiêu đề của bạn trong chế độ xem bảng bằng cách kéo và thả trực tiếp vào chế độ xem bảng.

2 / Trong Trình kiểm tra kích thước của tiêu đề mới thực hiện, chỉ cần thay đổi tự động hóa của nó: bạn chỉ nên để các neo trên cùng, bên trái và bên phải, cộng với điền theo chiều ngang.

Đó là cách nó nên được đặt cho tiêu đề

Điều đó sẽ làm các trick !


-2

Theo câu trả lời của @ samvermette Tôi đã triển khai mã trên trong Swift để giúp các lập trình viên dễ dàng sử dụng swift.

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

-2

tham chiếu: https://stackoverflow.com/a/26306212

let tableView = UITableView(frame: .zero, style: .grouped)

VUI

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return 40
    }else{
        tableView.sectionHeaderHeight = 0
    }

    return 0
}

Điều này đã giúp sử dụng không gian tiêu đề


Làm ơn, đừng làm vậy🙏
MQoder 20/03/19

-3

Cập nhật mới nhất 2020

Đã thử nghiệm với Xcode 14.

Để ẩn bất kỳ tiêu đề phần nào, Trả về nil cho tiêu đề của đại biểu phần

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}

-4

bạn có thể dễ dàng đạt được điều này bằng cách triển khai phương thức viewForHeaderInSection trong lớp đại biểu của bảng xem. phương thức này mong đợi một UIView là đối tượng trả về (đó là chế độ xem tiêu đề của bạn). tôi đã làm điều tương tự trong mã của tôi


Các poster ban đầu không muốn một tiêu đề tùy chỉnh. Họ muốn một tiêu đề không "nổi" ở đầu bảng. Đề nghị của bạn vẫn nổi.
jemmons

thay đổi chế độ xem bảng thành UITableViewStylegrouped với viewforheader, sau đó nó sẽ dừng nó
mskw
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.