Я пытаюсь создать список тревог в 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
, похоже, не вызван для этих ячеек, хотя в соответствии с испытаниями на печать (только для «выключения» ячеек перезагружается с экрана), и это единственное место, где я установил эти ограничения.
Я пробовал только о каждой итерации решения я могу думать:
- Принуждение
alarmImgYConstraintOff.active = false
- Установка центрального ограничения через IB и выключая его программно
- Переключение «на» блок в
if
заявлении - изменяющемся
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».
Когда вы включаете одно ограничение, вы должны отключить другой. Если вы попробовали это, и это не сработало, вы, вероятно, не сделали этого правильно. Можете ли вы опубликовать код с этой попытки? – dan
Отредактированный вопрос, чтобы включить новый код и результаты! К сожалению, до сих пор нет кубиков. – bittersweetblue