Đã phát hiện một trường hợp trong đó các ràng buộc gợi ý một cách mơ hồ về độ cao bằng 0


120

Sau khi cập nhật lên Xcode 6.1 beta 2 khi tôi chạy ứng dụng có chứa ô chế độ xem bảng, trợ lý gỡ lỗi cho biết:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Trước đây, khi tôi sử dụng Xcode 5 trong dự án này, tôi sẽ gặp một vài lỗi nhưng chúng đã biến mất sau khi tôi nâng cấp. Tôi không có lỗi hoặc cảnh báo nào khác bây giờ. Tôi đã thử điều chỉnh kích thước của tất cả các ô trong chế độ xem bảng và cũng đã thử sử dụng chiều cao tiêu chuẩn nhưng tôi vẫn nhận được cảnh báo tương tự:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Tôi cũng đã đọc qua tất cả các chủ đề tương tự về vấn đề này nhưng không có giải pháp nào của họ giúp ích. Khi tôi kiểm tra ứng dụng bằng trình mô phỏng, ứng dụng chạy tốt ngoại trừ các ảnh được cho là trong ô tableView không có ở đó.


2
Tôi đang gặp lỗi tương tự cho ô chế độ xem bộ sưu tập. Những gì tôi làm cho điều này. Bất kỳ đề xuất.
python

Có lẽ bạn nên kiểm tra xem bạn đã thêm các tập tin xib với mục tiêu stackoverflow.com/a/26870331/1418457
onmyway133


Điều này đã xảy ra với tôi trên iOS 8.1, nhưng không còn trên iOS 8.4 nữa. Nếu bạn đã chỉ định chiều cao, tôi đoán đó chỉ là lỗi Xcode.
samwize

Câu trả lời:


126

Cho đến nay, có ba điều đã làm im lặng cảnh báo này. Bạn có thể lấy thuận tiện nhất cho bạn. Không có gì đẹp mặc dù.

  • Để thiết lập chiều cao của ô mặc định trong viewDidLoad

    self.tableView.rowHeight = 44;
  • Đi tới bảng phân cảnh và thay đổi chiều cao hàng trên chế độ xem bảng của bạn thành một cái gì đó khác với 44.

  • Để triển khai phương thức đại biểu của tableview heightForRowAtIndexPath

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }

Kỳ dị.


Tôi cũng đã cố gắng sử dụng phương pháp của bạn, nhưng tôi cần phải thêm một @property cho rowHeight nhưng tôi không biết loại đối tượng đúng để sử dụng
David E

Tôi có thể không nhận được ghi chú của bạn nhưng rowHeight là một thuộc tính của UITableView. Chỉ cần kết nối bàn của bạn với một số ổ cắm và thế là xong.
Viktor Kucera

4
Điều này là do nếu bạn giữ giá trị 44pt trong IB, nó sẽ coi bạn muốn sử dụng các ô tự định cỡ. stackoverflow.com/questions/25888126/... (nhưng, vâng, đây là một hành vi kỳ lạ thực sự)
Guillaume Algis

Vì vậy, rõ ràng là tôi có hai phương thức viewDidLoad và tôi đã đặt self.tableView.rowHeight = 44;sai phương thức . Lỗi đã biến mất! cảm ơn
David E

Cảm ơn Guillaume Algis đã làm rõ hơn điều này. Nó vẫn rất rùng rợn.
Viktor Kucera

216

Bạn đang gặp phải tác dụng phụ của một tính năng mới tuyệt vời trong Tableviews của iOS8: Automatic Row Heights.

Trong iOS 7, bạn có các hàng có kích thước cố định (được đặt bằng tableView.rowHeight) hoặc bạn sẽ viết mã để tính chiều cao của các ô và bạn sẽ trả lại giá trị đó tableView:heightForRowAtIndexPath. Viết mã để tính toán chiều cao của ô có thể khá phức tạp nếu bạn có nhiều chế độ xem trong ô của mình và bạn có các chiều cao khác nhau để xem xét ở các kích thước phông chữ khác nhau. Thêm Dynamic Type và quá trình này thật khó khăn.

Trong iOS 8, bạn vẫn có thể làm như trên, nhưng giờ đây iOS có thể xác định chiều cao của các hàng, miễn là bạn đã định cấu hình nội dung ô của mình bằng Bố cục Tự động. Đây là lợi ích to lớn đối với các nhà phát triển, vì khi kích thước phông chữ động thay đổi hoặc người dùng sửa đổi kích thước văn bản bằng Cài đặt trợ năng, giao diện người dùng của bạn có thể thích ứng với kích thước mới. Điều đó cũng có nghĩa là nếu bạn có UILabel có thể có nhiều hàng văn bản, ô của bạn bây giờ có thể phát triển để chứa những hàng đó khi ô cần và thu nhỏ khi không có, vì vậy không có bất kỳ khoảng trắng nào không cần thiết.

