【问题标题】:NSImageView drawing incorrectlyNSImageView 绘制不正确
【发布时间】:2011-05-29 11:04:56
【问题描述】:

我创建了一个自定义的 NSView 子类来控制 2 个 NSImageView。创建图片的代码如下:

- (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) 的矩形中绘制时,它会以奇怪的偏移量绘制 theMap,因此 theGuy 的原点位于 128,0,但 theMap 的原点位于 (128,20) 之类的位置。我找不到发生这种情况的任何原因。

【问题讨论】:

    标签: objective-c cocoa nsimageview


    【解决方案1】:

    我的猜测是你有重叠的兄弟视图:

    • theMap 有框架{{0.0, 0.0}, {frameRect.size.width, frameRect.size.height}}
    • theGuy 有框架 {{0.0, 0.0}, {64.0, 64.0}}
    • theMaptheGuy 都(或似乎)添加到同一个超级视图,即 self,并且具有相同的来源。

    Cocoa 不保证重叠同级视图的正确行为,即具有相同直接父视图且对应帧重叠的两个视图。来自View Programming Guide

    注意:出于性能原因,Cocoa 不强制在同级视图之间进行剪辑,也不保证在同级视图重叠时正确的失效和绘制行为。如果你想在另一个视图前面绘制一个视图,你应该让前视图成为后视图的子视图(或后代)。

    根据this answer to another question on Stack Overflow,另一种解决方案是为视图打开图层。

    【讨论】:

      【解决方案2】:

      快速思考 - 奇怪的地图偏移是不是意外地成为地图的一部分 NSImage

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 2014-01-19
        • 1970-01-01
        相关资源
        最近更新 更多