0

私の既存のMacアプリはSpringsとStrutsを使用していてうまく機能しますが、NIBの1つ内の単一のビューで「自動レイアウト」を使用したいと思います。これらの制約をプログラムで提供します(IBを使用して制約を構成することは完全な悪夢であるため)。

私の質問はNSLayoutConstraint、「自動レイアウトを使用する」がオフになっているNIBにオブジェクトが含まれている場合に、ビューにオブジェクトを設定できますか?

4

1 に答える 1

0

OK、この質問に対する簡単な答えは「はい」ですNSLayoutConstraint。NIBで[自動レイアウトの使用]がオフになっている場合でも、sを使用できます。

これは私の見解のawakeFromNib方法です:

- (void)awakeFromNib
{
    NSDictionary *viewsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                     _field1, @"field1",
                                     _field2, @"field2",
                                     _field3, @"field3",
                                     nil];

    // Turn off conversion of Springs and Struts into NSLayoutConstraints for all the controls
    for (NSControl *control in [viewsDictionary allValues])
    {
        [control setTranslatesAutoresizingMaskIntoConstraints:NO];
    }

    NSString *hformat = @"H:|-4-[field1(>=48)]-[field2]-[field3(==field1)]-4-|";
    NSArray *hconstraints = [NSLayoutConstraint constraintsWithVisualFormat:hformat
                                                                    options:0
                                                                    metrics:0
                                                                      views:viewsDictionary];

    [self addConstraints:hconstraints];

    // Vertical layout (must be done for each control separately)
    for (NSString *controlName in [viewsDictionary allKeys])
    {
        NSString *vformat = [NSString stringWithFormat:@"V:|-4-[%@]", controlName];
        NSArray *vconstraints = [NSLayoutConstraint constraintsWithVisualFormat:vformat
                                                                        options:0
                                                                        metrics:0
                                                                          views:viewsDictionary];

        [self addConstraints:vconstraints];
    }
}


    // Other init
}

いくつかのメモ:

  • 上に示したよりもはるかに多くのフィールドがありました。ここに投稿するためのコードを簡略化しました。
  • 問題のビューは分割ビュー内にあり、スーパービューのサイズが変更されたときに正しくサイズ変更できるようにするために、私は呼び出しませんでした[self setTranslatesAutoresizingMaskIntoConstraints:NO];
  • 自動レイアウトを使用して拘束されているすべてのサブビューについて、SpringsとStrutsの変換を停止する必要があります。
  • 他の分割ビューペインにスクロールビューがあり、setTranslatesAutoresizingMaskIntoConstraints:NOそのスクロールビューを呼び出す必要がありました。そうしないと、例外が発生しました。
于 2013-01-23T20:16:38.330 に答える