NSLayoutConstraint Hồi là gì


262

Tôi có UITableViewchạy trên iOS 8 và tôi đang sử dụng chiều cao di động tự động từ các ràng buộc trong bảng phân cảnh.

Một trong các ô của tôi chứa một ô duy nhất UITextViewvà tôi cần nó để hợp đồng và mở rộng dựa trên đầu vào của người dùng - nhấn để thu nhỏ / mở rộng văn bản.

Tôi đang làm điều này bằng cách thêm một ràng buộc thời gian chạy vào chế độ xem văn bản và thay đổi hằng số trên ràng buộc để đáp ứng với các sự kiện của người dùng:

-(void)collapse:(BOOL)collapse; {

    _collapsed = collapse;

    if(collapse)
        [_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
    else
        [_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];

    [self setNeedsUpdateConstraints];

}

Khi tôi làm điều này, tôi gói nó trong các tableViewbản cập nhật và gọi [tableView setNeedsUpdateConstraints]:

[tableView beginUpdates];

[_briefCell collapse:!_showFullBriefText];

[tableView setNeedsUpdateConstraints];
// I have also tried 
// [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
// with exactly the same results.

[tableView endUpdates];

Khi tôi làm điều này, tế bào của tôi sẽ mở rộng (và hoạt hình trong khi thực hiện nó) nhưng tôi nhận được một cảnh báo ràng buộc:

2014-07-31 13:29:51.792 OneFlatEarth[5505:730175] Unable to simultaneously satisfy constraints.

Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

(

    "<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>",

    "<NSLayoutConstraint:0x7f94dced2260 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']-(15)-|   (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",

    "<NSLayoutConstraint:0x7f94dced2350 V:|-(6)-[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']   (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",

    "<NSLayoutConstraint:0x7f94dced6480 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f94de5773a0(91)]>"
 )

Will attempt to recover by breaking constraint 

<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>

388 là chiều cao tính toán của tôi, các ràng buộc khác trên UITextViewlà của tôi từ Xcode / IB.

Cái cuối cùng làm phiền tôi - Tôi đoán đó UIView-Encapsulated-Layout-Heightlà chiều cao tính toán của ô khi nó được hiển thị lần đầu tiên - (Tôi đặt UITextViewchiều cao của mình là> = 70.0) tuy nhiên có vẻ không đúng khi ràng buộc xuất phát này ghi đè lên cập nhật người dùng cnstraint.

Tồi tệ hơn, mặc dù mã bố cục nói rằng nó đang cố gắng phá vỡ giới hạn chiều cao của tôi, nhưng nó không - nó tiếp tục tính toán lại chiều cao của tế bào và mọi thứ rút ra như tôi muốn.

Vậy, đó là gì NSLayoutConstraint UIView-Encapsulated-Layout-Height(tôi đoán đó là chiều cao được tính cho kích thước ô tự động) và tôi nên làm thế nào để buộc nó phải tính toán lại một cách sạch sẽ?


3
đăng chéo lên các diễn đàn của Apple dev: devforums.apple.com/thread/238804
Rog

3
Tôi đã giải quyết vấn đề tương tự theo cách sau và nó hoạt động trên iOS 7/8. 1) Hạ một trong các ưu tiên ràng buộc xuống 750. Tôi sẽ thử thứ 1 hoặc thứ 2 2) Trong lớp con ô trong bộ awakeFromNib self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;. Tôi nghĩ rằng việc thiết lập mặt nạ tự động kích hoạt ban đầu sẽ ngăn chặn các ràng buộc cuối cùng được thêm vào. Tôi đã tìm thấy giải pháp này tại đây: github.com/wordpress-mobile/WordPress-iOS/commit/ mẹo
Jesse

3
@RogerNolan, có tin gì không? Tôi đã tìm thấy vấn đề tương tự trong khi chơi với Bố cục tự động trong Trình tạo giao diện. Một số tế bào gây ra vấn đề này, một số thì không.
orkenstein

3
Tôi không nghĩ rằng việc thêm một dấu hiệu tự động hóa là một giải pháp tốt.
Rog

