我试图在我的OS X SpriteKit游戏中使用像NSButtons和NSPopUpButtons这样的AppKit元素。对于iOS,我知道你可以使用UIKit,但你不能将UIKit与OS X SpriteKit游戏一起使用。我试图在SKView顶部添加按钮,但它没有显示出来。我看了下面的帖子(Using an NSButton with SpriteKit),但我不清楚我应该怎么做。如何通过代码和/或xib文件进行所有正确的连接(对于按钮或任何其他AppKit UI元素),以便它显示在我的场景中?
[编辑]我浏览了Apple SpriteKit游戏示例("冒险"),看起来他们已经在某种程度上为他们的SKView添加了一个NSButton。
答案 0 :(得分:0)
这是从教程视频中获取的,但我再也找不到视频了。但是,一种方法是在游戏顶部显示一个工作表,并将你的cocoa控件保存在一个独立于spritekit内容的xib文件中。
我已经包含了下面的代码,用于在spritekit设置中显示工作表。
它还需要一个窗口.xib文件(所以一定要选择一个窗口)。将.sheetWindow属性连接到窗口,将文件所有者连接到下面包含的类。此外,我已将xib文件中的按钮连接到“closeWindow:”方法,但这完全是可选的。
此示例用于编辑NSManagedObjects,但我删除了大量实际编辑代码以使示例更清晰。我保留了委托,因为你经常想回调打开它的spritekit。
通过创建以下类的对象并调用“showWindowFor ...”方法来显示工作表。此方法采用NSManagedObject,但这当然是完全可选的。你可以制作一个名为“ - (void)showWindow”的方法。
·H
#import <Foundation/Foundation.h>
@protocol AttributeEditorSheetDelegate <NSObject>
-(void) attributeEditorSavedObject;
@end
@interface AttributeEditorSheet : NSObject {
NSManagedObject * _editedObject;
}
@property (weak,nonatomic) id <AttributeEditorSheetDelegate> delegate;
@property (weak) IBOutlet NSWindow * sheetWindow;
- (IBAction)closeWindow:(NSButton *)sender;
-(void) showWindowForNSManagedObject:(NSManagedObject *)editedObject;
@end
的.m
#import "AttributeEditorSheet.h"
@implementation AttributeEditorSheet
-(void) showWindowForNSManagedObject:(NSManagedObject *)editedObject {
if (self.sheetWindow==nil) {
[[NSBundle mainBundle] loadNibNamed:@"AttributeEditorWindow" owner:self topLevelObjects:nil];
}
_editedObject = editedObject;
[[NSApplication sharedApplication].mainWindow beginSheet:self.sheetWindow completionHandler:nil];
}
- (IBAction)closeWindow:(NSButton *)sender {
[self.delegate attributeEditorSavedObject];
[[NSApplication sharedApplication].mainWindow endSheet:self.sheetWindow];
}
@end
答案 1 :(得分:0)
只需确保为要在SKView前显示的任何AppKit视图或控件启用图层支持。 UIKit视图都内置了CALayers。 AppKit有它们但默认情况下不启用。
您可以在IB或代码中使用 [someViewOrControl setWantsLayer:YES]