gpt4 book ai didi

objective-c - 强制 NSView 以编程方式重绘

转载 作者:太空狗 更新时间:2023-10-30 03:41:33 25 4
gpt4 key购买 nike

我的应用有两个不同的状态,每个状态都用一个 NSView 表示。

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

我搜索了这个问题并提出了不止一种解决方案,但没有任何效果:

[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操作都需要在主线程中完成

所以最终代码将是:

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];
}
});

谢谢,伙计们。

关于objective-c - 强制 NSView 以编程方式重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com