私は次の設定をしています:
- の固定を定義する UIView のカスタム
intrinsicContentSize
サブクラス(50,50)
- 新しいアプリのウィンドウの唯一のサブビューとしてのこのビューのインスタンス
- ビューからウィンドウへの水平方向および垂直方向のセンタリング制約
予想どおり、これにより、アプリのウィンドウの中央に 50x50 のビューが表示されます。今、私が両方の場合:
- ビューに必要な幅の制約を 100pt 定数で追加し、
- 横軸に沿って、ビューのコンテンツ ハグの優先度を必須に設定します。
...自動レイアウト システムが例外をスローしないのはなぜですか?
このようなシステムでは、ビューの幅が 50pts (固有のコンテンツの幅が 50pts であり、ハグの優先度が必要なため) と 100pts の幅 (100pts で明示的な幅の制約が必要であるため) の両方が必要になると予想されます。一貫性がありません。代わりに、ビューは喜んで 100pts 幅であり、(一見) コンテンツがハグすることは考慮されていません。
この結果を再現するために使用するコードのバッチ全体 (新しい空のアプリケーションの app delegate .m ファイル内):
@interface TEFixedSizeView : UIView
@end
@implementation TEFixedSizeView
- (CGSize)intrinsicContentSize;
{
return (CGSize){.width = 50.0f, .height = 50.0f};
}
@end
@implementation TEAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
TEFixedSizeView *view = [[TEFixedSizeView alloc] init];
view.translatesAutoresizingMaskIntoConstraints = NO;
view.backgroundColor = [UIColor redColor];
[self.window addSubview:view];
[self.window addConstraint:[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.window
attribute:NSLayoutAttributeCenterX
multiplier:1.0f
constant:0.0f]];
[self.window addConstraint:[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.window
attribute:NSLayoutAttributeCenterY
multiplier:1.0f
constant:0.0f]];
[view setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
[view addConstraint:[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:0.0f
constant:100.0f]];
[self.window makeKeyAndVisible];
return YES;
}
@end