発振器の選択枠が表示されない

印刷用表示 |テキストサイズ 小 |中 |大 |

Repeating Motif Wonderland

更新日 2011-10-02 | 作成日 2007-12-12

発振器の選択枠が表示されない

2008.1.28


Leopardで発振器の選択枠が消去されてしまう

 Repeating Motif Generatorの原図エディタで、表示上の問題が発生していました。六個ある原図のうち、現在どれが選択されているのかが見てわかる様に黒い枠を表示しているのですが、Leopardでそれが表示されなくなってしまったのです。

 表示されないというより、表示したものが消されてしまうと言った方が正確です。一瞬だけちらっと見えるので、描いてはいるのに消されてしまうようなのです。

 Leopardでは表示システムが変更されたのでしょうか?

oscillatorSelectionBorder.png注)この絵は選択枠がきちんと表示されている対策後の状態です

drawRect:での描画方法

 drawRect:では選択枠を描く際に、自分のフレーム外に描くために一時的にフレームを拡げるという事をやっていますが、それがいけないのかもしれません。昔はこれでよかったんですけどね。

 ソースはこんな感じです。

- (void)drawRect:(NSRect)rect
{
    NSRect bounds,frame,savedFrame;
    NSBezierPath *borderPath;

    if(enabled)
        [[NSColor blackColor] set];
    else
        [[NSColor grayColor] set];

    borderPath = [NSBezierPath bezierPathWithRect:[self bounds]];
    [borderPath stroke];

    if(![self inLiveResize])
    {
        if(enabled) [arrangedWaveform stroke];

        savedFrame = [self frame];
        frame = NSInsetRect(savedFrame,-3,-3);
        [self setFrame:frame];
        
        bounds = [self bounds];
        bounds = NSInsetRect(bounds,1,1);
        borderPath = [NSBezierPath bezierPathWithRect:bounds];
        [borderPath setLineWidth:2];
        if(showBorder && enabled)
            [[NSColor blackColor] set];
        else
            [[NSColor windowBackgroundColor] set];
        [borderPath stroke];
        
        [self setFrame:savedFrame];
    }
}

内側に描いてみる

 外に描いてはダメというなら、内側に描くしかないかと思って試してみたのですが、こうすると他のビューと大きさが不揃いになってしまいます。大きさをそろえるために本来いじる必要のない他のビューまで手を付けるのは気が進みません。
 またレイアウトが崩れるので、ビューを並べているコードまで修正が必要になってきてしまいます。

領土を主張する

 要は自分はここまで面倒を見るよと伝えればいいのではないか?と思ってクリッピングリージョンを返すメソッドを探してみました。そのものずばりのメソッドは見つからなかったのですが、代わりに visibleRectというメソッドが見つかりました。

 このメソッドで自分の領土を主張してみたところ、何とうまくいってしまいました。これが正しい方法なのかどうかはわかりませんが、drawRect:メソッドを変更せずに対応できるのはありがたいので採用する事にしました。

 2ピクセルというのは試行錯誤で決めた値です。3だと隣を浸食してしまうらしく、たまに選択枠が削られてしまう事がありました。

- (NSRect)visibleRect
{
    return  NSInsetRect([self bounds],-2,-2);
}