2009-06-20 26 views
21

Nếu bạn có UITableView đơn giản (không được nhóm) với một hàng, phần còn lại của màn hình sẽ được lấp đầy bằng ô trống hoặc ô trống. Làm thế nào để bạn thay đổi sự xuất hiện của các ô trống? Af đầu tiên, tôi nghĩ rằng họ sẽ có sự xuất hiện của các tế bào được sử dụng trong xem bảng nhưng có vẻ như họ không.Làm cách nào tôi có thể sửa đổi giao diện của các ô 'trống' trong UITableView đơn giản?

Những người từ Bộ luật nuôi cấy (Mọi thứ) đã thực hiện một công việc tốt đẹp để sửa đổi những tế bào này nhưng tôi không thể nghĩ ngay đến một cách để thay đổi diện mạo của chúng.

Bất kỳ mẹo nào?

+0

* Bump * có một giải pháp mà làm việc? Hãy chia sẻ ở đây. Thanks – lostInTransit

+0

Những gì tôi đã làm cho đến nay là thêm một ô 'vô hình' ở cuối chế độ xem bảng với một lần xem hình ảnh hiển thị bóng của phần cuối của chế độ xem bảng. Tôi đã đặt kiểu dấu phân cách thành không. Điều này tạo ra một hiệu ứng tương tự nhưng tôi sẽ phải tinh chỉnh nó nhiều hơn một chút để được hạnh phúc với nó. –

Trả lời

20

Mặc dù không hoàn toàn bạn đang tìm kiếm, bạn cũng có thể thay đổi nó để chỉ hiển thị vùng trống (thay vì ô trống) bằng cách đặt chế độ xem chân trang trên bàn. Một UIView của chiều cao 0 sẽ làm các trick.

+1

Với sự giúp đỡ của bạn, tôi đã tìm ra và nó khá đơn giản. Thêm UIImageView mong muốn vào chân trang của UITableView (như bạn đã đề xuất) nhưng để chế độ xem bảng hoạt động chính xác, bạn phải tăng chiều cao của nó với chiều cao của UIImageView. Bằng cách này, chế độ xem bảng sẽ hoạt động như một chế độ xem bảng bình thường nhưng bạn có hiệu ứng tốt đẹp mà tôi đang tìm kiếm. Đảm bảo xóa các dải phân cách ô của chế độ xem bảng. –

+0

Bạn có mã nào để hoạt động không? Tôi đang gặp rắc rối khi tái tạo những gì được giải thích ở đây –

+0

Đây là những gì đã làm việc cho tôi. Trong iOS 6.1, nó không có vẻ như tôi phải tăng chiều cao của khung nhìn: myTableView.tableFooterView = [[[UIView alloc] initWithFrame: CGRectZero] autorelease]; –

0

Bạn có thể sẽ phải tạo một lớp con tùy chỉnh của UITableView lấp đầy nền với sự xuất hiện của ô trống.

- (void)drawRect:(CGRect)rect { 
    [super drawRect: rect]; 

    // draw your background here if the rect intersects with the background area 
} 
5

Tôi đặt lớp con UIView ~ 300px ở mức cao vào chế độ xem đầu trang và chân trang của bảng của tôi, điều chỉnh bảngViewView insets để chúng bù cho các chế độ xem này (đặt độ cao trên và dưới xuống -300px).

UIView lớp con của tôi thực hiện phương pháp drawRect, trong đó tôi sử dụng CGContextDrawTiledImage() để vẽ một trống UITableViewCell lặp đi lặp lại:

- (void)drawRect:(CGRect)rect { 

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(300, 46),NO,0.0); 
    emptyCell = [[SWTableViewCell alloc] initWithFrame:CGRectZero]; 
    [emptyCell drawRect:CGRectMake(0, 0, 300, 46)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    [emptyCell release]; 
    UIGraphicsEndImageContext(); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextScaleCTM (context, 1, -1); // this prevents the image from getting drawn upside-down 
    CGContextDrawTiledImage(context, CGRectMake(0, 0, 300, 46), [newImage CGImage]); 
} 

Trong trường hợp của tôi tableviewcells của tôi là 46px cao, vì vậy nếu tôi muốn làm UIView phân lớp để chứa 8 của các ô trống này, tôi cần phải làm cho nó cao 368px.

+0

Tôi thích giải pháp này, nhưng nó có thể sử dụng một số chỉnh sửa. Đối với một, tôi nghĩ rằng phân bổ một tableviewcell chỉ để vẽ nó là khá nặng tay. Ý tưởng đằng sau nó là khá thiên tài - các ô trống sẽ tự động phản ánh bất kỳ thay đổi nào bạn thực hiện đối với thiết kế tableviewcell tùy chỉnh. Tôi phải hình dung rằng thiết kế sẽ không thay đổi thường xuyên, vì vậy có lẽ không phải là một trường hợp sử dụng tốt để sử dụng cách tiếp cận chung này. Thay vào đó, tôi sẽ chỉ tạo ra một hình ảnh từ những gì các tế bào trông giống như và sử dụng đó. – memmons

+1

