2013-11-16 3 views

ответ

24

Sub класс а NSView с именем MyTitleView и добавьте следующий код

- (void)drawString:(NSString *)string inRect:(NSRect)rect { 
    static NSDictionary *att = nil; 
    if (!att) { 
     NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
     [style setLineBreakMode:NSLineBreakByTruncatingTail]; 
     [style setAlignment:NSCenterTextAlignment]; 
     att = [[NSDictionary alloc] initWithObjectsAndKeys: style, NSParagraphStyleAttributeName,[NSColor whiteColor], NSForegroundColorAttributeName,[NSFont fontWithName:@"Helvetica" size:12], NSFontAttributeName, nil]; 
     [style release]; 

    } 

    NSRect titlebarRect = NSMakeRect(rect.origin.x+20, rect.origin.y-4, rect.size.width, rect.size.height); 


    [string drawInRect:titlebarRect withAttributes:att]; 
} 


- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSRect windowFrame = [NSWindow frameRectForContentRect:[[[self window] contentView] bounds] styleMask:[[self window] styleMask]]; 
    NSRect contentBounds = [[[self window] contentView] bounds]; 

    NSRect titlebarRect = NSMakeRect(0, 0, self.bounds.size.width, windowFrame.size.height - contentBounds.size.height); 
    titlebarRect.origin.y = self.bounds.size.height - titlebarRect.size.height; 

    NSRect topHalf, bottomHalf; 
    NSDivideRect(titlebarRect, &topHalf, &bottomHalf, floor(titlebarRect.size.height/2.0), NSMaxYEdge); 

    NSBezierPath * path = [NSBezierPath bezierPathWithRoundedRect:self.bounds xRadius:4.0 yRadius:4.0]; 
    [[NSBezierPath bezierPathWithRect:titlebarRect] addClip]; 



    NSGradient * gradient1 = [[[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:0.0 alpha:1.0] endingColor:[NSColor colorWithCalibratedWhite:1 alpha:1.0]] autorelease]; 
    NSGradient * gradient2 = [[[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:1 alpha:1.0] endingColor:[NSColor colorWithCalibratedWhite:0 alpha:1.0]] autorelease]; 

    [path addClip]; 


// [[NSColor colorWithCalibratedWhite:0.00 alpha:1.0] set]; 
// [path fill]; 


    [gradient1 drawInRect:topHalf angle:270.0]; 
    [gradient2 drawInRect:bottomHalf angle:270.0]; 

    [[NSColor blackColor] set]; 
    NSRectFill(NSMakeRect(0, -4, self.bounds.size.width, 1.0)); 


    [self drawString:@"My Title" inRect:titlebarRect]; 


} 

В AppDelegate импортируем класс MyTitleView и добавьте следующий код

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSRect boundsRect = [[[_window contentView] superview] bounds]; 
    BlackTitlebarView * titleview = [[BlackTitlebarView alloc] initWithFrame:boundsRect]; 
    [titleview setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; 

    [[[_window contentView] superview] addSubview:titleview positioned:NSWindowBelow relativeTo:[[[[_window contentView] superview] subviews] objectAtIndex:0]]; 
} 
+8

Это абсолютно работает, но Apple, делает отметить, что по состоянию на Yosemite: «Что нового с семенем WWDC:. NSWindow никогда не поддерживал клиентов добавляющие подвидов ни к чему, кроме contentView Некоторые приложения будут добавлять подвидов в contentView.superview (также известный как пограничный вид окна). NSWindow теперь регистрируется, когда обнаруживает этот сценарий: «Предупреждение NSWindow: добавление неизвестного subview:». Приложениям, которые это делают, нужно будет исправить эту проблему, поскольку это предотвращает новые функции на 10.10 от правильной работы. См. titlebarAccessoryViewControllers для официального API. " –

+0

где я могу вставить этот код? –

20

Существует гораздо более простой способ сделать это , Я читал, что вы можете изменить внешний вид окна на «текстурированный» в файле Storyboard/.xib, но это не работает полностью (цвет панели заголовка пятнистый). Тем не менее, вы можете изменить цвет в коде только двумя строками:

window.titlebarAppearsTransparent = true // gives it "flat" look 
window.backgroundColor = <NSColor> // set the background color 
+0

Спасибо, это сработало для меня. :) – Tommy

+0

@Tommy Да, проблем нет. –

+0

Это самый простой и элегантный способ. Спасибо. – rmvz3

0

Нет предупреждающего сообщения на OSX 10.10. подобный

NSView * windowTopView = [[_window standardWindowButton: NSWindowCloseButton] superview];

-(void) applicationDidFinishLaunching:(NSNotification *)aNotification { 

NSRect boundsRect = [windowTopView bounds]; 

NSView *windowTopView = [[_window standardWindowButton:NSWindowCloseButton] superview]; 
BTitleView * titleview = [[BTitleView alloc] initWithFrame:boundsRect]; 
[titleview setTitleImagePath:[[NSBundle mainBundle] pathForResource:@"Top1-01" ofType:@"bmp"]] ; 
[titleview setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; 
[windowTopView addSubview:titleview positioned:NSWindowBelow relativeTo:[[windowTopView subviews] objectAtIndex:0]]; 

//addTitlebarAccessoryViewController 
NSTitlebarAccessoryViewController *dummyTitlebarAccessoryViewController; 
NSView * logoview = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 10, 11)]; 
dummyTitlebarAccessoryViewController = [NSTitlebarAccessoryViewController new]; 
dummyTitlebarAccessoryViewController.view = logoview; 
dummyTitlebarAccessoryViewController.fullScreenMinHeight = 0; 
[_window addTitlebarAccessoryViewController:dummyTitlebarAccessoryViewController]; 


} 
Смежные вопросы