2

メールのような NSSplitView を実装して、ディバイダー 0 をドラッグすると、ディバイダー 1 がプッシュされるようにしたい (サブビュー 1 の幅が固定されている間にサブビュー 2 を圧縮する)。

-----------------
|   |   |       |
| 0 | 1 |   2   |
|   |   |       |
|   |   |       |
-----------------

これまでのところ、自動レイアウトを備えた単一の NSSplitView で成功したことはありません。

Instrumentsで問題を確認してみました。特定の時点 (スクリーンショットの #783) の後、制約の優先度が十分に高くなく、押し続けることができないようです。

ここに画像の説明を入力

以前に同様の構成で NSSplitView を成功させたことがありますか?

または、一般的に、この問題をさらにデバッグするためのアドバイスはありますか?

ネストされた NSSplitView を使用してこの動作を実装することを提案する人もいます。しかし、単一の NSSplitView を使用してこれを行う方法を確認したいと思います。(「Notes」アプリは単一の NSSplitView で実行されているようです)

ありがとう

明細書

私のテストコードはこちら

4

2 に答える 2

2

これには自動レイアウトは必要ありません。NSSplitView には、サブビューの「優先順位を保持する」という概念があります。ビュー 2 の保持優先度を 0 と 1 よりも小さく設定する必要があります。

于 2015-03-17T13:11:48.477 に答える
1

過去数日間に行った調査を共有したいと思います。NSSplitView を部分的に希望どおりに動作させることができます。まだ完全な解決策ではありません。しかし、うまくいけば、誰かが私ができない部分に答えるのを手伝ってくれるでしょう.

「メモ」アプリは、単一の NSSplitView を使用する可能性があります。

ここに画像の説明を入力

上のスクリーンショットは、Xcode 6 Veiw Debugger モードで実行されている「Notes」アプリを示しています。

MainSplitView と呼ばれる NSSplitView のサブクラスです。

仕切りのサイズが変更されたときに「Notes」アプリの分割ビューがどのように動作するかを調べるために、Xcode Instruments の「Cocoa Layout」機器で開き、仕切り 0 を右に移動したときの制約イベントを調べます。

ここに画像の説明を入力

制約イベントを調査し、サンプル アプリの元のバージョンを実行して生成されたログと比較しています...

ここに画像の説明を入力

主な違いは...右端のサブビューと分割ビューの左端の間の制約は、「メモ」アプリで「低い」優先度を持つことがわかりました。私のサンプルアプリでは、同様の制約に「必須」の優先度があります。

そこで、独自の MainSplitView を実装してみました。「addConstraints:」メソッドをオーバーライドして、制約に低い優先度が設定されるようにします。

- (void)addConstraints:(NSArray *)constraints {
    NSLog(@"adding constraints: %@", constraints);
    NSLayoutConstraint * theConstraint = constraints.firstObject;
    if ( theConstraint.firstItem == self.subviews.lastObject && theConstraint.secondItem == self ) {
        theConstraint.priority = NSLayoutPriorityDefaultLow;
        [super addConstraints:@[theConstraint]];
    } else {
        [super addConstraints:constraints];
    }
    NSLog(@"========== constraings affecting layout ===========");
    for (NSView * theView in self.subviews) {
        NSLog(@"view: %@\n%@", theView, [theView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal]);
    }
}

コードはこちらにあります。

変更後、私のサンプル アプリでは、分割線 0 をドラッグすると、中央のサブビューが右に押し出され、幅が維持され、右端のビューが圧縮されます。

しかし今...私は別の問題に遭遇します...

ここに画像の説明を入力

分割線 0 を移動するたびに、最大でも分割線 1 の開始位置にしか移動できません。

これは別の制約構成の問題ですか? または、カスタマイズする必要がある NSSplitView のその他の初期動作はありますか?

ヘルプ/アドバイスはありますか?

ありがとうビル

于 2014-11-05T08:06:24.117 に答える