Ngoài ra, tôi không phải là một fan hâm mộ của ma thuật số trong mã. Tôi thấy lý do tại sao bạn buộc phải sử dụng chúng ở đây - bạn cần phải biết khung ngữ cảnh _before_ bạn tải ô trống - nhưng thực sự bạn nên vẽ theo kích thước trực tiếp mà bạn được cung cấp. – memmons

+0

Với ý nghĩ trên, tôi đã thêm một câu trả lời dựa trên mã của bạn, nhưng lấy trực tiếp hình nền thay vì sử dụng một tableViewCell thực tế. Tuy nhiên, tôi cũng đã đưa ra câu trả lời +1 này vì tôi nghĩ đó là một cách tiếp cận thú vị và khả thi. – memmons

7

Dựa trên câu trả lời samvermette's, nhưng được sửa đổi để sử dụng hình nền trực tiếp thay vì tổng hợp hình ảnh từ lớp con UITableViewCell. Câu trả lời của Sam là tốt, nhưng nó sẽ kém hiệu quả hơn là chỉ tạo một hình nền trực tiếp.

Tạo một phân lớp UIView - trong ví dụ này, tôi gọi nó là CustomTiledView - và thêm đoạn mã sau vào trong lớp:

- (void)drawRect:(CGRect)rect { 
UIImage *image = [UIImage imageNamed:@"tableview_empty_cell_image"]; 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextScaleCTM (context, 1, -1); 
CGContextDrawTiledImage(context, 
         CGRectMake(0, 0, rect.size.width, image.size.height), 
         [image CGImage]); 
} 

Thêm mã sau đây để tableviewcontroller của bạn:

- (CGFloat)tableView:(UITableView *)tableView 
      heightForFooterInSection:(NSInteger)section { 
    // this can be any size, but it should be 1) multiple of the 
    // background image height so the last empty cell drawn 
    // is not cut off, 2) tall enough that footer cells 
    // cover the entire tableview height when the tableview 
    // is empty, 3) tall enough that pulling up on an empty 
    // tableview does not reveal the background. 
     return BACKGROUND_IMAGE_HEIGHT * 9; // create 9 empty cells 
} 

- (UIView *)tableView:(UITableView *)tableView 
      viewForFooterInSection:(NSInteger)section { 
    CustomTiledView *footerView = [[CustomTiledView alloc] init]; 
    return [footerView autorelease]; 
} 

Cuối cùng, bạn sẽ cần phải đặt nội dung bên dưới của tableview thành giá trị âm của giá trị được trả về từ -tableView:heightForFooterInsection: Trong ví dụ này, nó sẽ là -1*BACKGROUND_IMAGE_HEIGHT*9. Bạn có thể đặt nội dung bên dưới hoặc từ Trình kiểm tra kích thước của Trình tạo giao diện hoặc bằng cách đặt thuộc tính self.tableView.contentInset từ bảng điều khiển tableviewcontroller.

Chúc mừng!

0

Tôi tin rằng phương pháp sử dụng phương pháp UITableViewtableView:viewForFooterInSection: sẽ không hoạt động đối với trường hợp bảng trống, tức là không có ô.Trong trường hợp đó, bạn có thể sử dụng kỹ thuật Answerbot đề xuất có thể được thêm thắt nhồi tạo UIView vào xem chân của bảng một cách rõ ràng, như sau:

CGRect cellRect = CGRectMake(0, 0, table.bounds.size.width, table.bounds.size.height); 
    CustomTiledView *footerView = [[[CustomTiledView alloc] initWithFrame:cellRect] autorelease]; 
    table.tableFooterView = footerView; 
1

Nếu bạn chỉ muốn thay đổi chiều cao của "ô trống "khi không có ô nào trong TableView của bạn: bạn cần đặt thuộc tính rowHeight của UITableView của bạn (việc triển khai tableView:heightForRowAtIndexPath: không ảnh hưởng đến các TableView trống). Nếu có các ô trong TableView của bạn và bạn đã triển khai tableView:heightForRowAtIndexPath: thì chiều cao hàng cuối cùng sẽ được sử dụng cho các ô trống.

+0

Điều này sẽ thay đổi chiều cao của tất cả các ô, bất kể những gì 'tableView: heightForRowAtIndexPath:' hiện. – executor21

+0

@ executor21: không đúng, 'tableView: heightForRowAtIndexPath:' luôn ghi đè giá trị bạn đặt thông qua thuộc tính 'rowHeight', nhưng nó sẽ chỉ được áp dụng nếu có ít nhất một ô. –

3

Từ http://jomnius.blogspot.com/2011/03/hide-uitableview-empty-cell-separator.html Cách dễ dàng là để xác định bảng mà không có dòng tách tế bào:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 

cách cứng, nếu bạn cần dòng phân cách, là để xác định bảng mà không có đường phân cách và tạo dòng phân cách di động như một phần của UITableViewCell tùy chỉnh. Phần dưới cùng của tế bào, rõ ràng, và rất có thể sử dụng hình ảnh đồ họa thực sự mỏng. Hãy nhớ xác định chế độ tự động và chế độ hình ảnh đúng cách.

Một cách khác là để xác định một sản phẩm nào tableFooterView UITableView của:

UIView *footer = 
    [[UIView alloc] initWithFrame:CGRectZero]; 
self.myTable.tableFooterView = footer; 
[footer release]; 
Các vấn đề liên quan