NSPopover 在 macOS Sonoma 上不显示内容

问题描述 投票:0回答:1

我遇到一个奇怪的问题,NSPopover 不显示内容。同样奇怪的是,当在 Xcode 调试视图层次结构中检查视图时,它会按预期渲染所有视图。

(https://i.stack.imgur.com/Ewa81.png)

Xcode 调试视图层次结构如下所示: (https://i.stack.imgur.com/rL5a4.png)

我只是不明白这个问题;为什么 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)]|"];
}
swift macos cocoa appkit
1个回答
0
投票

对于 macOS,Sonoma AppKit 已对 NSView 的绘图行为进行了更改。现在视图的绘制不受其边界的限制。

当您添加子控制器的子视图时,请尝试设置

clipsToBounds = true
。默认情况下,在 macOS Sonoma 上它是 false。

© www.soinside.com 2019 - 2024. All rights reserved.