Thông báo cảnh báo bạn đang thấy cho bạn biết rằng không có đủ ràng buộc trong ô của bạn để Bố cục Tự động thông báo cho chế độ xem bảng về chiều cao của ô.

Để sử dụng chiều cao ô động, cùng với các kỹ thuật đã được đề cập bởi các áp phích khác, cũng sẽ loại bỏ thông báo này, bạn cần đảm bảo ô của mình có đủ các ràng buộc để liên kết các mục giao diện người dùng với đầu và cuối ô. Nếu bạn đã sử dụng Bố cục Tự động trước đây, có thể bạn đã quen với việc đặt các ràng buộc Trên cùng + Hàng đầu, nhưng chiều cao hàng động cũng yêu cầu các ràng buộc dưới cùng.

Thẻ bố cục hoạt động như thế này, xảy ra ngay lập tức trước khi một ô được hiển thị trên màn hình, theo cách vừa đúng lúc:

  1. Kích thước cho nội dung có kích thước nội tại được tính toán. Điều này bao gồm UILabels và UIImageViews, trong đó kích thước của chúng dựa trên văn bản hoặc UIImages mà chúng chứa, tương ứng. Cả hai chế độ xem này sẽ coi chiều rộng của chúng là một giá trị đã biết (vì bạn đã đặt các ràng buộc cho các cạnh sau / đầu hoặc bạn đặt các chiều rộng rõ ràng hoặc bạn đã sử dụng các ràng buộc ngang để cuối cùng tiết lộ chiều rộng từ bên này sang bên kia). Giả sử một nhãn có một đoạn văn bản ("số dòng" được đặt thành 0 để nó sẽ tự động cuộn lại), nó chỉ có thể có chiều ngang 310 điểm, vì vậy nó được xác định là cao 120pt ở kích thước phông chữ hiện tại.

  2. Giao diện người dùng được bố trí theo các ràng buộc định vị của bạn. Có một ràng buộc ở dưới cùng của nhãn kết nối với lề dưới cùng của ô. Vì nhãn đã phát triển thành chiều cao 120 điểm và vì nó bị ràng buộc với cuối ô bởi ràng buộc, nó phải đẩy ô "xuống" (tăng chiều cao của ô) để đáp ứng ràng buộc có nội dung "dưới cùng của nhãn luôn là khoảng cách tiêu chuẩn từ cuối ô.

Thông báo lỗi bạn đã báo cáo xảy ra nếu thiếu ràng buộc dưới cùng, trong trường hợp đó, không có gì để "đẩy" phần dưới cùng của ô ra khỏi đầu của ô, đó là sự không rõ ràng được báo cáo: không có gì để đẩy từ dưới lên trên cùng, ô sụp đổ. Nhưng Bố cục Tự động cũng phát hiện ra điều đó và quay trở lại sử dụng chiều cao hàng tiêu chuẩn.

Đối với những gì nó đáng giá và chủ yếu là để có một câu trả lời tròn, nếu bạn triển khai độ cao hàng động dựa trên Bố cục Tự động của iOS 8, bạn nên triển khai tableView:estimatedHeightForRowAtIndexPath:. Phương pháp ước tính đó có thể sử dụng các giá trị thô cho các ô của bạn và nó sẽ được gọi khi chế độ xem bảng được tải ban đầu. Nó giúp UIKit vẽ những thứ như thanh cuộn, không thể vẽ được trừ khi chế độ xem bảng biết nó có thể cuộn qua bao nhiêu nội dung, nhưng không cần kích thước hoàn toàn chính xác, vì nó chỉ là một thanh cuộn. Điều này cho phép việc tính toán chiều cao hàng thực tế được hoãn lại cho đến khi ô cần thiết, điều này ít tốn tính toán hơn và cho phép hiển thị UITableView của bạn nhanh hơn.


3
Đây là một lời giải thích tuyệt vời về lý do gốc rễ của cảnh báo này. Thx rất nhiều cho thời gian của bạn, Woodster!
Ngón tay cái vàng

4
Giống như những gì Woodster đã nói, tôi đã bỏ lỡ phần phía dưới của những ràng buộc. Khi thêm vào vấn đề của tôi đã được giải quyết.
Golden Thumb,

Sau khi thử gần 20 điều, đây là điều duy nhất hoạt động!
Julio Rodrigues

Người đàn ông này đã đóng đinh nó! Anh ấy xứng đáng và ủng hộ và đây phải là câu trả lời được chấp nhận. +1
caribbean

1
Xem câu trả lời này stackoverflow.com/a/29565073/4080860 để tìm ra ô nào bị thiếu ràng buộc.
hhanesand

11

Tôi đã gặp sự cố này sau khi tạo một tùy chỉnh UITableViewCellvà thêm các chế độ xem phụ của tôi vào ô thay vì của nó contentView.


