Tôi UITableView
đang chạy iOS 8 và tôi đang sử dụng độ cao ô 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 UITextView
và tôi cần nó thu nhỏ và mở rộng dựa trên thông tin nhập của người dùng - chạm để thu nhỏ / mở rộng văn bản.
Tôi đang thực hiện việc 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 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];
}
Bất cứ khi nào tôi làm điều này, tôi gói nó trong các tableView
bả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, ô của tôi mở rộng (và hoạt ảnh trong khi làm điều đó) nhưng tôi nhận được cảnh báo về các hạn chế:
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 được tính toán của tôi, các ràng buộc khác UITextView
là của tôi từ Xcode / IB.
Điều cuối cùng đang làm phiền tôi - tôi đoán đó UIView-Encapsulated-Layout-Height
là chiều cao được tính toán của ô khi nó được hiển thị lần đầu - (tôi đặt UITextView
chiều cao của mình là> = 70.0) tuy nhiên, có vẻ như không ổn khi ràng buộc bắt nguồn này sau đó ghi đè đã cập nhật cnstraint người dùng.
Tệ hơn nữa, 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 ô và mọi thứ sẽ vẽ như tôi muốn.
Vì vậy, NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(tôi đoán đó là chiều cao được tính toán để định kích thước ô tự động) và tôi nên bắt buộc tính toán lại một cách rõ ràng như thế nào?
Cố gắng giảm mức độ ưu tiên của bạn _collapsedtextHeightConstraint
xuống 999. Bằng cách đó, hệ thống cung cấp UIView-Encapsulated-Layout-Height
ràng buộc 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ề giá trị phù hợp và ràng buộc của riêng bạn và ràng buộc được tạo phải giống nhau. Mức độ ưu tiên thấp hơn cho ràng buộc của riêng bạn chỉ cần thiết tạm thời để tránh xung đột trong khi hoạt ảnh thu gọn / mở rộng đang diễn ra.
Tôi có một tình huống tương tự: một dạng 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, hệ thống đã tính toán sai chiều cao hàng (43,5 nhỏ hơn nhiều so với chiều cao thực). Nó giống như:
"<NSLayoutConstraint:0x7bc2b2c0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7bc37f30(43.5)]>"
Nó không chỉ là một cảnh báo. Bố cục của ô xem bảng của tôi thật tệ - tất cả văn bản đều bị chồng chéo trên một dòng văn bản.
Tôi ngạc nhiên rằng dòng sau đây "khắc phục" sự cố 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
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à thông báo cảnh báo cho biết nó phải phá vỡ (bên dưới "Will attempt to recover by breaking constraint"
). Có vẻ như chỉ cần tôi đặt mức độ ưu tiên 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:|[email protected][contentLabel]-[quoteeLabel]|"
Trên thực tế, tôi có thể thêm ưu tiên cho bất kỳ phần 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 ô của tôi 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 @500
ngay sau 388
ràng buộc giá trị chiều cao (ví dụ [email protected]
:).
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 cuộc điều tra nhỏ. Trong enum NSLayoutPosystem , có vẻ như NSLayoutPriorityFittingSizeCompression
mức độ ưu tiên là 50
. Tài liệu cho mức độ ưu tiên đó cho biết:
Khi bạn gửi thông báo fitSize tới một dạng xem, kích thước nhỏ nhất đủ lớn cho nội dung của dạng xem sẽ được tính. Đâ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 ở mức ưu tiên chính xác 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 fittingSize
nhắn đọc:
Kích thước tối thiểu của khung nhìn thỏa mãn các ràng buộc mà nó có. (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 chế độ xem phụ của nó giữ lại và đáp ứng tùy chọn để làm cho chế độ xem càng nhỏ càng tốt. Các giá trị kích thước trong thuộc tính này không bao giờ âm.
Tôi chưa tìm hiểu kỹ về điều đó nhưng có vẻ như điều này có liên quan đến vấn đề nằm ở đâu.
99,9% thời gian, trong khi sử dụng ô hoặc tiêu đề tùy chỉnh, tất cả các xung đột UITableViews
xảy ra khi bảng tải lần đầu tiên. Sau khi tải xong, 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 chiều cao cố định hoặc ràng buộc neo của một số loại để bố trí một phần tử trong ô / tiêu đề. Xung đột xảy ra vì khi UITableView
tải / được đặt đầu tiên, nó đặt chiều cao của các ô bằng 0. Điều này rõ ràng là xung đột với các ràng buộc của riêng bạn. Để giải quyết vấn đề 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 báo giao diện điều khiển và xem ràng buộc nào mà hệ thống bố trí quyết định phá vỡ. Thông thường đây là cái cần thay đổi mức độ ưu tiên của nó. Bạn có thể thay đổi mức độ ưu tiên như sau:
let companyNameTopConstraint = companyNameLabel.topAnchor.constraint(equalTo: companyImageView.bottomAnchor, constant: 15)
companyNameTopConstraint.priority = .defaultHigh
NSLayoutConstraint.activate([
companyNameTopConstraint,
the rest of your constraints here
])
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 cellForRowAt
phương pháp.
Thay vì thông báo cho dạng 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 mà chế độ xem bảng được tính toán cho ô trong lần tải ban đầu, dựa trên các ràng buộc của ô tại thời điểm đó.
Khả năng khác:
Nếu bạn sử dụng bố cục tự động để tính toán chiều cao ô (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 tách uitableview, bạn cần thêm chiều cao của dấu phân tách để trả về chiều cao ô. 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
}
Như được đề cập bởi Jesse trong bình luận của câu hỏi, điều này phù hợp với tôi:
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
FYI, sự cố này không xảy ra trong iOS 10.
Tôi đã gặp lỗi này khi sử dụng UITableViewAutomaticDimension và thay đổi giới hạn chiều cao trên chế độ xem bên trong ô.
Cuối cùng tôi đã phát hiện 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!
Định kích thướ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ố giới hạn chiều cao thành chiều cao kết quả, đã khắc phục UIView-Encapsulated-Layout-Height
xung đột ràng buộc cho tôi, ví dụ:
[self.textView sizeToFit];
self.textViewHeightConstraint.constant = self.textView.frame.size.height;
Sau vài giờ vò đầu bứt tai với lỗi này, cuối cùng tôi đã tìm ra giải pháp phù hợp với mình. vấn đề chính của tôi là tôi có nhiều ngòi được đăng ký cho các loại ô khác nhau nhưng một loại ô cụ thể được phép có các kích thước khác nhau (không phải tất cả các trường hợp của ô đó sẽ có cùng kích thước). do đó, vấn đề đã phát sinh khi chế độ xem bảng đang cố gắng xóa hàng của một ô thuộc loại đó và nó đã xảy ra có chiều cao khác. 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 ô có dữ liệu để tính toán 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!
Không ai trả lời nó cách giải quyết trường hợp trong bảng phân cảnh. Bạn có trường hợp của tôi, top bottom constraint
với fixed height
mức độ ưu tiên 1000. Đó là lý do tại sao khi tải lần đầu tiên, vì chiều cao ô của chế độ xem bảng là 0, cố gắng đặt phần tử có chiều cao cố định, gây ra xung đột ràng buộc. (Tôi đang cố gắng chèn 40 pixel vào vùng chiều cao 0 pixel, vì vậy trình biên dịch cố gắng loại bỏ chiều cao 40 pixel). Khi chế độ xem bảng được tải, nó sẽ không tạo (Giống như bật lại chế độ xem bảng hoặc chuyển đổi tab thanh tab)
Vì vậy, hãy thay đổi mức độ ưu tiên từ required @1000
thành High @750
hoặc Low @250
. Lần đầu tiên tải, các mức độ ưu tiên thấp hơn sẽ không được xem xét, sau đó thay đổi kích thước tất cả các ràng buộc tronglayoutSubviews()
Tôi đã gặp vấn đề tương tự. Đối với tôi, lỗi là 0,5 pixel.
2020-08-06 21: 33: 20.947369 + 0530 DemoNestedTableView [4181: 384993] [LayoutConstraints] Không thể đồng thời thỏa mãn các ràng buộc. Có thể ít nhất một trong những ràng buộc trong danh sách sau là điều bạn không muốn. Hãy thử điều này: (1) xem xét từng ràng buộc và cố gắng tìm ra điều bạn không mong đợi; (2) tìm mã đã thêm các ràng buộc hoặc ràng buộc không mong muốn và sửa nó. (
"<NSLayoutConstraint:0x600000a3abc0 UICollectionView:0x7fde0780c200.height == 326 (active)>",
"<NSLayoutConstraint:0x600000a3ae40 V:|-(0)-[UICollectionView:0x7fde0780c200] (active, names: '|':UITableViewCellContentView:0x7fde05e0cb10 )>",
"<NSLayoutConstraint:0x600000a3af30 V:[UICollectionView:0x7fde0780c200]-(0)-| (active, names: '|':UITableViewCellContentView:0x7fde05e0cb10 )>",
"<NSLayoutConstraint:0x600000a2a4e0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7fde05e0cb10.height == 326.5 (active)>"
)
Sẽ cố gắng khôi phục bằng cách phá vỡ ràng buộc <NSLayoutConstraint: 0x600000a3abc0 UICollectionView: 0x7fde0780c200.height == 326 (hoạt động)>
Tạo một điểm ngắt tượng trưng tại UIViewAlertForUnsatisfiableConstraints để bắt điểm này trong trình gỡ lỗi. Các phương pháp trong danh mục UIConstraintBasedLayoutDebugging trên UIView được liệt kê trong <UIKitCore / UIView.h> cũng có thể hữu ích.
Vì vậy, chỉ cần thêm điều này và nó đã hoạt động.
self.tableView.separatorStyle = .none
TableView lấy chiều cao cho ô tại indexPath từ ủy nhiệm. sau đó lấy ô từ cellForRowAtIndexPath
:
top ([email protected])
cell
bottom ([email protected])
nếu cell.contentView.height: 0 // <-> (UIView-Encapsulated-Layout-Height: 0 @ 1000) top (10 @ 1000) bị xung đột với (UIView-Encapsulated-Layout-Height: 0 @ 1000),
vì chúng ưu tiên bằng 1000. Chúng ta cần đặt ưu tiên hàng đầu dưới UIView-Encapsulated-Layout-Height
ưu tiên của.
Tôi đã nhận được một thông báo 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-Height' V: [UITableViewCellContentView: 0x7fe75330c5c0 (21.5)]
...
...
Sẽ cố gắng khôi phục bằng phá vỡ ràng buộc NSLayoutConstraint: 0x7fe0f9b200c0 UITableViewCellContentView: 0x7fe0f9b1e090.bottomMargin == UILabel: 0x7fe0f9b1e970.bottom
Tôi đang sử dụng tùy chỉnh UITableViewCell
với UITableViewAutomaticDimension
chiều cao. Và tôi cũng đã triển khai estimatedHeightForRowAtIndex:
phương pháp này.
Ràng buộc đang gây ra cho tôi 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 được sự cố, 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:|[email protected][title][email protected]|" options:0 metrics:nil views:views];
Tuy nhiên, những gì tôi nhận thấy là nếu tôi thực sự chỉ xóa mức độ ưu tiên, đ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 vi phạm:
[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-|
và |-[title-|
. Nhưng chỉ định kích thước không phải là một vấn đề đối với tôi và nó sẽ loại bỏ các bản ghi và tôi không cần phải giảm mức độ ưu tiên của các ràng buộc bắt buộc của mình.
Đặt điều này view.translatesAutoresizingMaskIntoConstraints = NO;
sẽ giải quyết vấn đề này.
Tôi đã gặp sự cố tương tự với ô xem bộ sưu tập.
Tôi đã giải quyết nó bằng cách giảm mức độ ưu tiên của ràng buộc cuối cùng được liên kết với cuối ô (cái cuối cùng trong chuỗi từ trên xuống dưới của chế độ xem - đây cuối cùng là thứ xác định chiều cao của nó) xuống 999.
Chiều cao của ô là chính xác và các cảnh báo đã biến mất.
Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.
Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?
Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.
Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.
Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?
Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.
Sau khi Sarah Palin tán thành Donald Trump vào đầu tuần này, gần như không thể tránh khỏi việc Tina Fey sẽ trở lại Saturday Night Live để thăm lại ấn tượng Palin cổ điển của cô. Và Fey chắc chắn đã không làm thất vọng, cô ấy đã đưa ra một lời khen ngợi không hề nhẹ về bài phát biểu chứng thực Iowa quanh co và khó hiểu của Palin trong khi Trump của Darrell Hammond đưa ra bình luận xuyên suốt.
Brittney Griner (r.) Ngay từ đầu, thân phận của Brittney Griner đã là tình huống con tin Mỹ độc nhất trong lịch sử hiện đại.
Chúng ta có thể thấy nhiều hơn nữa về một Julio Jones khỏe mạnh trong khu vực cuối năm nay. John Parker Wilson, Greg McElroy, A.
Đối với đội tuyển Anh, không có kẻ thủ ác nào lớn hơn Hầu hết các cổ động viên Anh, nếu không muốn nói là tất cả, hẳn sẽ phải gật gù khi tiếng còi mãn cuộc của trận bán kết lượt về W Euro 2022 vang lên. Bởi vì nó báo hiệu rằng Đức sẽ chờ đợi ở Wembley trong trận chung kết với Anh và là điều duy nhất giữa Anh và chiếc cúp lớn đầu tiên của đội tuyển nữ.
Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!
Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!
Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không
Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"
Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.
Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.
Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.
Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.