tintura tintes tinte tengo tabla quiero preparar pone pelo para oxigenada oscuro negro medidas cuanta como colores claro castaño cabello balayage agua aclarar objective-c macos osx-yosemite nsstatusitem nsstatusbar

objective c - tintes - NSStatusItem cambiar imagen para tinte oscuro



tengo cabello castaño oscuro y me lo quiero aclarar (6)

Creé una envoltura básica alrededor de NSStatusItem que puedes usar para proporcionar soporte para 10.10 y versiones anteriores con vistas personalizadas en la barra de estado. Puede encontrarlo aquí: https://github.com/noahsmartin/YosemiteMenuBar La idea básica es dibujar la vista personalizada en un NSImage y usar esta imagen como una imagen de plantilla para el elemento de la barra de estado. Esta envoltura también reenvía los eventos de clic a la vista personalizada para que puedan manejarse de la misma manera que en la versión 10.10. El proyecto contiene un ejemplo básico de cómo se puede usar YosemiteMenuBar con una vista personalizada en la barra de estado.

Con OSX 10.10 beta 3, Apple lanzó su opción de tinte oscuro. Desafortunadamente, también significa que casi todos los íconos de la barra de estado (con la excepción de Apple y Path Finder que he visto), incluido el mío, permanecen oscuros sobre un fondo oscuro. ¿Cómo puedo proporcionar una imagen alternativa para cuando se aplica un tinte oscuro?

No veo un cambio de API en NSStatusBar o NSStatusItem que me muestre un cambio, supongo que es una notificación o algo reactivo para hacer el cambio fácilmente cuando el usuario altera el tinte.

El código actual para dibujar la imagen está encerrado dentro de un NSView :

- (void)drawRect:(NSRect)dirtyRect { // set view background color if (self.isActive) { [[NSColor selectedMenuItemColor] setFill]; } else { [[NSColor clearColor] setFill]; } NSRectFill(dirtyRect); // set image NSImage *image = (self.isActive ? self.alternateImage : self.image); _imageView.image = image; }


Cuando su aplicación ha dibujado algún elemento de la GUI, puede obtener su apariencia a través de [NSAppearance currentAppearance] que a su vez tiene una propiedad de name que tiene algo como

NSAppearanceNameVibrantDark->NSAppearanceNameAqua->NSAppearanceNameAquaMavericks

La primera parte es el nombre de la apariencia, que también está disponible como una constante en NSAppearanceNameVibrantDark o NSAppearanceNameVibrantLight .

No sé si hay una manera de obtener solo la primera parte, pero creo que esto hace el truco por ahora.

Código de ejemplo:

-(void)awakeFromNib { NSStatusItem* myStatusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; myStatusItem.title = @"Hello World"; if ([[[NSAppearance currentAppearance] name] containsString:NSAppearanceNameVibrantDark]) { myStatusItem.title = @"Dark Interface"; } else { myStatusItem.title = @"Light Interface"; } }


El método más nuevo de la plantilla de imagen de conjunto de códigos Swift está aquí

// Insert code here to initialize your application if let button = statusItem.button { button.image = NSImage(named: "StatusIcon") button.image?.isTemplate = true // Just add this line button.action = #selector(togglePopover(_:)) }

Entonces cambiará la imagen cuando el modo oscuro.


Pero en caso de que desee controlar los cambios de estado que puede. También sé que hay una mejor manera de determinar el modo lite / oscuro que lo que se ha dicho anteriormente, pero puedo recordarlo ahora mismo.

// Monitor menu/dock theme changes... [[NSDistributedNotificationCenter defaultCenter] addObserver: self selector: @selector(themeChange:) name:@"AppleInterfaceThemeChangedNotification" object: NULL]; // -(void) themeChange :(NSNotification *) notification { NSLog (@"%@", notification); }


TL; DR: No tienes que hacer nada especial en Dark Theme. Dale a NSStatusItem (o NSStatusBarButton) una imagen de plantilla y la estilizará correctamente en cualquier contexto de barra de menú.

La razón por la que los elementos de estado de algunas aplicaciones (como PathFinder) ya funcionan en Dark Theme es porque no configuran su propia vista personalizada en el elemento de estado, sino que solo configuran una imagen de plantilla en el elemento de estado.

Algo como:

_statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength]; NSImage *image = [NSImage imageNamed:@"statusItemIcon"]; [image setTemplate:YES]; [_statusItem setImage:image];

