2

私は次の設定をしています:

  • の固定を定義する 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
4

1 に答える 1