2017-01-08 6 views
1

私はiOS 9 & 10アプリを持っています。このアプリは、特定のコントロールを表示(または非表示)するためにスライドするウインドウの下部に沿って、小さな「トレイ」UIViewを備えています。デフォルトでは、トレイは完全に表示され(「スライドアウト」)、ユーザーはすべてを見ることができます。右端にボタンがあり、トレイを左にスライドさせるとタップすることができます。これにより、トレイがほとんど非表示になります。なぜなら、左に画面が外れているためです。 (最も右の20ポイントは、ユーザーがスライドイン/アウトするためにタップできる「親指」であるため、トレイをスライドさせたときにサムがトレイの唯一の部分です。)[NSLayoutConstraint constraintWithItem:]ができるのに、Interface Builderが制約に対して負の倍数を設定できないのはなぜですか?

私はInterface Builderを使って2つの異なる制約を定義することです。一度に1つだけアクティブになるように単純に切り替えます。例えば、2つの制約があってもよい:

trayOutConstraint:

:+ 0 //結果== 0

trayInConstraint(* 1 superview.leading)

trayView.leading =

trayView.leading =(superview.trailing * -1)

(例えば)+ 20 //結果== -

それは(編集:私は、ストーリーボードのデフォルトの制約を無効にし、私の新しい制約を追加しているかを示すために拡張さ):私はそうのように、プログラムでtrayInConstraintのための制約を作成できることが判明し

// Disable the default constraint (in the storyboard) 
[[self trayTripOutLeadingConstraint] setActive:NO]; 

// Create the new constraint (add to an array by itself) 
NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:(id)trayView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:(id)[trayView superview] attribute:NSLayoutAttributeTrailing multiplier:-1 constant:20]; 
NSArray *newTrayConstraintsArray = [[NSArray alloc] initWithObjects:newConstraint, nil]; 

// Remove any existing constraints array and use the new one  
[[self view] removeConstraints:[self tripTrayConstraints]]; 
[self setTripTrayConstraints:newTrayConstraintsArray]; 
[[self view] addConstraints:newTrayConstraintsArray]; 

しかし、場合私はInterface Builderでそれを作成しようとしていますが、乗数を1.0以外に設定することはできません。 (タイピング他の値は、単にそれが「1」にリセットすることが強制されます。)私は、Appleのドキュメントに表示さ

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/AnatomyofaConstraint.html

あなたは 場所属性を持つ非同一の乗数(1.0以外の値)を使用することはできません。

なぜ私はコードではなくIBで作成できますか?

(他の人には役に立たないかもしれない:私はまた、倍数が0だったがプログラムでもIBでもできない制約を作成したいと思った。私は、 0.000001のような非常に小さいものを乗算器として使用して0.0を指定します)。

+0

新しい制約をどのように割り当てて、ここに表示できますか? – CodeChanger

+0

新しい制約を作成して割り当てるコードを含めるように質問を編集しました。しかし、それは本当に私の質問ではありません。私の質問は、どのように希望の制約を作成するコードを作成することではありません。上記のコードに示すように、私はすでにそれを知っています。代わりに、私の質問です:なぜ私は "-1"の値を割り当てることができません "乗数"のInterface Builder内で? – Kenster999

答えて

2

"Reverse First And Second Item"を選択し、乗数の絶対値を再入力=>この方法では(1番目と2番目の項目を切り替えることにより)乗数は負のように動作します。

Reverse First And Second Item

最初の項目:
2番目のアイテムをView.Leading:
2番目のアイテムをSuperview.Trailing:

normal

最初の項目Superview.Trailing View.Leadingを

reversed

+0

返事をありがとう、しかし、私はそれが正しいとは思わない、なぜなら、乗算は引数の順序によって異なる符号の結果を与えないからです。例:(320 * -1)==(-1 * 320)。 – Kenster999

+1

正の乗数を使用しなければならないので、標識についてではありません。それは、値がどこに適用されるかについてです。右に行くのは-320ポイント、左に320ポイント進むことと同じです。あなたは右に-320ポイントを行くことができないので、あなたは方向を変えなければならない=> "最初と2番目のアイテムを逆にする"。 –

+0

コメントをいただきありがとうございました。彼らは私が別の解決策を見つける手助けをしました。トレイがスライドされたとき、私はこのような先導を制約しようとしていました: "trayView.leading =(superview.trailing * -1)+ 20"あなたのコメントは、私がトレイの反対側。つまり、私は先導者の代わりに後尾を設定しました!だから解決策は "trayView.trailing =(superview.leading * 1)+ 20"になりました。もう一度ありがとう! – Kenster999

0

leading, trailing, top and bottom constraints simplyに負の値を割り当てることができます。しかし、負の値は、コードまたはInterface Builderのいずれからでも乗算器に代入することはできません。乗算器としてコードに負の値を追加すると、コンパイラによって+1とみなされ、予期しない結果が生じる可能性があります。

+0

"コードまたはインターフェースビルダーのいずれかから任意の乗数に負の値を割り当てることはできません..."あなたは何を言っていますか?それはどこにAppleのドキュメントで指定されていますか? – Kenster999

関連する問題