0

垂直のNSSplitViewがあります。下部のサブビューには、カスタムビュー(NSViewなど)とNSTextViewが含まれています。

NSViewには、その中に2つのNSButtonが含まれています。

splitViewのサイズを変更して小さくすると、ボタンを含むNSViewのサイズも変更されます。私はこの振る舞いを望まない。

私の問題をよりよく説明するために、添付の画像をご覧ください。

画像1:アプリケーション起動時のウィンドウ、すべて問題ありません

画像2:分割ビューを小さくするためにサイズを変更しました。ボタンのごく一部のみが表示されます

画像3:分割ビューを再度拡大しましたが、ご覧のとおり、NSViewは小さいままで、ボタンは表示されなくなりました(splitViewのサイズを下に変更するとNSViewが「消える」)

ここに画像の説明を入力してください

4

2 に答える 2

0

これは、Cocoa ビューの従来の仕組みに基づく悪質な問題です。私が見た最善の解決策は、分割ビューの任意の部分の最小寸法を制限することです。サブビューが決して折りたたまれない場合、それらのメトリックは別の次元に交差せず、問題なく再拡大する必要があります。

これを行うには、分割ビューのデリゲートを設定します。これにより、 が実装され- splitView:constrainMaxCoordinate:ofSubviewAt:ます。分割ビューは、分割ビューの高さで最大分割位置を残すことができることを期待してデリゲート メソッドを呼び出します (これを 2 番目の引数として渡します)。底面図の最小の高さです。

  - (CGFloat)splitView:(NSSplitView *)aSplitView
constrainMaxCoordinate:(CGFloat)proposedMin
           ofSubviewAt:(NSInteger)dividerIndex {

    return proposedMin - 60;
}

もちろん、このメソッドでさらにチェックを行い、適切な分割ビューと適切なサブビューについて話していることを確認して、効果が行き過ぎないようにする必要があるかもしれませんこれが基本的な考え方です。

(このテーマに関する素晴らしい記事も参照してください。)

于 2012-05-01T23:47:20.983 に答える
0

サブビューをアニメーション化していて、サブビューを折りたたむことができるため、私の場合、仕切りの位置を制限しても役に立ちませんでした。

サブビューを非表示に設定して最小幅を維持するために、splitView デリゲート メソッド -splitviewWillResizeSubviews: を実装することで、受け入れ可能な解決策を達成することができました (つまり、デリゲート プロパティを IB またはコードでコントローラーに接続する必要があります)。ゼロに縮小する代わりに:

- (void)splitViewWillResizeSubviews:(NSNotification *)notification {
    NSUInteger divider = [[[notification userInfo] valueForKey:@"NSSplitViewDividerIndex"] intValue];
    NSView *subview = nil;
    if(divider == SPLITVIEW_DIVIDER_SIDEBAR) {
        subview = (NSView*)[self.splitView.subviews objectAtIndex:SPLITVIEW_SIDEBAR_INDEX];
    }
    if(subview) {
        if(subview.frame.size.width < SPLITVIEW_MINIMUM_SIDEBAR_WIDTH) {
            CGRect correctedFrame = subview.frame;
            correctedFrame.size.width = SPLITVIEW_MINIMUM_SIDEBAR_WIDTH;
            subview.frame = correctedFrame;
            subview.hidden = YES;
        } else {
            subview.hidden = NO;
        }
    }
}
于 2012-07-17T12:53:41.217 に答える