2

これを修正する方法がわかりません: カードのサイズがデバイスによって異なる対戦ゲームを作成したいと考えています。

rootView の上部と下部に 20 のマージンで固定し、その中央に配置する contentView を作成すると思いました。次に、縦横比を 3/4 (3 行 4 列) にします。

let contentView = UIView()
// place contentView on the view
self.view.addSubview(contentView)
contentView.translatesAutoresizingMaskIntoConstraints = false

//add position constraints to thecontentView
let topMargin = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 20)
let bottomMargin = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: -20)

let horzontalAllignment = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)
let verticalAllignment = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)

self.view.addConstraints([topMargin, bottomMargin, horzontalAllignment, verticalAllignment])

//  create an aspect ratio for the contentView
let aspect = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Height, multiplier: 4/3, constant: 0)
contentView.addConstraint(aspect)

それは完璧に機能します。(うわー!) 次に、contentView の幅の 4 分の 1 と高さの 3 分の 1 を持つカードを作成します。

let thisCard = Card()
contentView.addSubview(thisCard)
thisCard.translatesAutoresizingMaskIntoConstraints = false

let hightConstraint = NSLayoutConstraint(item: thisCard, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Height, multiplier: 1/3, constant: 0)

let widthConstraint = NSLayoutConstraint(item: thisCard, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Width, multiplier: 1/4, constant: 0)

thisCard.addConstraints([hightConstraint, widthConstraint])

そこでコードが壊れ、次のメッセージが表示されます。

ビュー階層は制約に対して準備されていません: NSLayoutConstraint:0x78f1b290 Meeres_Memo_temp_caseinsensitive_renamery.Card:0x78f41820.height == UIView:0x78f49fc0.height ビューに追加される場合、制約の項目はそのビュー (またはビュー自体) の子孫でなければなりません。ビュー階層が組み立てられる前に制約を解決する必要がある場合、これはクラッシュします。

私がしたいことをすることさえ可能ですか?

アップデート:

エラーが見つかりました。heightConstraint と widthConstraint を thisCard に追加しましたが、ビュー階層の上位にある関連ビュー (この場合は contentView) に次のように追加する必要があります。

contentView.addConstraints([hightConstraint, widthConstraint])
4

1 に答える 1

0

エラー メッセージを読みます。アイテムが同じビュー階層にある場合にのみ、制約を追加できます。thisCard または contentView がビュー階層に追加される前に、制約を追加しようとしたと思います。最初にそれを行う必要があります。

ところで。1/4 はあなたが考えているものではありません。これは大きなゼロです。1/4 は整数除算を使用します。たとえば、1.0 / 4 を使用します。

于 2015-09-29T10:22:50.737 に答える