1
@RogerNolan bạn có đang tạo ô này trong IB trước khi thực hiện các thay đổi bố cục này không? Tôi đã gỡ lỗi cùng một vấn đề nhưng tôi đã không thêm bất kỳ ràng buộc nào. Tôi đã cố gắng ngăn chặn cảnh báo bằng cách xây dựng lại chế độ xem của mình từ đầu và khi tôi phân biệt 2 tệp bảng phân cảnh, điểm khác biệt duy nhất là phiên bản có cảnh báo bị thiếu dòng <rect key="frame" x="0.0" y="0.0" width="600" height="110"/>trong định nghĩa của nó, khiến tôi tin rằng đây là lỗi IB . Ít nhất là của tôi dù sao đi nữa.
Ell Neal

Câu trả lời:


301

Cố gắng hạ mức ưu tiên của bạn _collapsedtextHeightConstraintxuống 999. Bằng cách đó, UIView-Encapsulated-Layout-Heightràng buộc hệ thống được cung cấp luôn được ưu tiên.

Nó dựa trên những gì bạn trở lại -tableView:heightForRowAtIndexPath:. Đảm bảo trả về đúng giá trị và ràng buộc của riêng bạn và giá trị được tạo phải giống nhau. Ưu tiên thấp hơn cho ràng buộc của riêng bạn chỉ cần tạm thời để ngăn ngừa xung đột trong khi thu gọn / mở rộng hình ảnh động đang trong chuyến bay.


74
Điều đó sẽ đạt được chính xác ngược lại với những gì tôi muốn. UIView-Encapsulation-Layout-height là sai - nó thuộc về bố cục trước đó.
Rog

7
Các UIView-Encapsulated-Layout-Heighthạn chế được bổ sung bởi UITableView khi mực nước được xác định. Tôi tính chiều cao dựa trên nội systemLayoutSizeFittingSizedung. Ở đây, UIView-Encapsulated-Layout-Heightkhông quan trọng. Sau đó, tableView đặt nội dung kích thước rõ ràng thành giá trị được trả về bởi heightForRowAtIndexPath:. Trong trường hợp này, chính xác là giảm mức độ ưu tiên của các ràng buộc tùy chỉnh của chúng tôi vì ràng buộc của bảng Xem phải được ưu tiên sau khi tính toán hàng.
Ortwin Gentz

8
@OrtwinGentz: Vẫn không nhận được điểm chính xác để hạ mức độ ưu tiên của các ràng buộc tùy chỉnh của chúng tôi vì ràng buộc của TableView phải được ưu tiên sau khi tính toán hàng . Điều đó UIView-Encapsulated-Layout-Heightlà sai nếu tôi không hạ mức độ ưu tiên ...
thử nghiệm

38
Tôi duy trì việc tránh xung đột không khắc phục được sự cố thực tế - mặc dù điều này vẫn cảm thấy giống như một lỗi của Apple, tôi nghĩ đó có lẽ là điều đúng đắn. Đặc biệt là trong thực tế là Apple tính toán lại ràng buộc này và mọi thứ sẽ được trình bày chính xác sau khi in lỗi.
Rog

9
-1 cho câu trả lời này vì nó giả sử ràng buộc được thêm vào là chính xác. Việc thêm vào UIView-Encapsulated-Layout-Widthtrong trường hợp của tôi là sai, nhưng nó dường như được ưa thích hơn các ràng buộc rõ ràng của tôi khi chạy.
ray

68

Tôi có một kịch bản tương tự: chế độ xem bảng với một ô hàng, trong đó có một vài dòng đối tượng UILabel. Tôi đang sử dụng iOS 8 và tự động thanh toán.

Khi tôi xoay, tôi nhận được hệ thống tính chiều cao hàng sai (43,5 nhỏ hơn nhiều so với chiều cao thực tế). Nó có vẻ như:

"<NSLayoutConstraint:0x7bc2b2c0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7bc37f30(43.5)]>"

Đó không chỉ là một cảnh báo. Bố cục của ô xem bảng của tôi rất tệ - tất cả văn bản chồng chéo trên một dòng văn bản.

