2013-04-16 25 views
15

Tôi đang đối mặt với một vấn đề thực sự kỳ lạ trên UITableView của mình. Tôi có một số ô khác nhau mà tôi muốn hiển thị trên dạng xem bảng giống như nguồn cấp tin tức.Làm thế nào có thể chiều cao UITableViewCellContentView khác với heightForRowAtIndexPath:

Và tôi gặp sự cố với ô sau khi sử dụng lại. Ô chứa hai hình ảnh, hai nhãn và chế độ xem với các nút chia sẻ/thích/nhận xét. Tôi sẽ cố gắng rút ra nó, nhưng tôi không chắc chắn nó sẽ là khá:

------------------------------------------------- 
|  | __ ____________________________ | 
|  | |_2| |       | | 
|  |  |    3    | | 
|  |  |       | | 
| 1 |  |____________________________| | 
|  |          | 
|  |_______________________________________| 
|  |          | 
|  |     4     | 
|_______|_______________________________________| 
|            | 
|      5      | 
|_______________________________________________| 

1 : objectImage 
2 : subjectImage 
3 : titleLabel 
4 : commentLabel 
5 : actionsView 

Và những hạn chế của tôi là:

"H:|-0-[objectImage(60)]-7-[subjectImage(30)]-7-[titleLabel]-7-|" 
"H:|-0-[objectImage(60)]-0-[commentLabel]-0-|" 
"H:|-0-[actionsView]-0-|" 
"V:|-0-[objectImage(>=35)]-0-[actionsView(44)]-0-|" 
"V:|-7-[subjectImage(30)]" 
"V:|-7-[titleLabel(>=46)]-7-[commentLabel(>=35)]-0-[actionsView(44)]-0-|" 

Và mỗi khi tế bào được rút ra, tôi thay đổi ràng buộc này:

"V:[commentLabel(%0.2f)]" 

Các ô hiển thị hoàn hảo lần đầu tiên.

Nhưng, vấn đề tôi có là tại một điểm, sau khi tái sử dụng một số (tôi không thể tái tạo nó mỗi lần) ứng dụng bị treo do vấn đề ràng buộc. Đây là ngoại lệ:

"<NSLayoutConstraint:0x205a75b0 V:[UILabel:0x1ef31430(105)]>", 
"<NSLayoutConstraint:0x1ef34440 V:[UILabel:0x1ef31430]-(0)-[UIView:0x1ef2fe50]>", 
"<NSLayoutConstraint:0x1ef34380 V:[UILabel:0x1ef31250]-(7)-[UILabel:0x1ef31430]>", 
"<NSLayoutConstraint:0x1ef33900 V:|-(7)-[UILabel:0x1ef31250] (Names: '|':UITableViewCellContentView:0x1ef2bf50)>", 
"<NSLayoutConstraint:0x1ef34340 V:[UILabel:0x1ef31250(>=46)]>", 
"<NSLayoutConstraint:0x1efV:[UIView:0x1ef2fe50]-(0)-| (Names: '|':UITableViewCellContentView:0x1ef2bf50)>", 
"<NSLayoutConstraint:0x1ef331d0 V:[UIView:0x1ef2fe50(44)]>", 
"<NSAutoresizingMaskLayoutConstraint:0x1ef36f90 h=--& v=--& V:[UITableViewCellContentView:0x1ef2bf50(147)]>" 


Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1ef34380 V:[UILabel:0x1ef31250]-(7)-[UILabel:0x1ef31430]> 

Vấn đề là các hạn chế [UITableViewCellContentView: 0x1ef2bf50 (147)] là không đúng.

là gì kỳ lạ là heightForRowAtIndexPath: trả về giá trị đúng mà là 217.

Và những gì tôi không hiểu là chiều cao của UITableViewCell là đúng!

(lldb) po 0x1ef2bf50 
$0 = 519225168 <UITableViewCellContentView: 0x1ef2bf50; frame = (0 0; 320 147); gestureRecognizers = <NSArray: 0x1ef30a20>; layer = <CALayer: 0x1ef2a3d0>> 
(lldb) po [0x1ef2bf50 superview] 
$1 = 0x1ef30e40 <NewsSubjectCommentCell: 0x1ef30e40; baseClass = UITableViewCell; frame = (0 1055; 320 217); hidden = YES; autoresize = W; layer = <CALayer: 0x1ef25e10>> 

Vì vậy, tôi không hiểu thế nào là nó có thể là hạn chế chiều cao của UITableViewCellContentView là 147. Đây là chiều cao của một tế bào cùng loại, nhưng nó phải được thay đổi để 209, phải không?

Vì vậy, nếu bạn có bất kỳ thông tin chi tiết về cách điều này có thể xảy ra (có thể tôi đã làm điều gì đó sai), tôi rất vui.

Cảm ơn,

+0

Bạn đã tìm thấy giải pháp chưa? Tôi đang gặp vấn đề tương tự. –

+0

Không, giải pháp (xấu) mà tôi đã sử dụng là thêm 1 vào chiều cao ô trong heightForRowAtIndexPath: hàm –

