objective-c - 如何实现基于 Cocoa 的 Adob​​e Photoshop 插件

标签 objective-c cocoa photoshop

Cocoa 曾经使用 trick of putting a Cocoa bundle inside the main Carbon plugin bundle 在 CS3 上工作,从 Carbon 加载它并发出 NSApplicationLoad()。那是因为 Photoshop CS3 是纯 Carbon 的,用于卸载插件包。

Photoshop CS4 使用 Cocoa 并在主线程上有自己的 NSAutorelease 池。

在 Photoshop CS4 上,非常简单的基于窗口的 xibs/nibs 由 NSWindowController 加载,开箱即用。

但是只要将绑定(bind)添加到窗口上的控件,您就会遇到有趣的崩溃,可能是在您关闭窗口时,或者在您第二次使用该插件时,甚至是在关闭 Photoshop 本身时。

为什么在我使用一些高级 Cocoa 功能之前一切似乎都运行良好?我卡住了。

编辑:我真的找到了解决更广泛问题“如何在 Photoshop CS3/CS4 插件中使用 Cocoa?”的方法。见下文。

最佳答案

您必须创建一个新的 Loadable Bundle 目标,其中包含您的 nib 和 Cocoa 代码。将捆绑产品添加到插件的Copy Bundle Resources 阶段。然后加载带有一些控件的 Cocoa 窗口的过滤器插件的代码将是:

Boolean DoUI (void) {

    // Create the CF Cocoa bundle
    CFBundleRef pluginBundle;
    CFURLRef cocoaBundleURL;
    pluginBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.example.plugin"));
    cocoaBundleURL = CFBundleCopyResourceURL(pluginBundle, 
                                             CFSTR("Cocoa_bundle"), 
                                             CFSTR("bundle"), 
                                             NULL);
    CFBundleRef cocoaBundleRef;
    cocoaBundleRef = CFBundleCreate(kCFAllocatorDefault, cocoaBundleURL);
    CFRelease(cocoaBundleURL);

    // start Cocoa (for CS3)
    NSApplicationLoad(); 

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // load the cocoa bundle by identifier
    NSBundle* cocoaBundle;
    cocoaBundle = [NSBundle bundleWithIdentifier:@"com.example.plugin.cocoa"];

    // load the window controller from the bundle
    Class testControllerClass;
    testControllerClass = [cocoaBundle classNamed:@"MyWindowController"];

    MyWindowController* winController = [[testControllerClass alloc] init];
    [NSApp runModalForWindow:[winController window]];
    [[winController window] performClose:nil];
    [winController release];

    // release the bundle
    CFRelease(cocoaBundleRef);

    [pool release];

    return 1;
}

这是基于 Craig Hockenberry bundle trick .我仍在测试它,但它应该适用于 CS3 和 CS4。

关于objective-c - 如何实现基于 Cocoa 的 Adob​​e Photoshop 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1108550/

相关文章:

image-processing - Photoshop 脚本,如果图像宽度大于 X,则调整大小

ios - UIButton AddTarget 在同一目标操作上多次只调用一次?

cocoa - 为什么 EventMachine 出站数据缓冲区可能会停止发送并永远填满(而其他连接仍可以发送)

iphone - CGPath 中的 CGGradient

css - 如何找到 png 图像中像素的 alpha channel 透明度值?

c++ - 使用 "multiply"混合模式和 alpha 的 Direct3D 渲染 2D 图像

iPhone 程序在模拟器上运行但不在 iPhone 上运行

ios - 如何在 iOS 应用程序的后台运行另一个应用程序?

ios - 将 NSString 转换为 NSDate 时出错

objective-c - 我的 iPhone 应用程序的这个 Objective-C 线程代码有什么问题?