3

ラベルとボタンがたくさんあるシーンがあります。ボタンをタップすると、コントロールを含むビューが下から上にスライドします。いわばキーボードのようなものです。次のように「見えます」:

 -----------------------------
|                             |
|  [Button 1] [  Slider 1  ]  |
|                             |
|  [Button 2] [  Slider 2  ]  |
|                             |
 -----------------------------

この「キーボード」は、ビューがロードされ、アニメーションが完了し、その高さを 0 から固有のコンテンツ サイズに切り替える最初の段階で作成されます。この escene はランドスケープ モードのみをサポートし、デバイスが 180 度回転したときに "キーボード" をビューに表示し続けるのにかなりの時間がかかりました。

私が見る問題は、次の 2 つの状況のいずれかで発生します。

  1. デバイスは 180 度回転します。
  2. 「キーボード」と呼ばれます。

この問題は次のとおりです。

Unable to simultaneously satisfy constraints...
.
.
.
.
(
    "<NSLayoutConstraint:0x718c6c0 UIButton:0x717e0d0.centerY == UISlider:0x717d9d0.centerY>",
    "<NSLayoutConstraint:0x7190a00 UIButton:0x717e0d0.centerY == UISlider:0x717d9d0.centerY>"
)

エラー ログには、ボタン スライダーのセットごとに 1 回ずつ、このエラーが 2 回表示されます。

私が奇妙だと思うのは、矛盾する制約がまったく同じであることです。コピペミスをして同じ制約を2回追加したと思ったのですが、そうではありません。

回転時に updateViewConstraints が呼び出されることと、アニメーションを実行することと関係があると思いますが、この「キーボード」ビューには他にもいくつかあるため、これらの制約のみが影響を受ける理由はわかりません。

結局のところ、この Autolayout は、Apple が主張するよりもかなり難しいものです。もちろん、私の意見では。

何か案は?

編集: 制約はすべて、主にビジュアル言語形式を使用してコードで設定されます。「キーボード」内のコントロールの制約は、「キーボード」ビューに追加されます。これは通常行うことだと思います。

試してみるために、問題のある制約を変更し、それらを「キーボード」サブビューに追加する代わりに、self.view (「キーボード」スーパービュー) に追加しました。突然、エラーが表示されなくなりました。

それにもかかわらず、何が問題なのかまだわからず、幸運なショットを打っただけなので、この問題について議論したいと思います. 私は本当にそれを理解したいです。

4

2 に答える 2

2

競合する制約がまったく同じであるという事実は、実際にはエラーです。自動レイアウトでは、制約を 2 回持つことはできません。これにより、上記のエラーが生成されます。

確かに、制約を 2 回追加しました。これは、メモリ アドレスから確認できます。と の 2 つの異なるNSLayoutConstraintインスタンスが0x718c6c0あり0x7190a00ます。ただし、それぞれが参照するインスタンスは両方とも同じです。つまりcenterYUIButtonインスタンスの垂直方向の中心が の中央に0x717e0d0ある必要がありますUISlider 0x717d9d0

updateConstraintsメソッドが呼び出され、再度追加する前に制約が既に存在するかどうかを確認していない可能性があります。

于 2013-07-11T15:18:08.190 に答える
1

これが役立つかどうかはわかりませんが、このチュートリアルを使用して、アプリのボタンとラベルに制約を設定しました

于 2013-11-06T18:06:12.350 に答える