2010-10-10 10 views
7

Estoy tratando de dibujar una imagen de fondo que se repite en mi NSView, tengo esto hasta ahora:imagen de fondo que se repiten en un NSView

// INIT 
- (id)initWithFrame:(NSRect)frame { 
    if (self = [super initWithFrame:frame]) { 
    self.backgroundImage = [NSImage imageNamed:@"progressBackground.pdf"]; 
    } 

    return self; 
} 

// DRAW 
- (void)drawRect:(NSRect)dirtyRect { 
    // Draw the background 
    [backgroundImage drawInRect:[self bounds] 
        fromRect:NSMakeRect(0.0f, 0.0f, backgroundImage.size.width, backgroundImage.size.height) 
        operation:NSCompositeSourceAtop 
        fraction:1.0f]; 
    NSLog(@"%dx%d", backgroundImage.size.width, backgroundImage.size.height); 
} 

Sin embargo, la vista se extiende la imagen para llenar en sí. Quiero que la imagen se repita en su lugar.

alt text (los trazos negros ya están fijos)

Además, ocurre algo extraño, ya que la consola dice que el tamaño de la imagen es igual -2109897792x0, pero la imagen es realmente 32x32! ¡¿WTF ?!

¿Alguien podría ayudarme, por favor? Gracias.

+2

Probablemente no sea la mejor idea para amenazar el voto negativo para respuestas no relacionadas que * podría * recibir. Tiende a desanimar a la gente incluso de molestarse en absoluto. –

+2

@Joshua pero es muy, muy molesto recibir respuestas sobre la plataforma incorrecta. –

+0

Seguramente verá la diferencia entre amonestar a las personas antes de que alguien haga algo incorrecto y hacerlo como resultado de una infracción real. El primero es antipático en el mejor de los casos; este último es más merecedor. –

Respuesta

20

Puede crear un color de patrón con +[NSColor colorWithPatternImage:] y luego simplemente rellene el rectángulo de fondo con ese "color". Eso debería hacer lo que quieras lograr.

+0

¡Genial! Funciona. = D –

+2

Tenga en cuenta que esto es relativo a la parte inferior de la ventana (según los documentos). A medida que cambia el tamaño de la ventana (y la vista cambia de tamaño en respuesta), el punto superior izquierdo del patrón se moverá (haciendo que el fondo "nade" detrás de las subvistas de su vista con dibujos). Esto puede ser nauseabundo. :-) –

+3

Sé que esta publicación es bastante antigua, pero tengo este problema exacto. ¿Es posible hacer que el dock de "backgroundimage" esté en la parte superior? –

15

he encontrado la respuesta para evitar que los patrones de dibujo de la parte inferior y dando ese efecto extraño cuando las ventanas reSIZE

http://www.mere-mortal-software.com/blog/details.php?d=2007-01-08

Básicamente todo lo que necesita hacer en su drawRect es para guardar su contexto gráfico indicar, llamar al método, pintar su patrón, luego restaurar su estado.

El método es:

- (void)drawRect:(NSRect)dirtyRect { 
    NSGraphicsContext* theContext = [NSGraphicsContext currentContext]; 
    [theContext saveGraphicsState]; 
    [[NSGraphicsContext currentContext] setPatternPhase:NSMakePoint(0,[self frame].size.height)]; 
    [self.customBackgroundColour set]; 
    NSRectFill([self bounds]); 
    [theContext restoreGraphicsState]; 
} 

Me inicializar mi patrón de color de fondo en el método init:

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.customBackgroundColour = [NSColor colorWithPatternImage:[NSImage imageNamed:@"light-linen-texture.png"]]; 
    } 

    return self; 
} 
+1

Agregando algunas palabras clave para ayudar a otros a encontrar esto: pin embaldosado vista de la imagen a la fijación superior/superior –

+0

¿Alguien sabe lo que causaría un código como este para estirar aún el patrón en lugar de mosaico? Me he dado cuenta de que mi drawRect no se llama cuando la vista cambia de tamaño, ¿quizás eso tiene algo que ver? –

+0

Respondiendo a mi propia pregunta en el comentario anterior: Tuve que hacer que mi conjunto de vistas necesitara mostrarse en YES cada vez que cambiara su marco, y anulé el propio SetFrame para hacerlo. No estoy seguro de si esta es la forma normal de hacerlo, o si hay algún mecanismo integrado similar a las necesidades de Calayer. DisplayOnBoundsChange, pero está funcionando. –

0

Salida RMSkinnedView en Github!

EDIT: RMSkinnedView es una subclase NSView donde se puede configurar varias opciones, incluyendo las esquinas redondeadas, color de fondo, patrón de imagen de fondo, etc., directamente a través del tiempo de ejecución definidos por el usuario Atributos en el Interface Builder.

Cuestiones relacionadas