繁体   English   中英

强制NSView以编程方式重绘

[英]Force NSView to redraw programmatically

我的应用程序有两种不同的状态,每个状态都代表一个NSView。

因此,一次只显示一个视图,问题是当我在视图之间切换时,应用程序不显示新状态,直到我手动调整窗口大小!

我搜索了这个问题,并提供了多个解决方案,但没有任何对我有用:

[myView setNeedsDisplay:YES];
[myView display];
[[myView.window contentView] setNeedsDisplay:YES];


[mySubView1 setHidden:YES]; || [mySubView1 removeFromSuperView];

我甚至将myView定义为Outlet,但没有任何效果。

这是我的代码

if (appState == 1) {

    [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 250)];

    [self.mySubView1 setHidden:NO];
    [self.mySubView2 setHidden:YES];

    [self.mySubView2 removeFromSuperview];
    [self.mySubView1 addSubview:self.inCallView];
}
else
{
    [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 70)];

    [self.mySubView1 setHidden:YES];
    [self.mySubView2 setHidden:NO];

    [self.mySubView1 removeFromSuperview];
    [self.mySubView2 addSubview:self.chatHeaderView];
}
// I need to redraw here
[self.view setNeedsDisplay:YES];
[self.mySubView1 setNeedsDisplay:YES];
[self.mySubView2 setNeedsDisplay:YES];
// and nothing happened until I resize my window manually 

我发现它,代码很好,无需调用任何重绘方法,唯一的问题任何UI操作都需要在MAIN线程中完成

所以最终的代码是:

dispatch_async( dispatch_get_main_queue(), ^{
    if (appState == 1) {
        [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 250)];

        [self.mySubView1 setHidden:NO];
        [self.mySubView2 setHidden:YES];
    }
    else
    {
        [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 70)];

        [self.mySubView1 setHidden:YES];
        [self.mySubView2 setHidden:NO];
    }
});

多谢你们。

执行子视图删除或添加操作将自动调用setNeedsDisplay:YES所以毫不奇怪,手动调用它没有任何效果。

一些要检查的事情:

  1. 检查您的视图属性是否为零值。 我看到你正在移除视图,这将导致superview释放它,如果你没有保留它具有强大的属性(或其他地方),它将被释放。
  2. 确保你没有与autolayout作斗争。 暂时关闭自动布局以确认它不会导致您的问题。
  3. 你只是设置框架大小。 你需要确保它也有预期的起源。

此外,如果要删除视图,则无需打扰调用setHidden:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM