OS X Строка состояния Приложение с заголовком в двух строках

Я старый разработчик iOS, и теперь я хочу сделать простую прикладную программу состояния OS X. Мне нужно поместить заголовок в NSStatusItem, но он должен быть в двух строках, например, в сети iStatPro.

Как его добавить?

2 ответа

Вот очень простой пример. В этом примере показаны две строки с двумя мигающими огнями.

Он использует NSView (пользовательский вид) с двумя NSTextFields и двумя NSImageWells внутри него.

Изображения красного и зеленого света добавляются в проект и устанавливаются в лунки изображения в IB.

.m

//
// AppDelegate.m
// Drawing Strings
//
// Created by Mark Hunte on 07/10/2013.
// Copyright (c) 2013 Mark Hunte. All rights reserved.
//

#import "AppDelegate.h"

@implementation AppDelegate
NSStatusItem *statusItem;

-(void)awakeFromNib{

 //-- SET UP ATTRIBUTED TEXT FOR THE LINES. WHICH GIVES US MORE CONTROL OVER THE TEXT IF WE WANT IT.
 NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];


 //--SET THE HEIGHT OF THE LINES
 paragraphStyle.maximumLineHeight = 12.f;


 //-- TEXT FOR NSTEXTFIELD 1
 NSAttributedString *attributedString = [[NSAttributedString alloc]
 initWithString:@"Line 1"attributes: [NSDictionary
 dictionaryWithObjectsAndKeys: [NSColor blackColor], NSForegroundColorAttributeName,paragraphStyle,NSParagraphStyleAttributeName ,nil]];
 //-- TEXT FOR NSTEXTFIELD 2
 NSAttributedString *attributedString2 = [[NSAttributedString alloc]

 initWithString:@"Line 2"attributes: [NSDictionary
 dictionaryWithObjectsAndKeys: [NSColor blackColor], NSForegroundColorAttributeName,paragraphStyle,NSParagraphStyleAttributeName ,nil]];


 //--- SET THE TEXT
 [_textField1 setAttributedStringValue:attributedString];
 [_textField2 setAttributedStringValue:attributedString2];


 //--- SET UP THE STATUS BAR
 NSStatusBar *bar = [NSStatusBar systemStatusBar];
 statusItem = [bar statusItemWithLength: NSVariableStatusItemLength] ;


 //-- CONSTRAIN THE CUSTOM VIEWS SIZE
 [_customView setFrameSize: NSMakeSize(50, 22)];


 //--- ADD THE VIEW TO THE STATUS BAR ITEM

 [statusItem setView:_customView];

 //-- MAKE SURE IT DISPLAYS
 [ _customView display];
 [_customView setNeedsDisplay:TRUE];

 //-- HIDE ONE OF THE IMAGE VIEWS
 [_greenLight setHidden:TRUE];


}

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


 //-- SET UP A TIME TO BLINK THE TWO IMAGE VIEW LIGHTS

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(blinkLights) userInfo:nil repeats:YES];

 [timer fire];

}

-(void)blinkLights{

 //-- IF IMAGE VIEW IS HIDDEN UNHIDE IT, IF SHOWN HIDE IT.

 [_greenLight setHidden:![_greenLight isHidden]];
 [_redLight setHidden:![_redLight isHidden]];


}


@end

Я использую два текстовых поля, поскольку я думаю, что это даст лучший контроль при необходимости. Но вы можете использовать один и новый текст. @"Строка 1\nLine 2"

Я также должен был установить максимальную высоту, чтобы помочь с выравниванием текста, и мне пришлось возиться с ограничениями в IB.

Но результатом являются две линии с мигающими огнями:


Подкласс NSView, где вы нарисуете текст вручную (найдите чертеж NSString), затем добавьте представление в элемент статуса.

licensed under cc by-sa 3.0 with attribution.