web-dev-qa-db-ja.com

プログラムで制約を変更するSwift

ストーリーボードに次のView Controllerがあります:

storyboard_mainVC

デフォルトでは、幅と高さが等しい6つの画像ビューが常にあります。各画像ビューは、「等しい高さ」と1/2の乗数でスーパービューに制限されます。

ただし、画像を内部に読み込む前に、画像に必要な高さを与えるプロパティを読み取ります(幅は変更されません)。

したがって、私のインターフェース(実行時)は次のようになります。

second_interface

乗数定数を変更する必要があると思いますが、それはread-onlyです。

私は、制約のconstantプロパティを更新できるという投稿を見ましたが、それはポイントであり、すべてのデバイスで動作する必要があります。

さて、あなたは何をお勧めしますか?制約を削除して新しい制約を追加する必要がありますか?削除せずに新しい高さ制約を適用しようとすると、自動的に削除されますか?

仕事をするにはスナップキットのようなポッドを使用する必要がありますか?

ご協力いただきありがとうございます。

[〜#〜] edit [〜#〜]

ここに私が試したが成功しなかったコードがあります:

        for (index, (drawing, ratio)) in drawingElements.enumerate() {
            drawingViews[index].image = UIImage(named: drawing)
            // update height constraint if ratio is different than defaut ratio of 1/2
            if ratio != 0.5 {
                heightConstraints[index].active = false
                let newHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.Height, multiplier: ratio, constant: 0)
                drawingViews[index].addConstraint(newHeightConstraint)
                self.view.layoutIfNeeded()
            }
        }

私はそれを間違っていますか?新しい高さの制約についてはよくわかりませんが

12
H4Hugo

これが私がこれを達成した方法です:

  • プログラムで制約を作成する(私の場合は高さ):

    // Drawing height property
    var drawingHeightConstraint: NSLayoutConstraint?
    
  • 必要に応じて古い制約を無効にし、新しい制約を設定します

注:heightContraintsは、アウトレットを含むNSLayoutConstraintの配列です

        for (index, (drawing, ratio)) in drawingElements.enumerate() {
        drawingViews[index].image = UIImage(named: drawing)

        // update height constraint if ratio is different than defaut ratio of 1/2
        if ratio != 0.5 {
            heightConstraints[index].active = false
            drawingHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: .Height, relatedBy: .Equal, toItem: drawingView, attribute: .Height, multiplier: CGFloat(ratio), constant: 0)
            drawingHeightConstraint!.active = true
        }

    }
  • 直後にlayoutIfNeeded()を呼び出します(注:いつ呼び出すかわかりません)
8
H4Hugo

制約定数は、制約された要素のコンテンツに関連しています。そのような画面が表示される理由。最も簡単な方法-明確な色で画像を作成し、デフォルトで設定します。ダウンロードが完了したら、imageViewに新しい画像を設定するだけです。

または、高さの制約にIBOutletを設定し、さまざまな状況で値を変更できます。

if(download.completed)
ibHeightOutlet.constant = imageView.frame.size.height;
else
ibHeightOutlet.constant = initialImageViewHeght.frame.size.height;
5
Karaban

私には未知の理由で乗数を変更することはできません(おそらく、Appleの実装の詳細のいくつかの種類)。ただし、制約を削除して新しい制約を作成できます。古い制約は自動的に削除されないため、削除する必要があり、競合が発生します。または、最初の制約を作成できます(0.5乗数)より低い優先度。この方法でそれを保持できます(自動レイアウトはそれを無視します)が、どうしてその不必要な制約が必要なのでしょうか?削除するだけです。サードパーティのレイアウトエンジンとライブラリについては、残念ながら、ここではアドバイスできません。

0
FreeNickname