2

私は次のように見えるIBで6つのユーザー制約を設定しています:

H:|-(593)-[UIView(411)]-(20)-|
V:|-(20)-[UIView(288)]-(396)-|

制約を変更してからlayoutIfNeededを呼び出すことにより、ビューを拡大および縮小します。たとえば、ビューを拡大するには、次のようにします。

H:|-(20)-[UIView(984)]-(20)-|
V:|-(20)-[UIView(663)]-(20)-|

そして、

[UIView animateWithDuration:.5 animations:^{
    [self.view layoutIfNeeded];
}];

このテクニックは私の見方を拡大したり縮小したりします、そしてそれは見栄えがします、しかし私はかなり紛らわしい警告を与えられます:

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x148d5af0 H:[UIView:0x148d4e50(411)]>",
    "<NSLayoutConstraint:0x148cc940 H:[UITableView:0xace7600(319)]>",
    "<NSLayoutConstraint:0x148ce040 H:|-(NSSpace(20))-[UITableView:0xacd4e00]   (Names: '|':UIView:0x148cddd0 )>",
    "<NSLayoutConstraint:0x148cdf00 H:[UITableView:0xace7600]-(NSSpace(20))-|   (Names: '|':UIView:0x148cddd0 )>",
    "<NSLayoutConstraint:0x148cdea0 H:[UITableView:0xacd4e00]-(NSSpace(8))-[UITableView:0xace7600]>",
    "<NSLayoutConstraint:0x148d4c10 UIView:0x148cddd0.trailing == UIView:0x148cdd40.trailing>",
    "<NSLayoutConstraint:0x148d4b90 H:|-(0)-[UIView:0x148cddd0]   (Names: '|':UIView:0x148cdd40 )>",
    "<NSLayoutConstraint:0x148d6020 H:|-(320)-[UIView:0x148cdd40]   (Names: '|':UIView:0x148cd330 )>",
    "<NSLayoutConstraint:0x148d5fa0 UIView:0x148cdd40.trailing == UIView:0x148cd330.trailing>",
    "<NSLayoutConstraint:0x148d5f60 H:[UIView:0x148d4e50]-(NSSpace(20))-|   (Names: '|':UIView:0x148cd330 )>",
    "<NSLayoutConstraint:0x148d5ee0 H:|-(20)-[UIView:0x148d4e50]   (Names: '|':UIView:0x148cd330 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x148cc940 H:[UITableView:0xace7600(319)]>

現在、これらの制約はすべてIBによって生成されます。私はこれをdouble^(triple!)チェックしました。私はこれらの制約をペンと紙でまとめて、これを手に入れました:

UIView_A H:[-(20)-[UIView_E]-(20)-] and H:[-(320)-(UIView_B)
UIView_B H:[-(0)-[UIView_D]
UIView_C H:[UIView_C(411)]
UIView_D H:[-(20)-[UITableView_F]-[UITableView_G(319)]-(20)-]

これらの制約をどのように満たすことができないのかわかりません。彼らは元気に見えます。私はそれらを変更せず、それらはIBによって生成されます。IBによって生成された制約は自動的に満たされませんか?

または、少なくとも、警告を停止する方法はありますか?それは完璧に動作し、とにかく何もしないように見える制約を破っていることを確認する必要はありません。

4

3 に答える 3

4

この制約:

H:[UITableView:0xace7600(319)]> "

システム解決の障害のようです。

取り外せますか?

于 2013-03-06T20:45:48.660 に答える
3

したがって、制約を変更する順序が重要であることがわかります。

ビューを拡大するために、私は

  1. 幅を広げます:H:|-(593)-[UIView(984)]-(20)-|
  2. 先頭のスペースを減らします:H:|-(20)-[UIView(984)]-(20)-|

これは警告を生成しません。ただし、これを逆の順序で実行すると、警告が表示されます。

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints ...

...Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1567f650 H:[UITableView:0x119e6200(319)]>

ビューを縮小するときに、幅を拡大したコードを(同じ順序で)コピーし、値を変更しただけです。それは私が私の最初の質問で投稿した警告を私に与えました。縮小の順番を入れ替えると、警告が消えました。


なぜそうなのですか?知らない。もっと発見したら更新します。

于 2013-03-07T17:03:20.467 に答える
0

私は同じメッセージを受け取りました、そして私はついにそれが起こる理由を知りました、
私の解決策は次のとおりです:アニメーションのどの瞬間でもオブジェクトをひっくり返させないでください。

言い換えると、コンストレイントはオブジェクトの外側にある必要がありますが、アニメーション中に制約が内側にある場合があります。これは、私たちの予想とは異なります。

つまり、コンストレイントアニメーションのために上マージンが下マージンに侵入しないようにしてください。

例えば、

     top constraint: topA = initially 100

                    [Box A]

     bottom constraint: botA = initially 150

さて、以下のように設定してアニメートすると、

      topA = 300
      botA = 25  

その後、エラーが発生するはずです。理由:下マージンが下がる前にスレッドが下マージンに侵入します。だから、あなたはむしろ順序を変更したい、

      botA = 25
      topA = 300

次に、下部のコンストレイントがマスの高さを保持し、次の上部のコンストレイントがオブジェクトの高さを縮小して下部マージンに侵入しないため、エラーは消えます。

*ポイント:オブジェクトの幅と高さを、アニメーション中でも継続的に0より大きくし、制約の変更によって中断されないようにします。

お役に立てば幸いです。

于 2013-10-01T06:11:37.500 に答える