iOS8 - các ràng buộc gợi ý một cách mơ hồ về độ cao bằng 0


100

Có ai có bất kỳ ý tưởng làm thế nào để gỡ lỗi này?

Cảnh báo một lần duy nhất: Đã phát hiện trường hợp các ràng buộc đề xuất một cách mơ hồ chiều cao bằng 0 cho chế độ xem nội dung của ô chế độ xem bảng. Chúng tôi đang xem xét việc thu gọn không có chủ ý và thay vào đó sử dụng chiều cao tiêu chuẩn.

Các hàng có chiều cao cố định như được đặt bởi

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

Và tất cả constraintsdường như hạnh phúc ...

Câu trả lời:


129

Buộc chiều cao trả về và chiều cao ước tính đã khiến cảnh báo biến mất trong trường hợp của tôi.

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

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

Một giải pháp khác mà bạn không cần hai lần ghi đè chỉ đơn giản là sử dụng self.tableView.rowHeight = 44;trong loadViewphương thức của bạn hoặc init.


1
Tôi có nhiều hàng loại trong phần và chỉ một trong số chúng có chiều cao động. sau đó nó không làm việc
Raj Aggrawal

Nếu chúng tôi đặt chiều cao mặc định trong xib / storyboard, chúng tôi không phải triển khai các phương pháp này.
Satyam

77

Điều cũng có thể được thực hiện là thêm các ràng buộc theo chiều dọc từ trên cùng xuống dưới cùng của chế độ xem nội dung. Điều này sẽ làm cho autolayout vui vẻ (vì bây giờ anh ấy biết cách tự tính chiều cao của ô).


2
Điều này đã làm việc cho tôi. Tôi đã xem qua tất cả các ô vùng chứa và đảm bảo ít nhất một lượt xem phụ có cả ràng buộc "không gian trên cùng đối với vùng chứa" và "không gian dưới cùng đối với vùng chứa".
Rog182

7
Đó là câu trả lời phù hợp cho iOS 8 khi sử dụng ô xem bảng tự định cỡ.
tsafrir

1
Ý của bạn là các ràng buộc từ các phần tử bên trong chế độ xem nội dung đến đầu và cuối của chế độ xem nội dung?
Zack Shapiro

Tôi đã thử điều này nhưng tôi tiếp tục nhận được cảnh báo ràng buộc xung đột.
Shirish Kumar

2
Đảm bảo rằng bạn đang thêm ràng buộc trên cùng và dưới cùng vào chế độ xem nội dung của ô, không phải chính ô. Nếu bạn thêm khó khăn cho các tế bào, các mã sẽ vẫn làm việc nhưng sẽ cố gắng sử dụng chiều cao của 0.
frin

26

Nếu bạn đang sử dụng các ràng buộc autoLayout và UITableViewAutomaticDimension, lỗi này không phải là một số vấn đề sai sót cần được loại bỏ bằng cách ghi đè chiều cao của bạn trong mã. Có nghĩa là việc xác định chiều cao ô tự động không hoạt động vì bạn không có các ràng buộc dọc thích hợp cần thiết.

Nếu bạn giống tôi và đang gặp lỗi này và cần trợ giúp để xác định ô nào gây ra lỗi, bạn có thể thêm dòng sau ngay trước khi trả về phương thức 'heightforRowAtIndexPath'.

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

Thao tác này sẽ in ra một danh sách dài các phần và hàng, nhưng lỗi sẽ xuất hiện ngay sau ô cụ thể gây ra lỗi và bạn có thể nhanh chóng xác định ô nào đang gây ra sự cố và sửa các ràng buộc của mình cho phù hợp. Điều này đặc biệt hữu ích cho các ô tĩnh. Việc ghi đè chiều cao bằng một số được nhập theo cách thủ công sẽ hoạt động nếu bạn không sử dụng AutoLayout và chiều cao ô tự động, nhưng về cơ bản sẽ vô hiệu hóa các tính năng này, đây là một giải pháp rất kém nếu bạn đang cố gắng sử dụng.

Nếu trước đây bạn không sử dụng phương thức 'heightForRowAtIndexPath' nhưng muốn gỡ lỗi này mà không hoàn tác cài đặt UITableViewAutomaticDimension, chỉ cần thêm nó vào mã của bạn:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}