10

Để giải quyết vấn đề này mà không có phương pháp lập trình, hãy điều chỉnh chiều cao hàng của chế độ xem bảng trong Trình kiểm tra kích thước từ bảng phân cảnh.

nhập mô tả hình ảnh ở đây


Giải pháp tốt nhất cho tôi vì đang sử dụng chất liệu bảng phân cảnh thay vì dòng cho mã.
zyc

6

Đây là một vấn đề tự động thanh toán. Đảm bảo rằng các lượt xem phụ của bạn có tất cả các ràng buộc. Đối với tôi, ràng buộc dưới cùng bị thiếu đối với Nhãn tiêu đề trong ô. Khi tôi thêm điều đó, cảnh báo biến mất và mọi thứ hiển thị hoàn hảo.


Không biết tại sao điều này lại bị phản đối, vì đó là một câu trả lời hoàn toàn tốt. Xem ở đây để giúp đỡ về việc chỉ ra các tế bào được gặp vấn đề được đặt ra stackoverflow.com/a/29565073/4080860
hhanesand

5

Chỉ cần bật Ô Chế độ xem Bảng Tự Định kích thước

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

& đảm bảo rằng bạn đã thêm các ràng buộc trên tất cả các mặt của UITableViewCellnhư-

nhập mô tả hình ảnh ở đây


Trên thực tế, cảnh báo đã biến mất khi tôi tắt các ô chế độ xem bảng tự sizig.
turingtested vào

@turingtested, bạn nên bật ô tableview tự định cỡ để hỗ trợ trên các thiết bị khác nhau.
Jack

Đồng ý, nhưng hãy đọc câu hỏi gốc. Ý tôi là giải pháp được đề xuất của bạn không hoạt động, ít nhất là không phù hợp với tôi.
turingtested

FYI UITableViewAutomaticDimensionđã được đổi tên thànhUITableView.automaticDimension
atineoSE

5

Nếu bạn đang sử dụng ô tĩnh hoặc ô động, chỉ cần thêm một số chiều cao hàng vào chế độ xem bảng trong bảng thanh tra và bỏ chọn tự động ở phía bên phải của chiều cao hàng, đó là bạn sẽ ngừng nhận được cảnh báo này.nhập mô tả hình ảnh ở đây


Tôi thấy điều ngược lại hiệu quả hơn: đặt chiều cao ước tính rõ ràng và để chiều cao hàng tự động.
NRitH

4

Tôi nhận được cảnh báo này hôm nay. Đây là những gì đã làm cho nó biến mất đối với tôi (trong trình tạo giao diện)

1.Đặt trường chiều cao hàng cho chế độ xem bảng thành một thứ khác 44 2 Đặt trường chiều cao hàng cho ô tableView thành một cái gì đó khác 44

Tôi không phải thực hiện bất kỳ thay đổi nào trong mã


3

Trong trường hợp của tôi, tôi đang xây dựng ô theo chương trình và liên tục gặp lỗi này.

Tôi đã thêm subviews và những hạn chế trong UITableViewCell's initphương pháp như thế này:

addSubview(rankingLabel)
addConstraints(cellConstraints)

contentViewThay vào đó, tôi đã giải quyết vấn đề bằng cách thêm chúng vào ô :

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)

1
Luôn thêm lượt xem phụ vào contentView, không phải UITableViewCelltrực tiếp.
dinesharjani

3

Đặt chiều cao hàng ước tính thành 0 và cảnh báo biến mất:

nhập mô tả hình ảnh ở đây


Vấn đề thực sự là một hạn chế còn thiếu ở đâu đó. Có lẽ bạn đang bước vào một cái gì đó theo chiều dọc thay vì thiết lập top những hạn chế / dưới
TruMan1

1

Tôi cũng gặp phải cảnh báo này khi chuyển sang Xcode 6 GM. Tôi chỉ nhận được cảnh báo khi xoay thiết bị trở lại vị trí ban đầu.

Tôi đang sử dụng UITableViewCells tùy chỉnh. Chế độ xem bảng phân cảnh được đặt thành kích thước tùy chỉnh của tôi (trong trường hợp của tôi là 100,0). Trong khi các ô trong bảng hiển thị đúng như chúng có trong các bản phát hành trước, tôi không thích thông báo cảnh báo.

Ngoài những ý kiến ​​trên, tôi đã thêm vào

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100.0;
}

Kết xuất màn hình ... phản ứng với chuyển động xoay và không còn thông báo cảnh báo nào nữa.


Vì vậy, tôi đã thử sử dụng phương pháp của bạn bằng cách sử dụng dòng bạn đã cung cấp cho tôi nhưng tôi vẫn gặp lỗi tương tự. Tôi cũng đã không sử dụng xoay vòng trong ứng dụng của mình.
David E

