2010-09-15 41 views
8

Tôi có UITableViewCell được tạo lớp con để tạo ô tùy chỉnh bằng nút và 2 nhãn. Định nghĩa ô được tải từ một xib bằng cách sử dụng mẫu được nêu trong Phát triển iPhone bắt đầu của Dave Mark. Đây là mã thiết yếu:Không thể thụt lề lớp con UITableViewCell

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MarketItemCustomCell" owner:self options:nil]; 

    for (id oneObject in nib) 
    { 
     if ([oneObject isKindOfClass:[MarketItemCustomCell class]]) 
     { 
      cell = (MarketItemCustomCell *)oneObject; 
      break; 
     } 
    } 

Nhãn và nút hiển thị như mong đợi nhưng mức thụt lề không được tôn trọng. Tôi đã thực hiện indentationLevelForRowAtIndexPath như dưới đây, nhưng ô vẫn được căn chỉnh theo mọi hướng bên trái.

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     <snip/> 
     return 5; 
    } 

Lưu ý rằng mức thụt lề hoạt động tốt khi tôi không sử dụng ô tùy chỉnh.

Bất kỳ gợi ý?

Trả lời

21

Cập nhật dành cho iOS 8: Đoạn code dưới đây không còn hoạt động vì một lý do

đề nghị thay thế cho iOS 8:

xem xét việc tạo ra một chế AutoLayout để đại diện cho lề trái thụt

Khi chạy, sửa đổi chế này để thay đổi mức thụt lề

Nếu bạn có lớp con UITableViewCell tùy chỉnh, phân lớp này có thể có một IBOutlet được ánh xạ tới ràng buộc. (Thật không may Apple không cung cấp chức năng findConstraintByTag/Id)

Thuộc tính "liên tục" có tên gọi là không đổi của NSLayoutConstraint có thể được sửa đổi để thay đổi mức thụt lề.

Đối với iOS 7, công trình này (nhưng nên không còn được khuyến khích)

Dựa trên đề nghị vodkhang, tôi thực hiện các giải pháp sau đây trong sublass UITableViewCell của tôi. Không chắc chắn nếu đây là giải pháp tốt nhất nhưng nó có vẻ hoạt động tốt.

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    float indentPoints = self.indentationLevel * self.indentationWidth; 

    self.contentView.frame = CGRectMake(indentPoints, 
              self.contentView.frame.origin.y, 
              self.contentView.frame.size.width - indentPoints, 
              self.contentView.frame.size.height); 
} 
+0

Điều này hoạt động hoàn hảo! – Nathan

+1

Thật tuyệt vời khi thụt lề chế độ xem nội dung - cảm ơn! Làm thế nào về thụt lề các tế bào chính nó? Tôi nghĩ rằng tôi muốn loại bỏ contentView từ trên và xem để xem nếu indentationLevel không phải là 0, nhưng điều đó có vẻ khốc liệt. –

+3

mã trên bị treo trên iOS8 – Gerry

1

Tôi nghĩ rằng bạn cần tùy chỉnh cấp độ thụt lề trong UITableViewCell tùy chỉnh của mình. Tôi đoán phương pháp này (và các phương pháp như – tableView:heightForRowAtIndexPath:) sẽ không ảnh hưởng trong trường hợp của UITableViewCell nếu tùy chỉnh của bạn UITableViewCell đã quy định nó

0

Nếu bạn thiết kế UITableViewCell trong xib, bạn sẽ sử dụng thuộc tính ô CustomView, không sử dụng thụt đầu dòng một cách tự động. Bạn có thể phân lớp UITableViewCell và triển khai layoutSubviews để thay đổi khung của bạn dựa trên thụt đầu dòng hoặc bạn có thể làm tương tự từ bất cứ nơi nào bạn định cấu hình các ô trong bảng đại biểu hoặc nguồn dữ liệu của mình. Tôi ước rằng Apple đã thực hiện thụt đầu dòng cho các ô tùy chỉnh.