Objective c 强制NSView以编程方式重新绘制
我的应用程序有两种不同的状态,每个状态都将用NSView表示 所以一次只显示一个视图,问题是当我在视图之间切换时,应用程序不会显示新状态,直到我手动调整窗口大小 我搜索了这个问题,找到了不止一个解决方案,但没有任何效果:Objective c 强制NSView以编程方式重新绘制,objective-c,macos,cocoa,nsview,Objective C,Macos,Cocoa,Nsview,我的应用程序有两种不同的状态,每个状态都将用NSView表示 所以一次只显示一个视图,问题是当我在视图之间切换时,应用程序不会显示新状态,直到我手动调整窗口大小 我搜索了这个问题,找到了不止一个解决方案,但没有任何效果: [myView setNeedsDisplay:YES]; [myView display]; [[myView.window contentView] setNeedsDisplay:YES]; [mySubView1 setHidden:YES]; || [mySubV
[myView setNeedsDisplay:YES];
[myView display];
[[myView.window contentView] setNeedsDisplay:YES];
[mySubView1 setHidden:YES]; || [mySubView1 removeFromSuperView];
我甚至将我的观点定义为出口,但没有任何效果
这是我的密码
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
执行子视图删除或添加操作将自动调用
setNeedsDisplay:YES
,因此手动调用它毫无效果也就不足为奇了
一些需要检查的事项:
另外,如果您正在删除视图,则无需费心调用setHidden:我找到了它,代码很好,无需调用任何重画方法,唯一的问题是任何UI操作都需要在主线程中执行 因此,最终代码将是:
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];
}
});
谢谢,伙计们。
设置需要显示:是的
是正确的方法。我尝试了,但遗憾的是没有成功:(请使用它,并显示代码在何处使用,有人可以从那里拿走,我确定。谢谢Brad,我再次检查了所有的点;我想告诉大家,当我手动调整窗口大小时,一切都很好(窗口自己重新绘制)。是的,不需要设置隐藏-我将删除它-,再次感谢:)不,问题是我必须手动调整窗口大小才能得到结果。这意味着它不是零;自动布局和原点与预期一样。只想在不让用户更改窗口大小的情况下重新绘制它