0

Я пытаюсь создать список тревог в UICollectionView, где сигнал тревоги «on» имеет изображение (alarmImg) и метку времени (alarmLbl), а сигнал «off» имеет изображение и метку времени пробела. Я хотел бы, чтобы изображение «выключено» было центрировано, а изображение «on» тревоги имеет смещение для учета метки.Swift: появляется загадочное ограничение

Это мой код в cellForItemAtIndexPath, где ячейка является выделенной ячейкой, а alarmLbls - это массив строк будильника.

cell.alarmLbl.text = alarmLbls[indexPath.row]  

if alarmLbls[indexPath.row] == "" { 
    cell.alarmImg.image = UIImage(named: "alarm_off") 
    let alarmImgYConstraintOff = NSLayoutConstraint(item: cell.alarmImg, attribute: .CenterY, relatedBy: .Equal, toItem: cell.mainView, attribute: .CenterY, multiplier: 1, constant: 0) 
    alarmImgYConstraintOff.active = true 
    cell.layoutIfNeeded() 
} 
else { 
    cell.alarmImg.image = UIImage(named: "alarm_on") 
    let alarmImgYConstraintOn = NSLayoutConstraint(item: cell.alarmImg, attribute: .CenterY, relatedBy: .Equal, toItem: cell.mainView, attribute: .CenterY, multiplier: 0.75, constant: 0) 
    alarmImgYConstraintOn.active = true 
    cell.layoutIfNeeded() 
} 

Исходное расположение выглядит отлично, но когда я называю reloadItemsAtIndexPaths на клетки, содержащие «на» сигналах тревоги, я получаю ошибку ограничения, указывающую, что ограничение «выключены» в настоящее время применяются, в этом случае «на» ограничении перерывы и изображения смещаются в центр. Первый блок if, похоже, не вызван для этих ячеек, хотя в соответствии с испытаниями на печать (только для «выключения» ячеек перезагружается с экрана), и это единственное место, где я установил эти ограничения.

Я пробовал только о каждой итерации решения я могу думать:

  1. Принуждение alarmImgYConstraintOff.active = false
  2. Установка центрального ограничения через IB и выключая его программно
  3. Переключение «на» блок в if заявлении
  4. изменяющемся else к else if

Установка приоритета ограничения «on» на что-то более высокое, чем приоритет ограничения «off», только приводит к тому, что все «выключенные» изображения смещаются вверх при перезагрузке. По какой-то причине, однако, при четвертой перезагрузке изображения возвращаются в исходное центрированное (правильное) положение.

Любые идеи относительно того, что я делаю неправильно здесь?

EDIT: Код для поворота нежелательных ограничений от

cell.alarmLbl.text = alarmLbls[indexPath.row] 

let alarmImgYConstraintOff = NSLayoutConstraint(item: cell.alarmImg, attribute: .CenterY, relatedBy: .Equal, toItem: cell.mainView, attribute: .CenterY, multiplier: 1, constant: 0) 
let alarmImgYConstraintOn = NSLayoutConstraint(item: cell.alarmImg, attribute: .CenterY, relatedBy: .Equal, toItem: cell.mainView, attribute: .CenterY, multiplier: 0.75, constant: 0)  

if alarmLbls[indexPath.row] == "" { 
    cell.alarmImg.image = UIImage(named: "alarm_off") 
    alarmImgYConstraintOn.active = false 
    alarmImgYConstraintOff.active = true 
    cell.layoutIfNeeded() 
} 
else { 
    cell.alarmImg.image = UIImage(named: "alarm_on") 
    alarmImgYConstraintOff.active = false 
    alarmImgYConstraintOn.active = true 
    cell.layoutIfNeeded() 
} 

Первоначальная планировка выглядит хорошо, как и раньше, но я все еще получаю перерывы макет, как только я заново загрузить «на» клетки (за исключением самая первая перезагрузка). Например. Вторая перезагрузка ячейки «on» разрывается, как и последующие перезагрузки всех «на» и «выключенных» ячеек (хотя видимой разницы не видно для «выключенных» ячеек); однако, если я сначала загружу «выключенную» ячейку, ничего не сломается до тех пор, пока я не перезаряжу ячейку «on».

+0

Когда вы включаете одно ограничение, вы должны отключить другой. Если вы попробовали это, и это не сработало, вы, вероятно, не сделали этого правильно. Можете ли вы опубликовать код с этой попытки? – dan

+0

Отредактированный вопрос, чтобы включить новый код и результаты! К сожалению, до сих пор нет кубиков. – bittersweetblue

ответ

0

Когда вы устанавливаете alarmImgYConstraintOff.active = true, вы просто добавляете второе ограничение к тому, что у вас уже есть. Сначала попробуйте удалить нежелательные ограничения перед применением нового. Это должно устранить проблему.

+0

Я разместил свой код с вашим предложением, но я все еще вижу проблемы (см. Отредактированный вопрос). – bittersweetblue

+0

Недавно я сделал аналогичную вещь в своем приложении, в котором было показано перемещение. Я сделал это, изменив значение ограничения.постоянным, а не добавлением и устранением ограничений и проблем не было. Может быть, попробовать? – livtay

+0

Я только что попробовал это с одним ограничением, сделав .constant = 0 в блоке «off» и -10 в блоке «on». «Вкл.» Перезаряжаются ячейки с разрывами компоновки, хотя изображения остаются там, где они должны быть. «Выключенные» ячейки перезаряжаются с разрывами компоновки, сдвигая их в положение -10. Похоже, что проблема снова начинается, как только я перезаряжаю ячейку «on». Интересно, однако, что для одной (но не всех) «выключенных» ячеек изображение возвращается в правильное положение при четвертой перезагрузке? – bittersweetblue

0

Попробуйте сохранить ссылку на одно и то же ограничение и просто измените .multiplier на 1 или 0.75, нет необходимости изменять все ограничение только для его изменения.

+0

Похоже, что множители ограничений являются свойствами, доступными только для чтения, поэтому вы не можете их модифицировать, установив .multiplier на что-то другое. – bittersweetblue