0

У меня есть простой UICollectionVewController с одной ячейкой прототипа. В ячейке у меня есть UILabel.Ошибка UICollectionView auto layout

У меня есть классы размеров и автомат. Я установил ограничение для

top (Top Space to cell): = 100 
Height >= 17 
Trailing space to Cell = 0 
Leading Space to Cell = 0 

В этой конфигурации он отлично работает. Однако я хочу левый и правый край на клетку, поэтому я изменил начальное и завершающее пространство 10.

Хотя это работает, я получаю следующее сообщение об ошибке:

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:0x1740907c0 H:[UILabel:0x14de1a380'This is a test to see wha...']-(10)-| (Names: '|':UIView:0x14de1a270)>", 
     "<NSLayoutConstraint:0x174090810 H:|-(10)-[UILabel:0x14de1a380'This is a test to see wha...'] (Names: '|':UIView:0x14de1a270)>", 
     "<NSAutoresizingMaskLayoutConstraint:0x174090d10 h=--& v=--& H:[UIView:0x14de1a270(0)]>" 
     ) 

     Will attempt to recover by breaking constraint 
     <NSLayoutConstraint:0x1740907c0 H:[UILabel:0x14de1a380'This is a test to see wha...']-(10)-| (Names: '|':UIView:0x14de1a270)> 

     Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
     The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

Если установить ведущее место до 10 и удалить учебное пространство и установить ограничение ширины, я не получаю ошибку.

Однако ширина ячейки является переменной, поэтому я не могу установить ширину.

я могу работать вокруг него, создавая выход к ширине ограничения и делает это:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; 


CGRect colViewSize = collectionView.bounds; 

int width = colViewSize.size.width; 
width -= 28; // 10px either size and 8px in middle 
width = width/2; 
width -=14; // margin of 7 (x 2) 

cell.labelconstraintWidth.constant = width; 
return cell; 

однако это кажется такой хак.

Кто-нибудь знает, что здесь происходит.

ответ

1

Проще говоря, ваше мнение изменяет, и когда он делает, ограничение 10 ведущих и 10 задним пространство не может быть удовлетворено, поскольку ширина вашего вида не менее 20

решения? Либо поместите процентные маркеры/ширину метки в супервизор или сделайте поля нулями, если вы не хотите об этом думать.

Однако, если у вас есть инкапсулированная логика, которая вычисляет ширину ячейки, вы можете легко добавить ограничения маржи из кода.

EDIT:

Вы можете иметь ограничение autolayout, что это 50%, но это не проблема. У вас есть AutoResizingMaskLayoutConstraint, который влияет на ширину вашего представления.

Для того, чтобы создать percentual запаса в раскадровке, сделайте следующее:

1) Выберите вид в иерархии видов

2) Удерживая CTRL и перетащить в свои надтаблицы (или вид корня, который берет на себя полная границы надтаблицы)

3) Выберите горизонтальный интервал

4) Выберите вид и дважды щелкните на горизонтальной Spacing ограничения

5) В инспекторе размер выберите:

Первый предмет: YourView.Leading

отношений: Ровный

Второй элемент: YourSuperview.Скользящий

Constant: 0

Приоритет: 1000

Multiplier: (ваш запас в процентах)

Как сказал @Bamsworld, вы должны перепроверить для автоматического изменения маски. Они могут противоречить вашим ограничениям AutoLayout.

+0

Спасибо за ваш комментарий. 1) Ширина моего представления установлена ​​равной 50% экрана, поэтому никогда не устанавливается меньше 20. Происходит ли сначала изменение размера, где оно равно нулю, а затем размеры до нужного размера? - 2) Как вы можете установить процентную марку маркера в раскадровке? 3) Что касается вашего последнего комментария, вы говорите, что то, что я делаю в cellForItem ... на самом деле является действительным способом делать вещи - 4) Вы говорите, что ошибка - это красная селедка, как в "нормальном" использование, ширина всегда больше 20? – grayson

+0

Отредактировал свой ответ. – Mercurial

+0

Вы нашли решение? У меня такая же проблема ... – HixField

0

Ошибка указывает, что одно или несколько ограничений не требуются и перечислены одно из ограничений: NSAutoresizingMaskLayoutConstraint. Казалось бы, существует конфликт с автомачтами и autoresizingmasks. Я предлагаю использовать тот или иной.

Попробуйте удалить AUTORESIZE-ограничение по телефону setTranslatesAutoresizingMaskIntoConstraints на представлении и передать в NO. Также установите autoresizingMask свойство вида UIViewAutoresizingNone (для этого обязательно).

+0

Я пробовал установить эти свойства в НЕТ. Я думаю, что Mercurial находится на правильном пути. – grayson