「オン」アラームに画像(alarmImg)と時間ラベル(alarmLbl)があり、「オフ」アラームに画像があるUICollectionViewでアラームのリストを作成しようとしています空白の時間ラベル。私は "オフ"アラームイメージがラベルを説明するためにオフセットを持っている間、中央にされるアラームイメージをオンにしたいと思います。Swift:不思議な制約が表示される
cellForItemAtIndexPath
のコードです.cellはデキューされたセルで、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
を呼び出すとき、私は、その場合には、制約「ON」、「OFF」の制約が適用されていることを示す制約エラーが出ます画像が中央に移動します。最初のif
ブロックは、これらのセルに対して呼び出されるようには見えませんが、印刷テスト(「オフ」セルが画面外から再ロードされる場合のみ)によって、これらの制約を設定した唯一の場所です。
私は私が考えることができるソリューションのちょうど約すべての反復しようとしました:「上」ブロックを切り替え
alarmImgYConstraintOff.active = false
- を
else
else if
に変更
if
声明
"on"制約の優先度を "off"制約の優先度より高い値に設定すると、リロード時にすべての "off"イメージが上方向にシフトします。しかし、何らかの理由で、4回目のリロード時に、画像は元の中央に位置する(正しい)位置に戻る。
私がここで間違っていることは何ですか?
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()
}
初期レイアウトが以前のように、よさそうだが、私はまだのようにすぐに私は(のために保存セル「に」リロードとしてレイアウト区切りを取得しています最初のリロード)。例えば。 "オン"セルの2回目のリロードは、すべての "オン"セルと "オフ"セルのその後のリロードと同様に壊れます( "オフ"セルでは目に見える差異は見られません)。しかし、最初に "オフ"セルをリロードすると、 "オン"セルをリロードするまで何もブレークしません。
1つの制約をオンにすると、もう一方をオフにする必要があります。あなたがそれを試して、それがうまくいかなかったら、あなたは正しくそれをしなかったでしょう。その試みからコードを投稿できますか? – dan
編集した質問に新しいコードと結果が含まれています!残念ながら、サイコロはありません。 – bittersweetblue