Cảm ơn bạn rất nhiều. Điều này đã giúp tôi rất nhiều. Lúc đầu, tôi nghĩ, vấn đề đó là với một ô xem bảng khác. Sau khi gỡ lỗi hóa ra, vấn đề đó là với một vấn đề khác.
akozin

Tôi muốn làm điều này, nhưng phần dài, phần và hàng không được xác định. Bạn có thể làm rõ những gì nên có trong Swift?
DrWhat

9

Dường như có một lỗi trong XCode 6.1 gây ra sự cố này nếu sử dụng bố cục tự động và bạn không chỉ định giá trị cho Chiều cao hàng cho mỗi ô Chế độ xem bảng, nhưng thay vào đó bạn để giá trị "mặc định". Chỉ cần chọn hộp kiểm "Tùy chỉnh" bên cạnh Chiều cao hàng, cho mọi ô, cảnh báo sẽ biến mất.


2
Nếu bạn đang sử dụng các ô tự định kích thước, bạn cần đặt chiều cao hàng thành "mặc định".
phatmann

1
Điều này đã giải quyết được cảnh báo. Nhưng tôi tin rằng nó chỉ xuất hiện khi sử dụng tế bào tĩnh trong TableView
MontiRabbit

1
@phatmann Vấn đề này chỉ xuất hiện đối với các ô tĩnh do đó các ô không được tự định kích thước.
ltm

@ltm có thể các ô tự định cỡ không hữu ích, trong các ô tĩnh, nếu người dùng có thể phóng to văn bản? (Bạn biết đấy, dưới trợ năng trong cài đặt iPhone)
Byron Coetsee

Tôi nghĩ đó không phải là lỗi, Nó có thể là vấn đề với các ràng buộc theo chiều dọc, chúng phải mô tả đầy đủ chiều cao của ô, đối với các chế độ xem bảng có kích thước tự động ít nhất.
juanjo

3

Có, Bạn nhận được tất cả các ràng buộc "hài lòng" ngay cả trong trường hợp khi bạn chỉ có các ràng buộc ngang cho các mục trong ô xem bảng. Tôi đã có cùng một vấn đề. Bạn cũng cần thêm các ràng buộc dọc. Làm như vậy, cảnh báo đó sẽ biến mất.


3

Các ràng buộc có thể phù hợp với mục đích bố trí, nhưng không hài lòng với mục đích chiều cao hàng tự động. Một bố cục hài lòng có nghĩa là nội dung có thể được trình bày mà không mơ hồ. Điều đó sẽ đáp ứng các kiểm tra trong Trình tạo giao diện.

Bố cục hài lòng cho chiều cao hàng tự động có nghĩa là, ngoài những điều trên, bạn cũng bao gồm các ràng buộc ở dưới cùng của ô.

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


3

Tôi đã sử dụng Chiều cao hàng 43 (hoặc <> 44) trong trình kiểm tra kích thước Chế độ xem bảng và lỗi đã biến mất. Sử dụng 44, tôi gặp lỗi. Phiên bản Xcode 6.0.1.

- Câu trả lời này đã bị người kiểm duyệt xóa, vui lòng không xóa, nó sẽ khắc phục được sự cố. Điều này GIẢI QUYẾT vấn đề cho tôi và có thể giải quyết vấn đề đó cho người khác. Vì vậy, bạn có thể tốt như vậy để không xóa nó một lần nữa.


2

Tôi không thể xóa cảnh báo, nhưng để làm cho các ràng buộc hoạt động, tôi đã đặt thuộc tính tableview, mới cho iOS8, estimatedRowHeightthành chiều cao cố định và loại bỏ heightForRowAtIndexPathtriển khai.


Nếu nó không loại bỏ cảnh báo thì đó là hệ thống đang tạo ra hạn chế bị thiếu và đặt chiều cao hàng == cho thuộc tính cell.rowHeight. Cảnh báo là về thuộc tính tự động chữa lành, nếu nó tự động chữa lành có nghĩa là vấn đề không có?
Pedro Borges

2

Nếu bạn nhận được cảnh báo đó, rất có thể là do bạn đang sử dụng bố cục tự động và các ô của bạn không có bất kỳ ràng buộc nào bên trong chúng.

Bạn nên ngừng sử dụng bố cục tự động hoặc triển khai các ràng buộc xác định rõ ràng chiều cao của ô.

