我的应用程序有两种不同的状态,每个状态都代表一个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
答案 0 :(得分:8)
我发现它,代码很好,无需调用任何重绘方法,唯一的问题任何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];
}
});
谢谢,伙计们。
答案 1 :(得分:2)
执行子视图删除或添加操作会自动调用setNeedsDisplay:YES
,因此手动调用它并不会产生任何影响。
要检查的一些事情:
此外,如果您要移除视图,则无需打扰调用setHidden: