1

私が考える非常に単純な質問:

1UIViewController

1つのカスタムUIView

コントローラーは次のことのみを行います。

-(void)loadView{
   [super loadView];
   self.sideMenu = [[sideMenuView alloc]init];
   [self.view addSubview:self.sideMenu];
}

そして、UIView私は次のようなことをしたいと思います:

      self.translatesAutoresizingMaskIntoConstraints = NO;

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeLeading multiplier:1 constant:100];
[self.superview addConstraint:constraint];

そのため、コントローラーで UIView を作成すると、その制約は既にコントローラーに関連して設定されています。

私は試してみましたが、何もクラッシュしませんでしたが、UIViewxとyの座標が本当に奇妙になります

多分私は制約を更新する必要がありますか? それとも、これはまったく不可能ですか?

4

3 に答える 3

3

ビューの先頭のスペースをスーパービューの先頭のスペースに結び付けようとしているように見えるため、正確に探しているUIの動作がわかりません。先頭のスペース、ビューの左側のスペースであるということは、より一般的な「両親の左の境界線から 100 ピクセルの左側を貼り付ける」ことを探しているということでしょうか? とにかく、どちらの場合も、コントローラーからカスタム ビュー (つまり、以下の myCustomView) にアウトレットを接続し、オーバーライドして UIView ではなく UIViewController に制約を作成します。

- (void)updateViewConstraints {
    [super updateViewConstraints];
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:myCustomView
                                                                  attribute:NSLayoutAttributeLeading
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:myCustomView.superview
                                                                  attribute:NSLayoutAttributeLeading
                                                                 multiplier:1
                                                                   constant:100];
    [myCustomView addConstraint:constraint];
}

Apple には、このアドレスに自動レイアウトのさまざまなランタイム エントリ ポイントを示す表を含む興味深いページがあります: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/Articles/runtime.html#// apple_ref/doc/uid/TP40010853-CH6-SW1

他の制約を追加することも検討してください。自動レイアウトは、可能な限り最悪の方法で未チェックのままにしておく自由を悪用する傾向があります;-)

于 2013-09-08T00:50:25.683 に答える
1

そのため、リーディング エッジが十分ではありません。垂直方向と水平方向のレイアウトを満たすには、十分な制約が必要です。

一方向では、少なくとも必要です

1 つのエッジと幅 (または高さ) または 2 つのエッジ (暗黙的な幅または高さ) または 水平 (または垂直) 中心ベースの制約と明示的な幅 (または高さ)

幅と高さについては、固有のコンテンツ サイズによっても決定できるということです。

ビューをスーパービューに追加した後、制約を追加します。

于 2013-09-08T01:00:39.280 に答える
0

少し遅れましたが、PureLayout はかなり便利ですhttps://github.com/smileyborg/PureLayout

于 2015-04-17T22:52:50.090 に答える