Bạn có thể tắt bố cục tự động trong trình tạo giao diện bằng cách bỏ chọn tùy chọn "Sử dụng tự động thanh toán" trong trình kiểm tra tệp ở bên phải.

Nếu bạn chọn sử dụng bố cục tự động và chiều cao của các ô của bạn được cố định, việc triển khai các ràng buộc thích hợp sẽ dễ dàng. Chỉ cần thêm các ràng buộc về chiều cao cho các chế độ xem phụ của chế độ xem nội dung của ô và thực hiện các ràng buộc về không gian dọc giữa các chế độ xem con và giữa các chế độ xem phụ và chế độ xem nội dung. Ví dụ: nếu ô của bạn có một nhãn trong đó, điều này sẽ hoạt động:

Ràng buộc dọc

  1. Hạn chế về không gian theo chiều dọc giữa phần trên cùng của chế độ xem nội dung và phần trên cùng của nhãn
  2. Hạn chế chiều cao cố định của nhãn
  3. Hạn chế về không gian theo chiều dọc giữa phần dưới cùng của nhãn và phần dưới cùng của chế độ xem nội dung

Ràng buộc ngang

  1. Hạn chế về không gian theo chiều ngang giữa cạnh đầu của chế độ xem nội dung và cạnh trên cùng của nhãn
  2. Hạn chế chiều rộng cố định của nhãn
  3. Hạn chế về không gian theo chiều ngang giữa mép sau của nhãn và mép sau của chế độ xem nội dung

Tôi đang sử dụng các ràng buộc, và tất cả họ đều có vẻ hạnh phúc, như đã đề cập trong câu hỏi.
Chris

Đó có phải là những ràng buộc đối với các chế độ xem phụ của chế độ xem nội dung của ô không? Họ trông như thế nào? Có thể bạn có một số ô khác nhau? Nếu bạn đang xác định các ô có chiều cao cố định bằng các giải pháp của Frederic Bonner, thì các ràng buộc đang bị ghi đè.
wrightak


1

Trong Swift, việc buộc trả về chiều cao đã khắc phục sự cố của tôi:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(indexPath.row == 0){
       return CGFloat(131.0)
    }else if(indexPath.row == 8){
       return CGFloat(97.0)
    }else{
       return CGFloat(44.0)
    }
}

1

Đối với một bản sửa lỗi tiêu chuẩn sag, không có ràng buộc, không ước tính chiều cao hoặc quá kỹ thuật vấn đề. Tôi đã tạo một dự án mặc định, kết nối chế độ xem bảng nhưng quên đặt đại biểu chiều cao trong bộ điều khiển chế độ xem . Để đơn giản làm cho cảnh báo này biến mất, bạn cần điều này.

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

Trong bộ điều khiển chế độ xem của bảng của bạn.


1

Tôi đang sử dụng mapView bên trong uitableviewcell. Tôi đã thay đổi chiều cao của chế độ xem bản đồ thành 1/3 kích thước màn hình thiết bị. Tôi cũng gặp lỗi tương tự. Tôi đã sửa lỗi bằng cách thêm các ràng buộc bị thiếu vào chế độ xem nội dung của uitableviewcell.

1) Xóa các ràng buộc contentView.

2) Đặt Đặt lại thành hằng số được đề xuất thành contentView.

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

3) Thêm các ràng buộc còn thiếu - nếu có

4) Chúng tôi đảm bảo rằng chế độ xem nội dung có tất cả các ràng buộc cần thiết. nhập mô tả hình ảnh ở đây


0

Trong trường hợp của tôi, đó là do tôi đang thiết kế ô với xib và tôi quên thêm tệp xib đó vào đích.

Sau khi tôi thêm tệp xib đó vào đích, sự cố đã biến mất


0

Mặc dù các câu trả lời trên trang này thảo luận về việc thêm các ràng buộc về chiều cao hoặc trả về hàng theo cách thủ công Các chiều cao như 44 trong heightForRowAtIndexPath khiến cảnh báo biến mất, chúng không cần thiết vì đây là một lỗi trong Xcode có thể nhìn thấy trong ít nhất Phiên bản 6.3.2 (6D2105).

