1

ViewController のビューに対応する XIB ファイルで、Autolayout をオンにして、ボタンをドラッグして任意の場所に配置し、Interface Builder がボタンとそのスーパービュー (つまり、VC の見る)。ビュー コントローラーの .m ファイルで、これら 2 つの制約に対する IBOutlets を作成し、viewDidLoad メソッドで、それらを VC のビュー[self.view removeConstraint:self.vConstraint]などから削除します (いいえ、アウトレット接続を作成することを忘れていませんでした)。

アプリを実行すると、Xcode (それが重要な場合はバージョン 4.5.1) がレイアウトがあいまいであると文句を言うと思いますが、驚くべきことに (私にとって) そうではありません。

では、ボタンのフレームの原点はどのように計算されるのでしょうか? ボタンは、Interface Builder でドロップされた位置のスーパービューに表示されますが、この状況で Autolayout が何をしているのかを正確に知りたいです (できれば公式ドキュメントを参照してください)。

4

1 に答える 1

1

これに関する正確なドキュメントやその他の参考文献を見つけるのは難しいようです。Advanced Auto Layout Toolboxの Florian Kugler のページを見ると、すばらしい情報がいくつかありました。これは興味深い質問だと思ったので、掘り下げてみました。

UIButton myButtonXibのセットアップといくつかのスペース制約アウトレットを使用して、テスト プロジェクトをセットアップしました。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *hSpaceConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *vSpaceConstraint;

あなたが述べたように、これらの制約を削除しviewDidLoadても効果はありませんでした。[self.myButton hasAmbiguousLayout]の制約を削除した直後に出力しても、 viewDidLoadfalse が表示されます。

しかし、 によってviewDidAppear、状況は変わりました。両方によって、またlldbで自動レイアウトトレースを実行することによってmyButton、あいまいであると正しくフラグ付けされます。hasAmbiguousLayout

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]

*<UIWindow:0x8a94fe0> - AMBIGUOUS LAYOUT
|   *<UIView:0x8c55340>
|   |   *<UIRoundedRectButton:0x8c54100> - AMBIGUOUS LAYOUT
|   |   |   <UIImageView:0x8c54580>
|   |   |   <UIButtonLabel:0x8c595a0>
(lldb)

この段階で、あいまいさを行使することもできます。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.myButton exerciseAmbiguityInLayout];
}

運動しない場合: 運動 する場合ここに画像の説明を入力 : ここに画像の説明を入力

コンソールにも何もありません。問題の最初の兆候で大量の制約例外を散発する自動レイアウトに慣れているので、これは私を驚かせました。

それを調査して、ここでSOをすばやく検索すると、

「あいまいさは一時的に許容できます(すぐに例外を発生させる不満足とは異なります)」

少なくとも今のところ、これで明確なコンソールが説明されました。

結論viewDidLoadとして、実行するまでに、測定、レイアウト、および表示のパスは既に発生していると思います。制約を削除すると、ビューがあいまいになります。次に、Auto Layout は、レイアウトの仕方がわからなくなったビューで常識的なことを行います。何もありません。景色はそのままです。

于 2013-12-23T14:49:39.253 に答える