1

Interface Builder で NSWindow を作成しました。このウィンドウの内側には NSScrollView があり、その内側にはカスタム NSView があります。

NSScrollview は NSWindow を埋め、カスタム NSView は NSScrollview を埋めます。

カスタム NSView が awakeFromNib メソッドに送信されると、その境界は予想どおり 0,0 および 256x373 になり、スクロールビューがいっぱいになります。

ただし、後で NSView のサイズを 373high より大きく変更しましたが、スクロールビューのサイズは変更されません。フレームを設定しようとしましたが、境界を設定しようとしましたが、何も変更されません。

カスタムNSViewのintrinsicSizeを変更しようとしたときを除いて、それは変更されましたが、NSWindowとNSScrollviewのサイズも256x1452の新しいサイズに合わせて変更されました

どこが間違っているのか誰か教えてもらえますか? ScrollviewまたはNSViewに設定された制約と関係がありますか? 何も設定していませんが、Interface Builder でアイテムを追加すると、自動的に追加されました

[編集]

カスタム NSView がプログラムで作成され、setDocumentView: を使用して NSScrollView に追加されるように変更しました。すべてが期待どおりに機能します。技術的には問題を解決したと思いますが、もし誰かが知っていれば、Interface Builder を介して機能しない理由について説明したいと思います。

4

1 に答える 1

1

私は部分的な解決策を持っています。これにより、追加の質問が発生します。同様の問題があり、NSScrollView に埋め込まれたビューのサイズをプログラムで変更する必要がありました。

このコードは機能します。両方の方法が必要です

-(void)markViewSizeChanged /* Works correctly */
{
    [self setFrameSize:currentViewSize];
    [self setBoundsSize:currentViewSize];
    [self setNeedsDisplay:YES];
}


-(NSSize)intrinsicContentSize // Override of class method
{
    return currentViewSize;
}

注: awakeFromNib で currentViewSize を設定する必要があります

さて、好奇心旺盛な部分です。フレームと境界を設定する 2 つの呼び出しの順序を逆にすると、埋め込まれたビューのサイズは正しくなりますが、描画されるオブジェクトの倍率はオフになります。

-(void)markViewSizeChanged /* DOES NOT work correctly, scaling in drawing off */
{
    [self setBoundsSize:currentViewSize];
    [self setFrameSize:currentViewSize];
    [self setNeedsDisplay:YES];
}
于 2014-05-03T01:43:53.787 に答える