我遇到一个奇怪的问题,NSPopover 不显示内容。同样奇怪的是,当在 Xcode 调试视图层次结构中检查视图时,它会按预期渲染所有视图。
我只是不明白这个问题;为什么 LoginViewController 的视图没有显示。此问题始于 macOS Sonoma。
这是弹出窗口设置:
{
_popover = NSPopover.new;
_popover.animates = NO;
_popover.behavior = NSPopoverBehaviorApplicationDefined;
NSViewController* vc;
if (user == nil)
{
vc = LoginViewController.new;
}
else
{
vc = MessageViewController.new;
}
_popover.contentViewController = [RootViewController.alloc initWithRootViewController:vc];
[_popover.contentViewController loadView];
_statusItem = [NSStatusBar.systemStatusBar statusItemWithLength:24];
_statusItem.button.action = @selector(onPress);
_statusItem.button.target = self;
[self reloadPopoverTrayImageForce:YES];
}
下面是 Popover 的 RootViewController 的设置方式。我的意思是这里没有任何不标准的地方,只是将子视图控制器及其视图嵌入到父视图控制器中。
{
self.view = NSView.new;
self.view.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.containerView];
if (self.rootViewController)
{
[self addChildViewController:self.rootViewController];
[self.containerView addSubview:self.rootViewController.view];
self.rootViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
id r = @{ @"root": self.rootViewController.view };
[self.containerView addFor:r constraints:@"|[root]|"];
[self.containerView addFor:r constraints:@"V:|[root]|"];
}
[self.view addSubview:self.footerView];
[self reloadConstraints];
id v = @{
@"container": self.containerView,
@"footer": self.footerView
};
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem:self.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual
toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:WIDTH]];
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem:self.view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual
toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:HEIGHT]];
[self.view addFor:v constraints:@"|[container]|"];
[self.view addFor:v constraints:@"|[footer]|"];
[self.view addFor:v constraints:@"V:|[container]-0-[footer(44)]|"];
}
对于 macOS,Sonoma AppKit 已对 NSView 的绘图行为进行了更改。现在视图的绘制不受其边界的限制。
当您添加子控制器的子视图时,请尝试设置
clipsToBounds = true
。默认情况下,在 macOS Sonoma 上它是 false。