2012-10-08 22 views
16

Tôi đang cố gắng thêm UIView vào tiêu đề của UITableView, sau đó, sử dụng NSLayoutConstraints Tôi muốn cung cấp cho nó một chiều cao.Sử dụng NSLayoutConstraints trên chế độ xem tiêu đề của UITableView

Tôi đã xem qua các video của Apple Documents và WWDC 2012 nhưng tôi không thể tìm thấy lỗi cụ thể này ở bất kỳ đâu!

Tôi có đoạn mã sau:

- (UIImageView *)logoImageView 
{ 
    if (!_logoImageView) { 
     _logoImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo"]]; 
     [_logoImageView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    } 
    return _logoImageView; 
} 

... trong viewDidLoad

UIView *tableHeaderView = [[UIView alloc] init]; 
tableHeaderView.translatesAutoresizingMaskIntoConstraints = NO; 

[tableHeaderView addSubview:self.logoImageView]; 

[self.tableView setTableHeaderView:tableHeaderView]; 

NSDictionary *constraintViews = @{@"tableView" : self.tableView, @"tableHeaderView" : tableHeaderView, @"logoImageView" : self.logoImageView}; 

[self.tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tableHeaderView(50)]" 
                     options:0 
                     metrics:nil 
                     views:constraintViews]]; 

Tuy nhiên khi tôi chạy nó tôi nhận được lỗi sau:

2012-10-08 16:31:34.559 myApp[6934:c07] *** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776 
2012-10-08 16:31:34.561 myApp[6934:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.' 
*** First throw call stack: 
(0x199b012 0x17c0e7e 0x199ae78 0x1256f35 0x7589ef 0x17d46b0 0x622fc0 0x61733c 0x622eaf 0x7f78cd 0x7401a6 0x73ecbf 0x73ebd9 0x73de34 0x73dc6e 0x73ea29 0x741922 0x7ebfec 0x738bc4 0x738dbf 0x738f55 0x741f67 0x705fcc 0x706fab 0x718315 0x71924b 0x70acf8 0x27e8df9 0x27e8ad0 0x1910bf5 0x1910962 0x1941bb6 0x1940f44 0x1940e1b 0x7067da 0x70865c 0x6d5d 0x2395) 
libc++abi.dylib: terminate called throwing an exception 
+3

Tôi có thể hỏi bạn có bao giờ tìm thấy giải pháp cho vấn đề này không? –

Trả lời

2

Cách tốt nhất để khắc phục điều này là sử dụng Trình tạo giao diện để thiết lập tiêu đề UITableView, sau đó thêm Ổ cắm vào chiều cao NSLayoutConstraint.

+3

Bạn có thể giải thích không. Ý tưởng này có nghĩa là gì? – jgvb

+0

'NSLayoutConstraint' là các đối tượng thường xuyên, vì vậy bạn có thể tạo các cửa hàng cho chúng từ Interface Builder, và thao tác các thuộc tính của chúng trong thời gian chạy giống như bạn làm cho một khung nhìn IB (ví dụ) –

+0

Tôi không thấy cách thêm ràng buộc bố trí chiều cao hoặc chiều rộng vào đầu trang hoặc chân trang của 'UITableView' trong bảng phân cảnh. ' Thêm các ràng buộc mới' có mọi thứ bị chặn bên trong. – derpoliuk

3

tôi có ngoại lệ tương tự khi tôi cố gắng đặt chế độ xem tiêu đề bảng. Khi tôi nhận thấy rằng khung nhìn có Contraints, tôi đã bỏ chọn tùy chọn "Use Autolayout" từ Storyboard.

Ảnh chụp màn hình: http://i.stack.imgur.com/5jWHy.png

Điều này đã giải quyết cho tôi.

+8

Điều này chỉ làm việc xung quanh vấn đề, không sửa chữa nó: (Bạn không thể chỉ tắt tự động điền! – jgvb

1

Hãy thử điều này:

logoImageView.translatesAutoresizingMaskIntoConstraints = YES; 

(Nếu không hoạt động, hãy cố gắng loại bỏ:

tableHeaderView.translatesAutoresizingMaskIntoConstraints = NO; //Remove this line 

:)

0

tôi không nhận được bất kỳ giải pháp thích hợp cho vấn đề này nhưng bạn có thể sửa lỗi bằng cách sử dụng khung và không đặt thuộc tính translatesAutoresizingMaskIntoConstraints thành Không (theo mặc định là có, do đó, không đặt nó)

CGRect headerViewFrame = CGRectMake(0,0,320,60); //Frame for your header/footer view 

UIView *tableHeaderView = [[UIView alloc] initWithFrame:headerViewFrame]; 
tableHeaderView.translatesAutoresizingMaskIntoConstraints = Yes; //Or don't set it at all 
[self.tableView setTableHeaderView:tableHeaderView]; 
Các vấn đề liên quan