Nếu bạn đặt một điểm ngắt trong viewDidLoad, bạn sẽ thấy rằng self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) ngay cả khi bạn chỉ định chiều cao hàng là 44 trong bảng phân cảnh. Điều này là do Apple giả định không chính xác rằng bạn muốn chiều cao hàng động nếu bạn để chiều cao hàng là 44, vì họ không cung cấp cờ để bạn chỉ định tùy chọn của mình.

Dưới đây là một số giải pháp khả thi và kết quả của chúng:

  • Đặt chiều cao hàng thành 43 hoặc 45 trong bảng phân cảnh (hoạt động).

  • Trả lại chiều cao 44 in heightForRowAtIndexPath (hoạt động) theo cách thủ công.

  • Thêm các ràng buộc về chiều cao giữa các phần tử của UITableViewCell và contentView của nó (hoạt động).

Thật không may, các giải pháp này yêu cầu bạn thay đổi thiết kế của mình, thêm các ràng buộc không cần thiết hoặc thêm mã không cần thiết để khắc phục lỗi. Tôi đã thử (những gì tôi nghĩ là) giải pháp đơn giản nhất:

  • Đặt chiều cao của mỗi UITableViewCell thành 44 (Tùy chỉnh) trong bảng phân cảnh (không thành công).

Tôi thực sự muốn có một giải pháp bảng phân cảnh thuần túy cho vấn đề này, vì vậy cuối cùng tôi đã thử:

  • Thêm thuộc tính thời gian chạy do người dùng xác định vào UITableView trong bảng phân cảnh và đặt tên cho UITableView kèm theo ghi chú về cách rowHeight của nó đang được đặt để các nhà phát triển trong tương lai có thể tìm thấy nó: (works):

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

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

Những lỗi này đều quá phổ biến trong quá trình phát triển iOS và buộc các nhà phát triển phải dành quá nhiều thời gian để cân nhắc xem các giải pháp của họ sẽ ảnh hưởng như thế nào đến khả năng bảo trì về lâu dài.

Vì việc tìm kiếm một giải pháp đúng về mặt khái niệm có thể bảo trì và không có vẻ khó hiểu là rất khó nắm bắt, và giả sử rằng Apple sẽ sửa lỗi và 44 sẽ là chiều cao hàng mặc định trong tương lai gần, sau đó ràng buộc hoặc do người dùng xác định các giải pháp thuộc tính thời gian chạy có lẽ là giải pháp dễ bảo trì nhất.


0

Có hai điều quan trọng đang xảy ra ở đây, tôi nghĩ.

1) Rất dễ làm sai các ràng buộc nếu bạn ctrl + kéo. Vì vậy, hãy kiểm tra kỹ xem bạn đã thực hiện đúng chưa. Tốt nhất bạn nên sử dụng khay ở bên trái màn hình để vẽ các ràng buộc này.

2) Thay vì chỉ định ước lượngRowHeight trong ViewDidLoad hoặc một nơi nào khác, hãy sử dụng phương thức ủy quyền

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

Điều này đã khắc phục sự cố ngay lập tức cho tôi.


Tại sao bạn sử dụng ghi đè?
FractalDoctor

0

Tôi cũng đã gặp lỗi này khi sử dụng bảng phân cảnh hoặc xib phổ quát. Nếu bạn bỏ qua việc chỉ định các ràng buộc thích hợp cho lớp kích thước Any x Any, tôi đã thấy lỗi này xuất hiện.

Apple dường như đã sửa lỗi này cho iOS9. Lỗi chỉ xảy ra vào ngày 8.4 đối với tôi.


0

Tôi đã đi vòng lại nhiều ngày giữa lỗi này và lỗi khác, trong đó các ràng buộc đang được tạo (không biết ở đâu) mâu thuẫn với các ràng buộc mà tôi muốn. Tôi thậm chí đã có nó hoạt động trong một trường hợp mà mọi thuộc tính có thể nhìn thấy đều giống hệt nhau. Giải pháp duy nhất tôi tìm thấy là chuyển sang nguyên tử - tạo một tệp hoàn toàn mới với xib và bắt đầu kết nối lại các cửa hàng sao chép-dán mã cũ. Nó có thể không phải là giải pháp tốt nhất, nhưng đôi khi, nếu vấn đề không được nhìn thấy, thì bạn không thể làm gì khác. Ít nhất, đi nguyên tử là một cách tốt để xem lại những gì đang diễn ra.

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.