2016-06-18 9 views
1

私はそれぞれ14文字の異なるボタンがあります。また、すべてのボタンが自動レイアウトで接続されています。だから、狂ったたくさんの制約があります。説明のための最初の画像を参照してください:私のプログラムでは、自動レイアウトとアニメーション

enter image description here

しかし、私は、全体のオートレイアウトの設定をめちゃくちゃにせずにUIAnimationを前後に一つ一つのボタンを移動できるようにしたいです。私がやりたいことは、説明のための第2の画像を参照してください。

self.letterA.translatesAutoresizingMaskIntoConstraints = YES; 
[UIView animateWithDuration:0.2 animations:^{ 
    [letterA setFrame:CGRectMake(x, y, width, height)]; 
}]; 

今すぐプログラムが完璧に動作します:

enter image description here

今のコードは、私は現在、これらのアニメーションを取得するために使用!全く問題はありません!

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) 

そして、この警告/エラー/問題がUIButtonが移動される毎回、およびオンと何回かに行く:しかし、唯一の「問題」は、このコードは、コンソールでこのメッセージを生成しています。今私は何をすべきですか?

  1. Unable to simultaneously satisfy constraintsを無視できますか?それとも、それは道路のトラブルを引き起こすでしょうか?
  2. もしそうでなければ、それを修正するには?そして狂った量の制約がかかわっているので、どのように単一の制約を編集することなく修正することができますか?
  3. 私は非常にあなたが自動レイアウトを使用している場合はfalseにtranslateAutoResizingMaskを設定する必要がありsetFrame:

答えて

2

  1. それはUIが希望として多かれ少なかれ見えても、これを無視することは本当に悪い考えです 番号を「私はできませんが、同時に警告制約を満たすために無視することができます」警告を出してもそれにする。これは、あなたが提供した指示が矛盾しているので、システムがあなたのレイアウトをどのようにレンダリングするかを決定していることを意味します。あなたが提供した制約を分析して、それらの1つまたは複数を破ることによって一貫したレイアウトを作成する方法を見つけました。異なる画面サイズまたはOSバージョンで同じ制約を破ることを決定する保証はありません。この警告を無視すると、UIのバグの可能性が大幅に高まります。

  2. 私はこのUIが設計されている方法を考え直したいと思います。 IB/Storyboard Autolayoutは、あるレベルの複雑さまで、UIに対してうまく機能します。このUIは、複雑さのレベルを少し上回っているように見えます。タイルを移動する必要がなければ、それは問題ありません。そうであるように、プログラムによるオートレイアウトは事をより簡単にするかもしれません。 私が取るアプローチは以下の通りです。

    a。上、左、幅、高さの制約のためにNSLayoutConstraintのプロパティを公開するタイルオブジェクトを作成します。 (これらの制約はスーパービューに追加されますが、タイル自体にも保存されます)。

    b。新しいタイルの開始位置のオフセット、幅、高さをパラメータとしてファクトリオブジェクトメソッドを使用してビューを設定します。これらの値を使用して、各タイルに個別に制約を設定します。すべての制約は、内部(幅、高さ)またはスーパービュー(x、y)のどちらかでなければなりません。つまり、変更をアニメートすると、1つのタイルだけが影響を受けます。実際にはより多くの制約がありますが、コード内にあり、管理が容易です。

    c)。 UIViewのアニメーションを使用してタイルを移動し、タイルの拘束を使用してタイルをサイズ変更します。タイル位置ごとに初期フレームを格納し、それらの値を使用してターゲット制約値を決定することができます。この方法でタイルの位置とサイズを簡単にサイズ変更することができます。

    d)。 NSLayoutConstraintのAppleのAPIは少し冗長で醜いです。あなたのコードをきれいに保つために、より良いAutolayout DSLのMasonryを使用することを検討してください。

  3. Autolayoutを使用しない限り、-setFrame:を引き続き使用できます.2つのアプローチはうまくいっていません。アプリを複数の画面サイズで実行したい場合は、Autolayoutを使用するか、コード内ですべてのフレームとオフセットを動的に再計算する必要があります。あなたがしていない場合は(おそらくそれはiPadアプリであり、あなたはプロについて気にしない、ちょうど-setFrame:を使用する)。しかし、バランスを取って、弾丸を噛んで、Autolayoutを学ぶことをアドバイスします。

1

を使用してアニメーション維持したいと思いますそうしないと、このエラーを取得し続けます。代わりに、アニメーションブロックの前にのみ制約を使用して新しい場所を設定し、アニメーションブロックでlayoutIfNeededを呼び出す必要があります。 translateAutoResizingMaskToConstraintsを自動的にfalseに設定するという効果を持つインターフェイスビルダの制約を設定するとき。あなたのポイントに

関連する問題