Cocoa 窗口顶部的iTunes或Xcode样式信息框

Cocoa 窗口顶部的iTunes或Xcode样式信息框,cocoa,user-interface,graphics,Cocoa,User Interface,Graphics,我有什么办法可以用Cocoa或者像苹果在XCode 4中使用的那样在iTunes顶部重新创建这个盒子 这只是一个普通的图像,上面有控件吗?或者它是一个带有某种定制风格魔法的NSBox?我会编写一个定制NSView。在drawRect:中绘制背景和边框。您可以使用NSGradient绘制填充背景,也可以将其保存为图像并绘制。您可能可以使用白色NSShadow来获得边框的浮雕效果 最后,要在上面显示文本,只需添加文本字段作为新自定义视图的子视图。我必须为我的一个项目编写类似的代码。对于我的解决方案

我有什么办法可以用Cocoa或者像苹果在XCode 4中使用的那样在iTunes顶部重新创建这个盒子


这只是一个普通的图像,上面有控件吗?或者它是一个带有某种定制风格魔法的
NSBox

我会编写一个定制NSView。在
drawRect:
中绘制背景和边框。您可以使用
NSGradient
绘制填充背景,也可以将其保存为图像并绘制。您可能可以使用白色
NSShadow
来获得边框的浮雕效果


最后,要在上面显示文本,只需添加文本字段作为新自定义视图的子视图。

我必须为我的一个项目编写类似的代码。对于我的解决方案,您将需要本文示例代码中提供的两个类别。这段代码将绘制背景渐变和必要的阴影,这将取决于您在控件内添加额外的内容。目前,代码将绘制Xcode风格的渐变作为背景,但是如果需要的话,您可以注释掉它并取消注释iTunes风格的渐变。希望这有帮助

#import "NSShadow+MCAdditions.h" // from the tutorial linked to above
#import "NSBezierPath+MCAdditions.h" // from the same tutorial

- (void)drawRect:(NSRect)dirtyRect {
    static NSShadow *kDropShadow = nil;
    static NSShadow *kInnerShadow = nil;
    static NSGradient *kBackgroundGradient = nil;
    static NSColor *kBorderColor = nil;

    if (kDropShadow == nil) {
        kDropShadow = [[NSShadow alloc] initWithColor:[NSColor colorWithCalibratedWhite:.863 alpha:.75] offset:NSMakeSize(0, -1.0) blurRadius:1.0];
        kInnerShadow = [[NSShadow alloc] initWithColor:[NSColor colorWithCalibratedWhite:0.0 alpha:.52] offset:NSMakeSize(0.0, -1.0) blurRadius:4.0];
        kBorderColor = [[NSColor colorWithCalibratedWhite:0.569 alpha:1.0] retain];
        // iTunes style
        /*
         kBackgroundGradient = [[NSGradient alloc] initWithColorsAndLocations:[NSColor colorWithCalibratedRed:0.929 green:0.945 blue:0.882 alpha:1.0],0.0,[NSColor colorWithCalibratedRed:0.902 green:0.922 blue:0.835 alpha:1.0],0.5,[NSColor colorWithCalibratedRed:0.871 green:0.894 blue:0.78 alpha:1.0],0.5,[NSColor colorWithCalibratedRed:0.949 green:0.961 blue:0.878 alpha:1.0],1.0, nil];
         */
        // Xcode style
        kBackgroundGradient = [[NSGradient alloc] initWithColorsAndLocations:[NSColor colorWithCalibratedRed:0.957 green:0.976 blue:1.0 alpha:1.0],0.0,[NSColor colorWithCalibratedRed:0.871 green:0.894 blue:0.918 alpha:1.0],0.5,[NSColor colorWithCalibratedRed:0.831 green:0.851 blue:0.867 alpha:1.0],0.5,[NSColor colorWithCalibratedRed:0.82 green:0.847 blue:0.89 alpha:1.0],1.0, nil];
    }

    NSRect bounds = [self bounds];
    bounds.size.height -= 1.0;
    bounds.origin.y += 1.0;

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:bounds xRadius:3.5 yRadius:3.5];

    [NSGraphicsContext saveGraphicsState];
    [kDropShadow set];
    [path fill];
    [NSGraphicsContext restoreGraphicsState];

    [kBackgroundGradient drawInBezierPath:path angle:-90.0];

    [kBorderColor setStroke];
    [path strokeInside];

    [path fillWithInnerShadow:kInnerShadow];
}

看起来很不错。我在一个可重用的库中使用了这种技术:…我还添加了一个渐变来模仿在Instruments中看到的渐变。更新:我将其重命名为GitHub,目前正在重定向,但这可能不会持续。