1

Trong xcode 6.0.1, tôi đã xóa cảnh báo này chỉ định chiều cao hàng bằng cách sử dụng:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}

1

Nếu bạn đã tạo BảngViewCell tùy chỉnh cho tableView, hãy đảm bảo rằng bạn đã cung cấp cả ràng buộc dưới cùng và trên cùng cho các ô của mình, bạn cũng có thể nhận được thông báo này nếu các lần xem phụ của bạn bên trong các ô tùy chỉnh được căn chỉnh ở trung tâm Y , điều này sẽ không xuất hiện bất kỳ thông báo lỗi nào nhưng sẽ gây rối lần lượt xác định chiều cao của hàng cho chế độ xem bảng như trong Hình ảnh tôi đã đính kèm, ở đây chúng tôi có cả ràng buộc trên cùng và dưới cùng

Khi bạn tạo Ô tùy chỉnh cho Chế độ xem bảng, bạn phải cụ thể chiều cao hàng hoặc các ràng buộc trên cùng và dưới cùng cho bạn các chế độ xem phụ của ô tùy chỉnh bên trong ô (ví dụ: nhãn trong ô tùy chỉnh như trong hình ảnh bên dưới)

Nhưng nếu điều này không hiệu quả, bạn có thể thử đặt chiều cao hàng cho ô của mình thay vì tự động như trong hình ảnh này

Nhưng hãy chắc chắn rằng nếu bạn tắt đánh dấu tự động đó, bạn phải điều chỉnh kích thước hàng của mình cho các thay đổi theo chương trình mà có thể được thực hiện tự động


0

Trong bảng phân cảnh, hãy đặt cell Row heighttrường có cùng giá trị như Row heighttrong tableView(cả hai đều có cùng giá trị phù hợp với tôi).

Nếu bạn thêm heightForRowAtIndexPathhàm vào mã của mình, nó có thể gây ra vấn đề về hiệu suất vì nó sẽ được gọi cho từng ô, vì vậy hãy cẩn thận.


0

Bạn cũng có thể thấy thông báo này nếu các ràng buộc duy nhất của bạn được đặt để căn chỉnh tất cả các mục theo chiều dọc và bạn không có / muốn chiều cao được chỉ định cho ô. Nếu bạn đặt giới hạn trên / dưới đối với mục, cảnh báo sẽ biến mất.


0

Tôi gặp sự cố này khi các nhãn và chế độ xem của tôi trong tableViewCell tùy chỉnh bị giới hạn trong customCell, không phải Content View của nó. Khi tôi xóa các ràng buộc và kết nối chúng với các ô Chế độ xem nội dung, vấn đề đã được giải quyết.


0

Tôi đã gặp thông báo lỗi tương tự, hãy đảm bảo rằng tất cả các cửa hàng của bạn đều hợp lệ như Ràng buộc về chế độ xem bảng và chế độ xem bảng


0

Nếu bạn đang tính toán chiều cao động,

  • bạn nên có tất cả các phần tử được liên kết với nhau về các ràng buộc như trên và dưới.
  • bạn chắc chắn nên có một ràng buộc dưới cùng được liên kết với phần tử ở cuối ô của bạn

0

Tôi cũng gặp vấn đề tương tự đối với ô chế độ xem bảng tùy chỉnh có chiều cao hàng động. Chiều cao động không được phản ánh và có cảnh báo tương tự trong bảng điều khiển. Giải pháp là Thêm chế độ xem phụ vào ô thay vì chế độ xem nội dung. BTW, tôi đã tạo các lượt xem phụ theo chương trình.


0

Tôi gặp sự cố này về TableViewCellnơi các ràng buộc được đặt khi khởi tạo nhưng nơi nội dung của ô được tải sau đó, điều này có nghĩa là công cụ tự động thanh toán không thể xác định chiều cao. Các giải pháp khác ở đây không hoạt động vì tôi cần chiều cao của ô làUITableView.automaticDimension .

Tôi vừa thêm một ràng buộc bổ sung vào ô:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)

0

Tôi nhận được Cảnh báo này hôm nay Tất cả những gì tôi làm chỉ là thêm một dòng bổ sung vào mã của tôi

tableView.rowHeight = 200;

thêm dòng mã này bên trong

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
  ...
}

và mã cuối cùng trông như thế nào

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  tableView.rowHeight = 200;
  ...
}

mã này sẽ tăng bảng Chiều cao ô hàng lên 200 chiều cao mặc định là 44


-1

Tôi có cùng một lỗi, do dòng này, lỗi này được hiển thị.

self.layer.backgroundColor = UIColor (trắng: 1, alpha: 0.2) như! CGColor

Tôi chỉ thay đổi dòng như sau để sửa lỗi

self.layer.backgroundColor = UIColor (trắng: 1, alpha: 0.2) .cgColor

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.