2015-07-21 20 views
6

Tôi đang gặp sự cố với ô tự động định kích thước bằng Bố cục tự động. Mục tiêu của tôi là để đạt được một bảng mà sẽ giống như thế này:IOS - các ô tự định kích thước

| Title_label (time)  $price | 
|        | 
|Some long description. More  | 
|description.     | 
|        | 

Khi tiêu đề là lâu nó sẽ giống như thế này:

| This title is (time) $price | 
| really long     | 
|        | 
|Some long description. More  | 
|description.     | 
|        | 

Vì vậy, khi danh hiệu được lớn hơn nó đẩy nhãn thời gian tới miễn là có 8 điểm không gian beetwen thời gian và giá cả. Nếu nó thậm chí còn lớn hơn, nó nên được quấn vào hàng kế tiếp.

Tôi đã thực hiện trước chế độ xem bảng với các ô tự định kích thước nhưng ở đó chỉ có một nhãn mở rộng, không phải hai.

tôi đã thực hiện chiều cao tự động hàng của:

self.tableView.rowHeight = UITableViewAutomaticDimension 
self.tableView.estimatedRowHeight = 100 

Đây là cách khó khăn của tôi trông giống như:

|  8px 
|8px title 8px time >=8px  price| 
|  8px       | 
|8px description     8px| 
|  8px       | 

Ngoài ra còn có sự liên kết đầu giữa thời gian giá và tiêu đề.

Tôi đã đặt số dòng tiêu đề và mô tả thành 0. Tôi đã đặt khả năng nén thời gian và giá thành 1000 (vì tiêu đề chồng chéo chúng).

Tuy nhiên nhãn tiêu đề không được bao bọc cho dòng tiếp theo. Nó kết thúc bằng .... Nhãn mô tả nhiều hơn cũng quá nhỏ. Khi tôi di chuyển chiều cao của bảng desription là cố định.

Tôi đã thử thêm cell.layoutIfNeeded() trước khi trả lại ô. Sau đó, bố trí di động bị rối tung lên (tiêu đề bị cắt bớt) nhưng khi tôi cuộn mọi thứ đều OK.

Bất kỳ ý tưởng nào?

Chỉnh sửa: Điều này có phải vì nhãn tiêu đề nằm cạnh các nhãn khác và không biết khi nào nên dán?

tôi đã cố gắng

override func layoutSubviews() { 
     self.nameLabel.preferredMaxLayoutWidth -= (durationLabel.frame.width + priceLabel.frame.width + 16) 
     super.layoutSubviews() 
    } 

nói với nhãn tiêu đề chiều rộng tối đa của nó là gì nhưng nó messes mọi thứ lên.

Trả lời

2

Cũng giống như bạn, tôi đã thiết lập các hàng tiêu đề và mô tả cho 0, và tôi đã thiết lập di động của bạn như thế này:

|  8px 
|8px title 8px time >=8px  price| 
|  8px       | 
|8px description     8px| 
|  8px       | 

Sau đó, tôi đã thiết lập nén và tính ôm:

tiêu đề:

  • ôm: H: 251, V: 252
  • nén: H: 999, V: 1000

thời gian:

  • ôm: H: 253, V: 251
  • nén: H: 1000, V: 750

giá:

  • Hugg ing: H: 252, V: 251
  • nén: H: 1000, V: 750

mô tả:

  • ôm: H: 251, V: 251
  • nén : H: 750, V: 999

Mọi thứ hoạt động như mong đợi

+0

Cảm ơn câu trả lời, tiếc là nó không hoạt động cho tôi (không có layoutIfNeeded()). Sau khi thêm layoutIfNeeded() tiêu đề nhãn kết thúc tốt đẹp nhưng tôi nhận được rất nhiều lỗi NSConstraints. Và mô tả vẫn bị cắt ngắn. – Cahir09

+0