Điều làm tôi ngạc nhiên là dòng sau đây "khắc phục" vấn đề của tôi một cách kỳ diệu (tự động thanh toán không phàn nàn gì và tôi nhận được những gì tôi mong đợi trên màn hình):

myTableView.estimatedRowHeight = 2.0; // any number but 2.0 is the smallest one that works

có hoặc không có dòng này:

myTableView.rowHeight = UITableViewAutomaticDimension; // by itself this line only doesn't help fix my specific problem

8
Cuối cùng! Đây là một câu trả lời đúng. Trong phiên WWDC, nó đã được đề cập, nếu bạn sẽ sử dụng kích thước chiều cao hàng tự động, thì bạn sẽ đặt ước tínhRowHeight hoặc điều tồi tệ xảy ra. (Vâng, Apple thực sự đã có những điều khó chịu xảy ra)
Abdalrahman Shatou

50
FWIW, việc thêm ước tính đã không tạo ra sự khác biệt nào cho tôi.
Stewohn

3
Heh. Tôi trở lại cùng câu trả lời này một lần nữa, và đi đến thực hiện nó với niềm vui và hy vọng. Một lần nữa, nó không có gì khác biệt đối với tôi :-)
Stewohn 20/07/2015

3
Các ước tính được trả về bởi bảngView: Ước tínhHeightForRowAtIndexPath: PHẢI ít nhất phải lớn bằng ô. Mặt khác, chiều cao tính toán của bảng sẽ nhỏ hơn chiều cao thực tế và bảng có thể cuộn lên (ví dụ: sau khi thư giãn segue trở lại bảng). Không nên sử dụng UITableViewAutomaticDimension.
Matt

1
Lưu ý rằng càng thấp thì estimatedRowHeightcàng thường xuyên cellForRowAtIndexPathđược gọi ban đầu. chính xác là chiều cao bàn chia cho thời gian ước tính chính xác. Trên iPad Pro 12 inch, đây có thể là một con số trong hàng ngàn và sẽ cắt nguồn dữ liệu và có thể dẫn đến độ trễ đáng kể.
Mojo66

32

Tôi đã có thể khiến cảnh báo biến mất bằng cách chỉ định mức độ ưu tiên cho một trong các giá trị trong ràng buộc mà các thông báo cảnh báo nói rằng nó phải bị phá vỡ (bên dưới "Will attempt to recover by breaking constraint"). Có vẻ như miễn là tôi đặt mức độ ưu tiên thành thứ gì đó lớn hơn 49, cảnh báo sẽ biến mất.

Đối với tôi điều này có nghĩa là thay đổi ràng buộc của tôi, cảnh báo cho biết nó đã cố gắng phá vỡ:

@"V:|[contentLabel]-[quoteeLabel]|"

đến:

@"V:|-0@500-[contentLabel]-[quoteeLabel]|"

Trong thực tế, tôi có thể thêm một ưu tiên cho bất kỳ yếu tố nào của ràng buộc đó và nó sẽ hoạt động. Nó dường như không quan trọng cái nào. Các tế bào của tôi kết thúc chiều cao thích hợp và cảnh báo không được hiển thị. Roger, ví dụ của bạn, hãy thử thêm @500ngay sau 388ràng buộc giá trị chiều cao (ví dụ 388@500).

Tôi không hoàn toàn chắc chắn tại sao điều này hoạt động nhưng tôi đã thực hiện một chút điều tra. Trong NSLayoutP Warriority enum , có vẻ như NSLayoutPriorityFittingSizeCompressionmức độ ưu tiên là 50. Tài liệu cho mức độ ưu tiên đó cho biết:

Khi bạn gửi tin nhắn fitSize tới chế độ xem, kích thước nhỏ nhất đủ lớn cho nội dung của chế độ xem được tính toán. Đây là mức độ ưu tiên mà chế độ xem muốn càng nhỏ càng tốt trong tính toán đó. Nó khá thấp. Nói chung là không thích hợp để thực hiện một ràng buộc ở chính xác ưu tiên này. Bạn muốn cao hơn hoặc thấp hơn.

Các tài liệu hướng dẫn cho các tham chiếu fittingSizenhắn đọc:

