0

2つのNSImageViewを制御するために、NSViewのカスタムサブクラスを作成しました。イメージを作成するためのコードは次のとおりです。

- (id)initWithFrame:(NSRect)frameRect AndMap:(NSImage *)map AndPlayer:(NSImage *)guyImage
{
    self = [super initWithFrame:frameRect];
    if (self)
    {
        NSRect newRect = NSMakeRect(0.0, 0.0, 64.0, 64.0);

        NSImageView *theMap = [[NSImageView alloc] initWithFrame:NSMakeRect(0.0, 0.0, frameRect.size.width, frameRect.size.height)];
        [theMap setImage:map];

        NSImageView *theGuy = [[NSImageView alloc] initWithFrame:newRect];
        [theGuy setImage:guyImage];

        [self setMapImage:theMap];
        [self setPlayerView:theGuy];
        [self addSubview:[self mapImage]];
        [self addSubview:[self playerView]];

ただし、原点が(128,0)の長方形で描画するようにビューに指示すると、奇妙なオフセットでマップが描画されるため、Guyの原点は128,0になりますが、マップの原点は( 128,0 )のようになります。 128,20)。これが発生する理由がわかりません。

4

2 に答える 2

2

私の推測では、兄弟ビューが重複していると思います。

  • theMapフレームあり{{0.0, 0.0}, {frameRect.size.width, frameRect.size.height}}
  • theGuyフレームあり{{0.0, 0.0}, {64.0, 64.0}}
  • theMapとの両方theGuyが同じスーパービュー、つまりselfに追加されている (または追加されているように見える) と、同じ起源を持っています。

Cocoa は、重複する兄弟ビュー、つまり、同じ直接スーパービューを持ち、対応するフレームが重複する 2 つのビューの正しい動作を保証しません。ビュープログラミングガイドから:

注:パフォーマンス上の理由から、Cocoa は兄弟ビュー間のクリッピングを強制したり、兄弟ビューがオーバーラップした場合の正しい無効化や描画動作を保証したりしません。ビューを別のビューの前面に描画する場合は、前面ビューを背面ビューのサブビュー (または子孫) にする必要があります。

Stack Overflow に関する別の質問に対するこの回答によると、別の解決策の 1 つは、ビューのレイヤーをオンにすることです。

于 2011-05-29T03:03:36.930 に答える
0

簡単な考え-奇妙なマップオフセットは誤ってマップの一部ではありませんNSImageか?

于 2011-05-29T02:35:11.133 に答える