Tôi đã tạo dự án thử nghiệm mới và đặt tất cả các ràng buộc, nén và tính năng ôm như bạn đã đề xuất. Nhưng tiêu đề vẫn bị cắt ngắn. Nếu tôi thêm layoutIfNeeded trước khi trở về tế bào có vẻ tốt nhưng có một loạt các lỗi ràng buộc bố trí. Tin tốt là toàn bộ mô tả được hiển thị. Trong dữ liệu dự án của tôi được tải từ WS và có một chút phức tạp để điền vào ô với dữ liệu thích hợp. Nó có thể là lý do tại sao mô tả được cắt bỏ? Tôi có nghĩa là tế bào không thể tính toán chiều cao của nó trước khi nó được hiển thị? Nếu bạn vẫn có dự án mẫu của mình, bạn có thể tải lên và chia sẻ liên kết không? – Cahir09

+0

Tôi chỉ thử nó trên IB, nhưng nó hoạt động. Tôi sẽ thiết lập một dự án khi tôi có thời gian rảnh rỗi. – Daniel

2

enter image description here Bạn có thể thêm ràng buộc đầu tiên vào giá như hàng đầu, trên cùng, chiều cao, chiều rộng. sau đó đến nhãn thời gian là đầu, cuối, chiều cao, chiều rộng. Đối với nhãn tiêu đề là hàng đầu, đuôi, trên cùng, dưới cùng. Đối với nhãn mô tả hàng đầu, theo sau, trên cùng, dưới cùng. & viết mã bên dưới. heightForRowAtIndexPath sẽ cung cấp cho bạn chiều cao thích hợp để di động của bạn

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static YOUR_TABLEVIEW_CELL *sizingCell = nil; 
    static NSString *[email protected]"YOUR_TABLEVIEW_CELL_IDENTIFIER"; 
    sizingCell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (sizingCell==nil) 
    { 
     sizingCell=[[YOUR_TABLEVIEW_CELL alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    [self configureFareIssueCell:sizingCell atIndexPath:indexPath]; 
    return [self calculateHeightForConfiguredSizingCell:sizingCell]; 
} 

//assign all the labels here 
- (void)configureFareIssueCell:(YOUR_TABLEVIEW_CELL*)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    //e.g 
    [email protected]"YOUR_TEXT"; 
    cell.imageView.image=[UIImage imageNamed:@"NAME_OF_YOUR_IMAGE"]; 
} 

- (CGFloat)calculateHeightForConfiguredSizingCell:(YOUR_TABLEVIEW_CELL *)sizingCell 
{ 
    CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 
    return size.height + 1.0f; // Add 1.0f for the cell separator height 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *[email protected]"YOUR_TABLEVIEW_CELL_IDENTIFIER"; 
    YOUR_TABLEVIEW_CELL *cell =[tableView dequeueReusableCellWithIdentifier:@"YOUR_TABLEVIEW_CELL_IDENTIFIER"]; 
    if (cell==nil) 
    { 
     cell=[[YOUR_TABLEVIEW_CELL alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    [self configureFareIssueCell:cell atIndexPath:indexPath]; 

    return cell; 
} 
2

Hãy thử thêm

[cell layoutIfNeeded] 

trước khi trở về tế bào cấu hình của bạn.

0
  1. thêm chiều rộng tối thiểu để giá lable thời gian &

  2. thiết lập các ưu tiên ôm quá

tiêu đề nhãn:

ôm: H: 1000, V: 1000

Nén: H: 1000, V: 1000

mô tả nhãn:

ôm: H: 1000, V: 999

nén: H: 1000, V: 999

  1. thêm dòng này ở phần cuối của cellForRowAtIndexPath & loại bỏ layoutSubviews

    tế bào? .layoutIfNeeded()

  2. add chức năng này

    func tableView (tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { trở UITableViewAutomaticDimension }

func tableView (tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { trở UITableViewAutomaticDimension }

5 Build & chạy

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