+0

http://stackoverflow.com/questions/12610783/auto-layout-still-required-after-executing-layoutsubviews- with-uitableviewcel/39136021 # 39136021 – qingqinghebiancao

Trả lời

2

Bạn cần phải tắt autoresizing chuyển đổi cho quan điểm cho rằng chứa những hạn chế của bạn nếu bạn thêm khó khăn của bạn với mã hoặc ngôn ngữ hình ảnh:

[self.someView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

Điều này ngăn cản các [UITableViewCellContentView:0x1ef2bf50(147)] chế từ được tạo ra .

+0

Chế độ xem có chứa các ràng buộc của tôi là UITableViewCell tùy chỉnh của tôi. Tôi đã thử những gì bạn đang đề xuất, nhưng khi tôi làm như vậy, tôi có lỗi "Xác nhận thất bại trong - [NewsSubjectCommentCell layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2380.17/UIView.m:0776". BTW, nếu bất cứ ai có thể cho tôi biết làm thế nào để có được thông báo xác nhận (để tôi biết nơi để tìm chính xác để gỡ lỗi), tôi rất thích nó. Tôi đã tìm kiếm tháng ... –

+1

Hãy thử gọi phương thức này trên superview của UITableViewCell của bạn. Có lẽ tốt hơn là hỏi về sự thất bại/thông báo xác nhận trong một câu hỏi riêng biệt, để giữ cho nó sạch sẽ. – Whakkee

+0

Bạn không thể. Bạn phải thực hiện điều này để vô hiệu hóa việc chuyển mặt nạ tự động hóa thành các ràng buộc trên ô xem bảng: http://stackoverflow.com/a/12941256/180445 Điều này sẽ khắc phục lỗi xác nhận. Đây là giải pháp cuối cùng của tôi cho OP. –

7

Bạn có thể cố gắng đặt (/ một số) độ cao ở mức độ ưu tiên thấp hơn (ví dụ: @ 900). Tôi đã có một vấn đề tương tự (UITableViewCellContentView của tôi là quá nhỏ và những khó khăn không thể được hài lòng). Sau khi tôi hạ thấp mức độ ưu tiên của chiều cao "sai" của tôi, nó được đặt ở vị trí cao nhất.

+2

Điều này làm việc cho tôi. Thay đổi giới hạn, hoặc thiết lập UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth không. – giampaolo

+0

Điều này cũng làm việc cho tôi. Tôi đã thêm một hạn chế chiều cao và đặt nó là 900 và thì đấy. –

0

Trong cellForRowAtIndexPath, bạn yêu cầu một ô từ chế độ xem bảng. Ô bạn nhận được sẽ là ô mới được tạo (với kích thước 320,44) hoặc ô đã được giải mã và gửi thông điệp chuẩn bị (có kích thước bất kỳ là trước đây). Khi bạn áp dụng mã NSLayoutConstraints cho contentView, chúng được giải quyết trước khi ô phù hợp với không gian bảng được cung cấp. Điều này không có ý nghĩa nhưng chắc chắn là kết luận của các quan sát của tôi.

Vì vậy, trong trường hợp của tôi, tôi đã nhận được các ô mới với chiều cao 44 nhưng một trong những hạn chế của tôi là cho một chiều cao cố định là 48. Điều này đã ném ngoại lệ liên tục và gỡ lỗi. Tất cả tôi đã làm để làm cho các trường hợp ngoại lệ biến mất là để thiết lập khung của các tế bào với chiều cao chính xác (và chiều rộng tôi cho rằng nếu bạn đang gặp vấn đề về kích thước ngang) khi tôi đã chuẩn bị nó trong cellForRowAtIndexPath.

UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier]; 
if(cell==nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
// If the cell is new its frame will be (0,0,320,44) 
cell.frame = CGRectMake(0,0,tableview.frame.size.width,calculatedHeightRequiredForLayout); 
[cell.contentView addConstraints:constraints]; 

Các tế bào sẽ tự động thay đổi kích thước riêng của mình để kích thước chính xác trước khi nó sẽ hiển thị trong tableview do đó bạn sẽ không gây ra bất kỳ vấn đề, nhưng những hạn chế bố trí của bạn sẽ được áp dụng mà không 'cần phải được phá vỡ' của iOS ..

15

tôi tìm thấy câu trả lời ở đây: Auto layout constraints issue on iOS7 in UITableViewCell

Chúng tôi chỉ phải đặt AutoresizingMask của contentView để UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth và ... vấn đề được giải quyết.!

+2

Tôi đã nhận được cảnh báo "Không thể đồng thời đáp ứng các ràng buộc" khi cố thực hiện theo các hướng dẫn tại đây: http://stackoverflow.com/a/18746930/528620. Đặt '[self.contentView setAutoresizingMask: UIViewAutoresizingFlexibleHeight]' đã sửa nó. Cảm ơn! – ninjudd

+0

Cảm ơn bạn! Bạn là một vị cứu tinh. Tôi đã đi hạt với "Không thể đồng thời đáp ứng các ràng buộc". – lm2s