Я программно использую ограничения автоматической компоновки для компоновки своих пользовательских ячеек UITableView, и я правильно определяю размеры ячеек в tableView:heightForRowAtIndexPath:
Это работает просто отлично на iOS6 и делает взгляд штраф в iOS7 , а также
НО, когда я запускаю приложение на iOS7, в консоли я вижу такое сообщение:
Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2013-10-02 09:56:44.847 Vente-Exclusive[76306:a0b] 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:0xac4c5f0 V:|-(15)-[UIImageView:0xac47f50] (Names: '|':UITableViewCellContentView:0xd93e850 )>",
"<NSLayoutConstraint:0xac43620 V:[UIImageView:0xac47f50(62)]>",
"<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>",
"<NSLayoutConstraint:0xac43680 V:[UIView:0xac4d0f0(1)]>",
"<NSLayoutConstraint:0xac436b0 V:[UIView:0xac4d0f0]-(0)-| (Names: '|':UITableViewCellContentView:0xd93e850 )>",
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>
И действительно , в этом списке есть одно из ограничений, которое мне не нужно:
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
и я не могу установить translatesAutoresizingMaskIntoConstraints
свойство contentView
NO => это испортит всю ячейку.
44 - это высота ячейки по умолчанию, но я определил свои собственные высоты в делегате табличного представления, так почему же элемент contentView имеет это ограничение? Что могло вызвать это?
В iOS6 этого не происходит, и все выглядит отлично как на iOS6, так и на iOS7.
Мой код довольно большой, поэтому я не буду публиковать его здесь, но не стесняйтесь попросить pastebin, если он вам нужен.
Чтобы указать, как я это делаю, при инициализации ячейки:
- Я создаю все свои ярлыки, кнопки и т. Д.
- Я установил их
translatesAutoresizingMaskIntoConstraints
свойство в NO - Я добавляю их как подвиды
contentView
ячейки - Я добавляю ограничения на
contentView
Мне также очень интересно понять, почему это происходит только на iOS7.
Ответы:
У меня тоже была эта проблема. Похоже, что фрейм contentView не обновляется до тех пор, пока не
layoutSubviews
вызывается, однако фрейм ячейки обновляется раньше, оставляя фрейм contentView установленным{0, 0, 320, 44}
на время оценки ограничений.Посмотрев на contentView более подробно, кажется, что autoresizingMasks больше не устанавливаются.
Установка autoresizingMask перед ограничением ваших представлений может решить эту проблему:
источник
self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
прежде чем добавлять свои ограничения, что должно решить проблему.self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
работает так же хорошо, как и использованиеself.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
. Я вставил этоupdateConstraints
перед добавлением ограничений в свое представление содержимого.По-видимому, что-то не так с UITableViewCell и UICollectionViewCell на iOS 7 с использованием iOS 8 SDK.
Вы можете обновить contentView ячейки, когда ячейка используется повторно следующим образом:
Для статического UITableViewController:
Поскольку контроллеры представления статических таблиц хрупки и могут быть легко сломаны, если вы реализуете некоторые методы источника данных или deletegate, существуют проверки, которые гарантируют, что этот код будет скомпилирован и запущен только на iOS 7.
Это похоже на стандартный динамический UITableViewController:
В этом случае нам не нужна дополнительная проверка компиляции, так как реализация этого метода обязательна.
Идея одинакова для обоих случаев и для UICollectionViewCell, как прокомментировано в этом потоке: Проблема с автоматическим изменением размеров кадра UICollectionViewCell contentView в ячейке прототипа раскадровки (Xcode 6, iOS 8 SDK) возникает только при работе на iOS 7
источник
Поскольку ячейки используются повторно, а высота может меняться в зависимости от содержимого, я думаю, что в целом было бы лучше установить приоритет интервалов меньше, чем требуется.
В вашем случае UIImageView имеет интервал 15 сверху, а нижний вид имеет интервал 0 снизу. Если вы установите приоритет этих ограничений на 999 (вместо 1000), приложение не выйдет из строя, потому что ограничения не требуются.
После вызова метода layoutSubviews ячейка будет иметь правильную высоту, и ограничения могут быть удовлетворены обычным образом.
источник
Я все еще не нашел хорошего решения для раскадровки ... Некоторая информация также здесь: https://github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188
Из того, что они там советуют:
Я вызвал свое решение:
.
.
источник
Просто увеличьте высоту ячейки по умолчанию. Похоже, проблема в том, что содержимое ячейки больше, чем размер ячейки по умолчанию (начальный), что нарушает некоторые ограничения неотрицательности, пока размер ячейки не будет изменен до своего фактического размера.
источник
UITableViewCellScrollView
) между ячейкой табличного представления и contentView; это, вероятно, объясняет разницу между iOS 6 и 7 здесь.Может быть, установите приоритет представления больше 750, а разрешение меньше 1000.
источник
У меня такая же проблема. Мое решение основано на других выше:
С уважением, Алессандро
источник
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.
Я тоже столкнулся с этой проблемой, и ни одно из предложений не помогло. В моем случае у меня была ячейка выбора размера, и она содержала внутри collectionView (каждая ячейка collectionView содержала полноразмерное изображение). Теперь размер ячейки heigh был немного больше (60), чем collectionView (50) и изображения внутри него (50). Из-за того, что представление collectionView имеет выравнивание снизу по ограничению супервизора со значением 10. В этом случае я предупреждал, и единственный способ исправить это - сделать высоту ячейки такой же, как ее collectionView.
источник
Я закончил тем, что вообще не использовал UITableViewCell в дизайнере ... Я создаю там настраиваемое представление и программно добавляю его в представление содержимого ячейки ... С некоторыми категориями помощи также нет шаблона кода ...
источник
Если он работает нормально в iOS8 и получил предупреждение в iOS7, вы можете выполнить поиск в исходном коде раскадровки и найти правильный tableviewCell, а затем добавить атрибут rect после строки tableviewCell. Спасибо Кучумовн .
источник