Kích thước tối thiểu của chế độ xem thỏa mãn các ràng buộc mà nó giữ. (chỉ đọc)

AppKit đặt thuộc tính này ở kích thước tốt nhất có sẵn cho chế độ xem, xem xét tất cả các ràng buộc mà nó và các cuộc phỏng vấn của nó giữ và đáp ứng sở thích để làm cho chế độ xem càng nhỏ càng tốt. Các giá trị kích thước trong tài sản này không bao giờ âm.

Tôi đã không đào sâu hơn điều đó nhưng dường như có ý nghĩa rằng điều này có liên quan đến vấn đề nằm ở đâu.


Đó là Jeff. Vẫn cảm thấy như một lỗi với tôi. Mặc dù vậy, Apple đã không phản hồi lại thông tin thứ ba :-(
Rog

13

99,9% thời gian, trong khi sử dụng các ô hoặc tiêu đề tùy chỉnh, tất cả các xung đột UITableViewsxảy ra khi bảng tải lần đầu tiên. Sau khi tải bạn thường sẽ không thấy xung đột nữa.

Điều này xảy ra bởi vì hầu hết các nhà phát triển thường sử dụng một ràng buộc chiều cao hoặc neo cố định của một số loại để bố trí một phần tử trong ô / tiêu đề. Xung đột xảy ra bởi vì khi UITableViewtải đầu tiên / được đặt ra, nó đặt chiều cao của các ô của nó thành 0. Điều này rõ ràng mâu thuẫn với các ràng buộc của riêng bạn. Để giải quyết điều này, chỉ cần đặt bất kỳ ràng buộc chiều cao cố định nào thành mức ưu tiên thấp hơn ( .defaultHigh). Đọc kỹ thông điệp của bàn điều khiển và xem hệ thống bố trí nào bị hạn chế. Thông thường đây là một trong những cần sự thay đổi ưu tiên của nó. Bạn có thể thay đổi mức độ ưu tiên như thế này:

let companyNameTopConstraint = companyNameLabel.topAnchor.constraint(equalTo: companyImageView.bottomAnchor, constant: 15)
    companyNameTopConstraint.priority = .defaultHigh

NSLayoutConstraint.activate([
            companyNameTopConstraint,
           the rest of your constraints here
            ])

1
Đẹp giải thích.
Glenn

12

Tôi đã có thể giải quyết lỗi này bằng cách loại bỏ một giả cell.layoutIfNeeded()mà tôi đã có trong tôi tableView's cellForRowAtphương pháp.


1
Vâng, điều này cũng giải quyết vấn đề cho tôi. Tôi đã làm các mâu thuẫn về bố cục mã vì vậy ban đầu tôi nghĩ rằng tôi có thể bỏ lỡ điều gì đó. Cảm ơn
John

1
Điều tương tự! Cảm ơn!
Andrey Chernukha

7

Thay vì thông báo chế độ xem bảng để cập nhật các ràng buộc của nó, hãy thử tải lại ô:

[tableView beginUpdates];

[_briefCell collapse:!_showFullBriefText];

[tableView reloadRowsAtIndexPaths:@[[tableView indexPathForCell:_briefCell]] withRowAnimation:UITableViewRowAnimationNone];

[tableView endUpdates];

UIView-Encapsulated-Layout-Height có lẽ là chiều cao của chế độ xem bảng được tính cho ô trong khi tải ban đầu, dựa trên các ràng buộc của ô tại thời điểm đó.


Tôi nên nói trong câu hỏi của tôi, tôi đã thử điều này và nó không hoạt động. Tôi đồng ý với dự đoán của bạn về UIView-Encapsulation-Layout-height
Rog

6
Có tiền thưởng dù sao cho ít nhất gửi một câu trả lời. Có vẻ như SO sẽ chỉ để nó bay hơi nếu không.
Rog

6

Khả năng khác:

Nếu bạn sử dụng bố cục tự động để tính chiều cao của ô (chiều cao của contentView, hầu hết thời gian như bên dưới) và nếu bạn có dấu phân cách uitableview, bạn cần thêm chiều cao của dấu tách, để trả về chiều cao của ô. Khi bạn có được chiều cao chính xác, bạn sẽ không có cảnh báo tự động thanh toán đó.

- (CGFloat)calculateHeightForConfiguredSizingCell:(UITableViewCell *)sizingCell {
   [sizingCell setNeedsLayout];
   [sizingCell layoutIfNeeded];
   CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
   return size.height; // should + 1 here if my uitableviewseparatorstyle is not none

}

Điều đó đã giúp tôi trong trường hợp tôi có sự mơ hồ về chiều cao bố cục trong một bố cục ô khá phức tạp chỉ trong một số trình giả lập (iPad 6 Plus). Tôi nhận thấy rằng do một số lỗi làm tròn nội bộ, nội dung bị vắt một chút và nếu các ràng buộc không được chuẩn bị để vắt hơn tôi có sự mơ hồ. Vì vậy, thay vì trả lại UITableViewAutomaticDimensiontrong heightForRowAtIndexPathtôi trở lại [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] + 0.1
Leo

Ý tôi là tất nhiên[sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + 0.1
Leo

Đáng kinh ngạc; loại bỏ dải phân cách là những gì có bảng của tôi cư xử, vì vậy cảm ơn.
royalmurder

5

Như Jesse đã đề cập trong bình luận của câu hỏi, điều này hiệu quả với tôi:

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

FYI, vấn đề này không xảy ra trong iOS 10.


2
Trong Swift 4.2: self.contentView.autoresizingMask = [.flexibleHeight]
sóng

4

Tôi đã gặp lỗi này khi sử dụng UITableViewAutomaticDimension và thay đổi ràng buộc về chiều cao đối với chế độ xem bên trong ô.

Cuối cùng tôi đã tìm ra rằng đó là do giá trị hằng số ràng buộc không được làm tròn đến số nguyên gần nhất.

let neededHeight = width / ratio // This is a CGFloat like 133.2353
constraintPictureHeight.constant = neededHeight // Causes constraint error
constraintPictureHeight.constant = ceil(neededHeight) // All good!

2
Đây là bình luận đeo bám tôi về vấn đề của tôi. Tôi có một ô hình ảnh tải động (tăng và thu nhỏ) và chế độ xem bảng với ước tínhRowHeight = 50 và rowHeight = UITableViewAutomaticDimension. Tôi vẫn phá vỡ các ràng buộc mặc dù cái bàn có chiều cao chính xác. Hóa ra các dải phân cách có chiều cao 0,3333 và đó là những gì đã làm hạn chế kích thước hình ảnh của tôi trong tế bào bị phá vỡ. Sau khi tắt dải phân cách tất cả đều tốt. Cảm ơn Che đã cho tôi những gì để tìm kiếm.
migs647

1
Trong trường hợp này, tạo một ràng buộc bổ sung, ví dụ: bottomMargin> = view.bottomMargin+1@900. AutoLayout cố gắng chứa thêm 1 điểm, thay đổi kích thước ô, bị lẫn lộn vì chiều cao của dấu tách, cố gắng phá vỡ / thư giãn một số ràng buộc, tìm điểm @ 900 và loại bỏ điểm đó. Bạn có được bố trí bạn muốn mà không cần cảnh báo.
Anton

cứu lấy ngày của tôi vài giờ dù sao đi nữa
Anton Tropashko

1

Định cỡ chế độ xem văn bản để phù hợp với nội dung của nó và cập nhật hằng số ràng buộc chiều cao thành chiều cao kết quả, đã sửa lỗi UIView-Encapsulated-Layout-Heightxung đột ràng buộc cho tôi, ví dụ:

[self.textView sizeToFit];
self.textViewHeightConstraint.constant = self.textView.frame.size.height;

Bạn đã làm điều này ở đâu? Trong layoutSubview?
mắc kẹt vào

1

Sau khi dành vài giờ gãi đầu với lỗi này, cuối cùng tôi cũng tìm được giải pháp hiệu quả cho mình. Vấn đề chính của tôi là tôi đã đăng ký nhiều loại ngòi cho các loại ô khác nhau nhưng một loại ô đặc biệt được phép có kích thước khác nhau (không phải tất cả các phiên bản của ô đó sẽ có cùng kích thước). Vì vậy, vấn đề nảy sinh khi cái bàn ăn đang cố gắng loại bỏ một tế bào loại đó và nó có chiều cao khác nhau. Tôi đã giải quyết nó bằng cách thiết lập

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight; self.frame = CGRectMake(0, 0, self.frame.size.width, {correct height});

Bất cứ khi nào tế bào có dữ liệu của nó để tính kích thước của nó. Tôi nghĩ nó có thể ở trong

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

cái gì đó như

cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight; cell.frame = CGRectMake(0, 0, self.frame.size.width, {correct height});

Hi vọng điêu nay co ich!


0

TableView lấy chiều cao cho ô tại indexPath từ đại biểu. sau đó lấy ô từ cellForRowAtIndexPath:

top (10@1000)
    cell
bottom (0@1000)

if cell.contentView.height: 0 // <-> (UIView-Encapsulation-Layout-height: 0 @ 1000) top (10 @ 1000) xung đột với (UIView-Encapsulation-Layout-height: 0 @ 1000),

bởi vì mức độ ưu tiên của chúng bằng 1000. Chúng tôi cần đặt mức độ ưu tiên hàng đầu theo UIView-Encapsulated-Layout-Heightmức độ ưu tiên.


0

Tôi đã nhận được một tin nhắn như thế này:

Không thể đồng thời thỏa mãn các ràng buộc ...
...
...
...
NSLayoutConstraint: 0x7fe74bdf7e50 'UIView-Encapsulated-Layout-Chiều cao' V: [UITableViewCellContentView: 0x7fe75330c5c0 (21,5)]
...
...
sẽ cố gắng để phục hồi bởi phá vỡ ràng buộc NSLayoutConstraint: 0x7fe0f9b200c0 UITableViewCellContentView: 0x7fe0f9b1e090.bottomMargin == UILabel: 0x7fe0f9b1e970.bottom

Tôi đang sử dụng một tùy chỉnh UITableViewCell với UITableViewAutomaticDimensioncho chiều cao. Và tôi cũng đã thực hiện estimatedHeightForRowAtIndex:phương pháp này.

Các ràng buộc gây ra cho tôi các vấn đề trông giống như thế này

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[title]-|" options:0 metrics:nil views:views];

Thay đổi ràng buộc này sẽ khắc phục vấn đề, nhưng giống như một câu trả lời khác tôi cảm thấy rằng điều này không đúng, vì nó làm giảm mức độ ưu tiên của một ràng buộc mà tôi muốn được yêu cầu:

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-6@999-[title]-6@999-|" options:0 metrics:nil views:views];

Tuy nhiên, điều tôi nhận thấy là nếu tôi thực sự chỉ xóa mức ưu tiên, thì điều này cũng hoạt động và tôi không nhận được các bản ghi ràng buộc phá vỡ:

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-6-[title]-6-|" options:0 metrics:nil views:views];

Đây là một chút bí ẩn về sự khác biệt giữa |-6-[title]-6-||-[title-|. Nhưng việc chỉ định kích thước không phải là vấn đề đối với tôi và nó sẽ thoát khỏi nhật ký và tôi không cần phải hạ mức độ ưu tiên của các ràng buộc bắt buộc.


0

Đặt cái này view.translatesAutoresizingMaskIntoConstraints = NO;sẽ giải quyết vấn đề này.


Điều này làm việc hoàn hảo cho tôi, ngay cả khi nó không phải là giải pháp hoàn hảo.
Enkha

0

Tôi đã có một vấn đề tương tự với một tế bào xem bộ sưu tập.

Tôi đã giải quyết nó bằng cách hạ mức độ ưu tiên của ràng buộc cuối cùng được liên kết với đáy ô (cái cuối cùng trong chuỗi từ trên xuống dưới của khung nhìn - đây cuối cùng là thứ quyết định chiều cao của nó) đến 999.

Chiều cao của tế bào là chính xác, và các cảnh báo đã biến mất.

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.