0

「オン」アラームに画像(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ブロックは、これらのセルに対して呼び出されるようには見えませんが、印刷テスト(「オフ」セルが画面外から再ロードされる場合のみ)によって、これらの制約を設定した唯一の場所です。

私は私が考えることができるソリューションのちょうど約すべての反復しようとしました:「上」ブロックを切り替え

  • プログラムでIBを経由して中央の制約を設定し、それをオフにするalarmImgYConstraintOff.active = false
  • を強制

    1. 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回目のリロードは、すべての "オン"セルと "オフ"セルのその後のリロードと同様に壊れます( "オフ"セルでは目に見える差異は見られません)。しかし、最初に "オフ"セルをリロードすると、 "オン"セルをリロードするまで何もブレークしません。

  • +0

    1つの制約をオンにすると、もう一方をオフにする必要があります。あなたがそれを試して、それがうまくいかなかったら、あなたは正しくそれをしなかったでしょう。その試みからコードを投稿できますか? – dan

    +0

    編集した質問に新しいコードと結果が含まれています!残念ながら、サイコロはありません。 – bittersweetblue

    答えて

    0

    alarmImgYConstraintOff.active = trueを設定している場合は、既に持っているものに2番目の制約を追加するだけです。新しい制約を適用する前に、不要な制約を最初に削除してみてください。これで問題は解決されるはずです。

    +0

    あなたの提案を添えて自分のコードを投稿しましたが、まだ問題が表示されています(編集された質問を参照)。 – bittersweetblue

    +0

    私は最近、動くビューを含むアプリで同様のことをしました。私は制約の値を変更することでそれを行いました。制約を追加したり削除したりするのではなく、定数であり、問​​題はありませんでした。多分それを試してみましょうか? – livtay

    +0

    私は1つの制約でそれを試してみました。 "off"ブロックでは.constant = 0、 "on"ブロックでは-10です。 "オン"のセルはレイアウトが途切れると再読み込みされますが、画像は元の位置に残ります。 「オフ」のセルは、レイアウトが破損して再ロードされ、-10の位置にシフトされます。 "on"セルをリロードするとすぐに問題が再開するようです。興味深いことに、「オフ」のセルのうちの1つ(ただしすべてではありません)では、イメージが4番目のリロードの正しい位置に戻っていますか? – bittersweetblue

    0

    同じ制約に参照を保存し、.multiplierを1または0.75に変更するだけで、制約を変更するだけで制約全体を変更する必要はありません。

    +0

    制約乗数は読み込み専用のプロパティなので、.multiplierを別のものに設定して変更することはできません。 – bittersweetblue

    関連する問題