1

NSView での描画に関する実験を行うために、まったく新しいプロジェクト GrafLaboratory を開始しました。メイン ウィンドウにカスタム ビューを追加し、ウィンドウのサイズが変更されたときにそのサイズを採用するように構成しました。

InitFrameWith を次のように変更しました。

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSRect r = [self bounds];
    }

    return self;
}

新しいアプリを初めて起動して [自己境界] を要求すると、正しい値が得られます: {{0, 50}, {600, 450}}。次に、マウスでドラッグしてウィンドウのサイズを変更します。アプリを再起動すると、initWithFrame は同じ値を返します: {{0, 50}, {600, 450}}。

しかし、私は新しいサイズを変更しました。私はすでにいくつかのことを試しましたが、成功しませんでした。

私が間違っている手がかりはありますか?

ありがとう、ロナルド

4

1 に答える 1

2

initWithFrame は、フレーム内でオブジェクトを初期化する場合にのみ関連します。

カスタム描画を使用したカスタム UIView の場合は、次を参照してください。

- (void)drawRect:(NSRect)frame

setNeedsDisplay が呼び出されたとき、および/またはビューのサイズが変更されたときに呼び出されます。

いくつかのカスタム ビューで、initWithFrame で行ったことの 1 つは、自動サイズ変更マスクを設定することです。

    // subviews autoresize
    [self setAutoresizesSubviews:YES];   
    // set resize masks (springs)
    [self setAutoresizingMask:(NSViewMaxXMargin | NSViewMinXMargin |
                              NSViewMaxYMargin | NSViewMinYMargin |
                              NSViewHeightSizable | NSViewWidthSizable)];

次に、init と drawRect の両方で、rect が変更された場合に layoutViews メソッドを呼び出します。

- (void)drawRect:(NSRect)frame {
    ...
    // called on resize.  on init, delegate isn't hooked up so we'll skip
    if (!NSEqualRects(_prevRect, [self bounds]))
    {
        [self layoutViews];
    }

    // stash away rect for comparison so layout view code only happens when the rect changes
    _prevRect = [self bounds];

私のlayoutViewsにはカスタムレイアウトロジックがあります。

それが役立つことを願っています。

于 2012-10-11T03:59:45.800 に答える