【问题标题】:Why NSView leaves an image on superview on where it was when I move it?为什么 NSView 在我移动它时在 superview 上留下一个图像?
【发布时间】:2023-03-24 04:40:01
【问题描述】:

我正在 Mac 上开发一个小型应用程序,我需要创建自定义光标并移动它。我使用 NSImageView 来实现它。但是,当我调用 setFrameOrigin(与 setFrame 相同)时,它会将图像留在前一个位置。 这是我的代码:

@property (nonatomic, strong) NSImageView *eraserView;

这是定义

_eraserView = [[NSImageView alloc] initWithFrame:CGRectMake(100, 100, 32, 32)];
_eraserView.image = [NSImage imageNamed:@"EraserCursor"];
[self.view addSubview:_eraserView];
[_eraserView setHidden:YES];

这里是初始化。到目前为止一切顺利,但是:

- (void)setImageatPoint:(NSPoint)point
{
    [_eraserView setFrameOrigin:point];
}

- (void)hidePenImage
{
    [_eraserView setHidden:YES];
}

- (void)unhidePenImage: (BOOL)isEraser
{
    [_eraserView setHidden:NO];
}

这些是我用来改变 NSImageView 状态的方法。当触控板的相应事件发生时,它们将由另一个类使用委托调用。 但是,每次我更改 NSImageView 的状态时,它似乎都是在超级视图上绘制的。 我调试了它,发现没有额外的子视图。当我使用 setHidden 时,它对这些轨道没有影响。我认为它以某种方式对 CALayer 产生了影响,但我不知道如何修复它。

【问题讨论】:

    标签: objective-c macos nsview


    【解决方案1】:

    屏幕截图会有所帮助,但一般来说,如果您移动视图或更改所绘制视图的区域,则需要重新绘制。 要做到这一点,它取决于你的绘图是如何发生的。如果您的 drawRect 实现仅绘制视图边界的子矩形,则调用 setNeedsDisplay 可能还不够。 Cocoa 只绘制它被告知要绘制的内容。 您可以通过在应该为空的位置绘制(填充)来擦除应该为空的视图部分。这意味着在先前绘制的区域中绘制一种颜色(如果没有别的,则为 NSColor clearColor)。

    【讨论】:

    • 对不起,我无法上传截图。但是很容易想象,每次我 setFrame 到一个新的地方,一个副本图像都会留在原来的位置。而且我没有在drawRect中做任何事情。我只将 NSImageView 作为子视图添加到 NSView。如果我只想改变位置,我认为我不应该做任何关于绘画的事情。
    • 其实不止setFrame。即使我调用 setHidden:NO 让它出现,超级视图上也会留下一个“永久”图像。
    猜你喜欢
    • 2010-11-21
    • 2014-01-31
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多