Esto funciona exactamente como cabría esperar en Mavericks y versiones anteriores, así como en Yosemite y en futuras versiones, ya que permite que AppKit haga todo el estilo de la imagen según el estado del elemento de estado.

Mavericks

En Mavericks (y anteriores) solo había 2 estilos únicos de los artículos. Sin prensar y prensar. Estos dos estilos se veían casi puramente negros y puramente blancos, respectivamente. (En realidad, "puramente negro" no es del todo correcto, hubo un pequeño efecto que los hizo lucir un poco más adentro).

Debido a que solo había dos estados posibles, las aplicaciones de la barra de estado podían establecer su propia vista y obtener fácilmente el mismo aspecto simplemente dibujando en blanco o negro según su estado resaltado. (Pero una vez más, tenga en cuenta que no era puramente negro, por lo que las aplicaciones tuvieron que crear el efecto en la imagen o quedar satisfechas con un ícono que apenas se nota fuera de lugar).

Yosemita

En Yosemite hay al menos 32 estilos únicos de artículos. Unpressed in Dark Theme es solo uno de esos. No hay una forma práctica (o no práctica) para que una aplicación pueda hacer su propio estilo de elementos y hacer que se vea correcta en todos los contextos.

Aquí hay ejemplos de seis de esos posibles estilos:

Los elementos de estado en una barra de menú inactiva ahora tienen un estilo específico, en lugar de un simple cambio de opacidad como en el pasado. Apariencia discapacitada es otra variación posible; También hay otras dimensiones adicionales a esta matriz de posibilidades.

API

Las vistas arbitrarias establecidas como propiedad de la view NSStatusItem no tienen forma de capturar todas estas variaciones, por lo tanto, (y otras API relacionadas) están en desuso en 10.10.

Sin embargo, seed 3 introduce una nueva API en NSStatusItem:

@property (readonly, strong) NSStatusBarButton *button NS_AVAILABLE_MAC(10_10);

Esta pieza de API tiene algunos propósitos:

  1. Una aplicación ahora puede obtener la posición de la pantalla (o mostrar una ventana emergente desde) un elemento de estado sin configurar su propia vista personalizada.
  2. Elimina la necesidad de API como image , title , sendActionOn: en NSStatusItem.
  3. Proporciona una clase para la nueva API: es decir, looksDisabled . Esto permite que las aplicaciones obtengan el estilo estándar deshabilitado / desactivado (como Bluetooth / Time Machine cuando está apagado) sin requerir una imagen personalizada.

Si hay algo que no se puede hacer con la API actual (vista no personalizada), presente una solicitud de mejora. StatusItems debe proporcionar comportamiento o apariencias de manera que sea estándar en todos los elementos de estado.

Más discusión se encuentra en https://devforums.apple.com/thread/234839 , aunque he resumido casi todo aquí.


Terminé haciendo algo como seguir a mi arrastrar y soltar personalizado NSStatusItemView : (Utilizando Swift)

var isDark = false func isDarkMode() { isDark = NSAppearance.currentAppearance().name.hasPrefix("NSAppearanceNameVibrantDark") } override func drawRect(dirtyRect: NSRect) { super.drawRect(dirtyRect) isDarkMode() // Now use "isDark" to determine the drawing colour. if isDark { // ... } else { // ... } }

Cuando el usuario cambió el tema en Preferencias del sistema, el NSView llamará a NSView para volver a dibujar, puede cambiar el color del icono según corresponda.

Si desea ajustar otra IU personalizada fuera de esta vista, puede usar KVO para isDark clave isDark de la vista o hacerlo por su cuenta.