AutoLayout学習ノート(一)
1715 ワード
曖昧なレイアウトのデバッグ
1.hasAmbiguousLayoutを使用して制約が十分かどうかをテスト
コンストレイントが十分であればNOを返し、ビューに別のフレームが表示される可能性がある場合はYESを返します。
2.ビューの内容の大きさは、各ビューのintrinsicContentSize属性で表現する
UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageWithName:@"icon.png"]];
NSLog(@"%@", NSStringFromCGSize(iv.intrinsicContentSize));
結果出力のサイズはピクチャiconサイズと同じです
曖昧なレイアウトでは、通常、各座標軸に2つのアトリビュートを設定する必要があります。当時、図には1つのコンテンツが大きい場合、2つのプロパティのうちの1つを設定するだけです。たとえば、テキストベースのコントロールまたは画像ビューを親ビューの中心に配置することができ、そのレイアウトは曖昧なレイアウトではありません。内在的なコンテンツサイズとビュー位置は共に十分に定められたレイアウトを構成している.
ビューの内部コンテンツを変更する場合は、=i n v a l i d ateIntrinsicContentSize==メソッドを呼び出し、AutoLayoutに次のレイアウトで再計算することを知らせる必要があります。
3.長方形と画像全体の境界を揃えることを知っていれば、この方法に渡す必要があるエッジinsetを自動的に計算することができる。
UIEdgeInsets BuildInsets(CGRect alignmentRect , CGRect imageBounds){
//Ensure alignment rect is fully within source,CGRectIntersection
CGRect targetRect = CGRectIntersection(alignmentRect,imageBounds);
//Calculate insets
UIEdgeInsets insets;
insets.left = CGRectGetMinX(targetRect) - CGRectGetMinX(imageBounds);
insets.right = CGRectGetMaxX(imageBounds) - CGRectGetMaxX(targetRect);
insets.top = CGRectGetMinY(targetRect) - CGRectGetMinY(imageBounds);
insets.bottom = CGRectGetMaxY(imageBounds) - CGRectGetMaxY(targetRect);
return insets;
}
4. translatesAutoresizingMaskIntoConstraints = NO;
コードセグメント全体でt r a n s l a t e s t o u r s e z i n g MaskIntoConstraintsをNOに設定すると、デフォルトの初期値は実質的に破棄され(例えば、初期のframeサイズが先に設定されている)、幅が0になる可能性があります。
UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageWithName:@"icon.png"]];
NSLog(@"%@", NSStringFromCGSize(iv.intrinsicContentSize));
UIEdgeInsets BuildInsets(CGRect alignmentRect , CGRect imageBounds){
//Ensure alignment rect is fully within source,CGRectIntersection
CGRect targetRect = CGRectIntersection(alignmentRect,imageBounds);
//Calculate insets
UIEdgeInsets insets;
insets.left = CGRectGetMinX(targetRect) - CGRectGetMinX(imageBounds);
insets.right = CGRectGetMaxX(imageBounds) - CGRectGetMaxX(targetRect);
insets.top = CGRectGetMinY(targetRect) - CGRectGetMinY(imageBounds);
insets.bottom = CGRectGetMaxY(imageBounds) - CGRectGetMaxY(targetRect);
return insets;
}