【问题标题】:How to add NSTextField over SKScene?如何在 SKScene 上添加 NSTextField?
【发布时间】:2014-04-20 11:54:36
【问题描述】:

我正在使用 Sprite Kit 创建游戏,想在场景上添加一个文本字段。代码如下:

@interface MKMainMenuScene ()

//...
@property (nonatomic) NSTextField *field;

@end

@implementation MKMainMenuScene

- (void)didMoveToView:(SKView *)view
{
    [super didMoveToView:view];

    [self.view addSubview:_field];
}

- (id)initWithSize:(CGSize)size
{
    if (self == [super initWithSize:size])
    {
       //...
       _field = [[NSTextField alloc] initWithFrame:
       NSMakeRect(self.frame.size.width / 2, self.frame.size.height / 2 + 20,
                  100, 40)];
       [_field setBackgroundColor:[NSColor whiteColor]];
       [_field setStringValue:@"Enter smth"];
    }

    return self;
}

但没有出现文本字段,它在场景下。有人知道问题是什么以及如何解决吗?

【问题讨论】:

  • 您的代码是否进入if 测试?你不应该改用“=”吗?
  • @Larme,是的,“if”块内的所有代码都已执行。更改为“=”没有帮助。
  • 我也有同样的问题。有人想出这个吗?

标签: objective-c macos sprite-kit


【解决方案1】:

搞定了。

必须将必要的视图设置为 Layer-Backed Views。尝试在 Nib 中执行此操作,但对我不起作用。所以我在代码中做到了。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    /* Insert Label. FOR TESTING, may remove */
    NSTextField *label = [[NSTextField alloc] initWithFrame:NSMakeRect(50, 50, 300, 300)];
    [label setStringValue:@"Hello All"];
    [label setTextColor:[NSColor whiteColor]];
    [label setBackgroundColor:[NSColor redColor]];
    [label setFont:[NSFont fontWithName:@"Helvetica" size:20]];
    [[self.window contentView] addSubview:label];

    /* SET LAYER BACK VIEW 
     *  This is the one line code to make it work. 
     */
    [self.window.contentView setWantsLayer:YES];
}


更新:

以上代码将导致SCNViewSKView 出现冻结或问题。要解决此问题,请不要将 UI 设置为子视图,而是将其设置为 SKView 的兄弟。然后将UI设置为setWantsLayer的Layer-Backed。

Window
   -> Content NSView
      -> SKView/SCNView
      -> NSTextField  <-- Layer-Backed 

代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    /* Insert Label. FOR TESTING, may remove */
    NSTextField *label = [[NSTextField alloc] initWithFrame:NSMakeRect(50, 50, 300, 300)];
    // . . . .
    [[self.window contentView] addSubview:label];


    /* UPDATE */
    [label setWantsLayer:YES];
}

希望这可以帮助其他遵循我的步骤的人。

【讨论】:

    【解决方案2】:

    试试这个:

    - (void)didMoveToView:(SKView *)view
    {
        [super didMoveToView:view];
        [view addSubview:_field];
    }
    

    【讨论】:

    • 同样的结果。文本字段上有场景的节点。也试过方法[view addSubview:_field positioned:NSWindowAbove relativeTo:view];
    • @user3553778,你能提供截图吗?如果 skView 上没有其他视图,这绝对应该有效。
    • 我用 Apple 的示例创建了这个问题的简单示例:link。无法截屏,因为该字段仅在屏幕上出现片刻,然后被场景覆盖。
    • @user3553778,也许你应该使用包含 SKView 和 NSTextField 作为其子视图的复合 NSView?
    • 我这样做了。它没有用。但出于某种原因,在 iOS 中,将子视图添加到 SKView 是可行的。不适用于SKView 固有的NSView
    猜你喜欢
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多