2011-12-06 29 views
5

Chiều cao hàng ngoài hàng cuối cùng trong TableView (hàng giữ chỗ trống chỉ có chi tiết hình ảnh nếu số lượng mặt hàng nhỏ hơn số hàng mà một TableView có thể hiển thị cùng một lúc) luôn giống như chiều cao hàng cuối cùng.Có thể thay đổi chiều cao của các hàng giữ chỗ trong UITableView mà không tạo hàng giả không?

Có thể thay đổi điều này mà không cần phải thêm hàng giả cuối cùng không?

Screenshot

+1

Không có hàng nào ngoài hàng cuối cùng trong TableView (trừ khi tôi hiểu nhầm từ * last *). – PengOne

+0

@PengOne Tôi đang đề cập đến các hàng giữ chỗ ở đó khi số lượng mục nhỏ hơn số hàng mà TableView có thể chứa. – pixelfreak

+1

thay đổi kích thước bảng chiều cao khung nhìn để ẩn các hàng giữ chỗ? – changx

Trả lời

1

Các tin UITableView phương pháp dụ _spacingForExtraSeparators trả về chiều cao của các hàng giữ chỗ. Nếu bạn không viết một ứng dụng cho App Store, chỉ cần ghi đè lên đó. Nó trả về một CGFloat.

Dưới đây là một cách tiếp cận khác là tuân thủ App Store (theo như tôi biết) và có thể dễ dàng hơn việc tạo hàng giả.

UITableView tự gửi thông báo layoutSubviews nhiều. Nó thực hiện điều này bất cứ khi nào nó thêm, xóa hoặc sắp xếp lại các ô và bất cứ khi nào nó cuộn (và có thể cả các lần khác nữa). Vì vậy, hãy ghi đè layoutSubviews để vẽ chế độ xem bắt đầu ở cạnh dưới cùng của phần cuối cùng của chế độ xem bảng. Chế độ xem sẽ được điền bằng mẫu lặp lại trông giống như các ô giữ chỗ, với chiều cao bạn xác định.

Tạo lớp con của UITableView. Cung cấp cho lớp con của bạn biến số phiên bản UIView *_bottomView. Chúng tôi cần ghi đè layoutSubviews, vì vậy, chúng tôi sẽ khởi tạo _bottomView một cách lười biếng trong phương thức đó.

@implementation MyTableView 
{ 
    UIView *_bottomView; 
} 

Ghi đè layoutSubviews. Việc đầu tiên bạn thực hiện trong số layoutSubviews của bạn là gọi số [super layoutSubviews] để bạn sẽ tiếp tục hành động như một số UITableView thích hợp.

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

Điều tiếp theo bạn cần làm là khởi động lazily _bottomView.

if (!_bottomView) { 

Bạn cần mẫu để điền _bottomView và cần phải giống như ô giữ chỗ. Tạo một ngữ cảnh hình ảnh rộng 1 pixel và cao bằng cách bạn muốn một ô giữ chỗ. Điền vào các bối cảnh với màu trắng, và vẽ một đường phân cách (pixel, thực sự) ở phía dưới. Lấy hình ảnh từ ngữ cảnh.

 UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, placeholderHeight), YES, 0); 
     [[UIColor whiteColor] setFill]; 
     UIRectFill(CGRectMake(0, 0, 1, placeholderHeight)); 
     [self.separatorColor setFill]; 
     UIRectFill(CGRectMake(0, placeholderHeight - 1, 1, 1)); 
     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

Tiếp theo, tạo nền "màu" cho hình ảnh đó làm mẫu lặp lại và thêm màu đó vào chính bạn làm tiểu sử.

 _bottomView = [[UIView alloc] initWithFrame:CGRectZero]; 
     _bottomView.opaque = YES; 
     _bottomView.backgroundColor = [UIColor colorWithPatternImage:image]; 
     [self addSubview:_bottomView]; 
    } // end of if-block 

Cuối cùng, tìm phần cuối của phần cuối cùng của bạn. Sử dụng điều đó để tính toán một khung cho _bottomView bắt đầu ở dưới cùng của phần cuối cùng, là rất nhiều cao (hai lần chiều cao của riêng bạn là quá đủ), và là rộng như rect cuối cùng của phần.

int lastSectionIndex = [self.dataSource numberOfSectionsInTableView:self] - 1; 
    if (lastSectionIndex < 0) 
     lastSectionIndex = 0; 
    CGRect lastSectionRect = [self rectForSection:lastSectionIndex]; 
    CGRect bottomViewFrame = CGRectMake(lastSectionRect.origin.x, CGRectGetMaxY(lastSectionRect), lastSectionRect.size.width, self.bounds.size.height * 2); 
    _bottomView.frame = bottomViewFrame; 

Cuối cùng, hãy chắc chắn _bottomView là subview frontmost của bạn vì vậy nó sẽ viết chi phiếu quá UITableView 's các tế bào giữ chỗ.

[self bringSubviewToFront:_bottomView]; 
} // end of layoutSubviews 

Kết thúc.

@end 
+0

Tôi đã thay đổi câu trả lời của mình. Điều này sẽ dễ hơn việc sử dụng hàng giả. –

+0

Wow, cảm ơn câu trả lời chi tiết :) Không chắc chắn nếu điều này là dễ dàng hơn bằng cách sử dụng một hàng giả, mặc dù. Nó chỉ mất 7 dòng mã cho tôi. – pixelfreak

+0

Tôi đoán nó phụ thuộc vào độ phức tạp của mô hình của bạn, cho dù bạn cho phép chỉnh sửa, cho dù bạn sử dụng menu hàng, v.v. –

0

Tôi không nghĩ có API công khai để làm như vậy. Nó là hợp lý để sử dụng chiều cao hàng cuối cùng khi chiều cao hàng giữ chỗ.

Nếu bạn nhấn mạnh vào việc thay đổi chiều cao của hàng giữ chỗ, như tôi biết, thêm một ô trống giả ở cuối ô của bạn là cách duy nhất để làm như vậy.

Cũng giống như bạn đã làm.

Các vấn đề liên quan