2010-10-10 10 views
7

sto cercando di disegnare un'immagine di sfondo ripetuta nella mia NSView, ho questo fino ad ora:immagine di sfondo ripetuta in 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); 
} 

Tuttavia, la vista si estende l'immagine per riempire se stessa. Voglio invece ripetere l'immagine.

alt text (i tratti neri sono fisse già)

Inoltre, accade qualcosa di strano, come la console dice il formato dell'immagine è uguale -2109897792x0, ma l'immagine è davvero 32x32! WTF ?!

Qualcuno potrebbe aiutarmi, per favore? Grazie.

+2

Probabilmente non è la migliore idea per minacciare il down-voting per risposte non correlate che * potresti * ricevere. Tende a scoraggiare la gente persino dal disturbare. –

+2

@Joshua ma è molto, molto fastidioso ricevere risposte sulla piattaforma sbagliata. –

+0

Sicuramente si vede la differenza tra ammonire le persone prima che qualcuno abbia fatto qualcosa di sbagliato e farlo a seguito di un'infrazione reale. Il primo è ostile nel migliore dei casi; il secondo è più meritevole. –

risposta

20

È possibile creare un modello di colore con +[NSColor colorWithPatternImage:] e poi basta riempire il rettangolo di sfondo con quel "colore". Questo dovrebbe fare ciò che vuoi ottenere.

+0

Fantastico! Funziona. = D –

+2

Attenzione, questo è relativo alla parte inferiore della finestra (per i documenti). Quando ridimensionate la finestra (e la vista si ridimensiona in risposta), il punto in alto a sinistra del modello si muoverà (facendo sì che lo sfondo "nuoterà" dietro a qualsiasi vista parziale della vista con motivi). Questo può essere nauseante. :-) –

+3

So che questo post è piuttosto vecchio, ma ho questo problema esatto. è possibile rendere il dock "backgroundimage" in alto? –

15

ho trovato la risposta qui per evitare che i modelli dal disegno dal fondo e dare in tal senso strano quando le finestre ridimensionano:

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

In pratica tutto quello che dovete fare nella vostra drawRect è quello di salvare il contesto grafico stato, chiama il metodo, dipingi il tuo modello, quindi ripristina il tuo stato.

Il metodo è:

- (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]; 
} 

ho inizializzato il mio background modello di colore nel metodo init:

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

    return self; 
} 
+1

Aggiunta di alcune parole chiave per aiutare gli altri a trovare questo: pin immagine vista piastrellata in alto/alto pinning –

+0

Qualcuno sa cosa potrebbe causare codice come questo per allungare il modello invece di affiancarlo? Ho notato che il mio drawRect non viene chiamato quando la vista viene ridimensionata, forse questo ha qualcosa a che fare con esso? –

+0

Rispondendo alla mia domanda nel commento precedente: ho dovuto impostare setDisplay su YES ogni volta che cambiava il suo frame, e sovrascrivevo setFrame per farlo. Non sono sicuro se questo è il modo normale per farlo, o se c'è un meccanismo integrato simile a quello di NeedsDisplayOnBoundsChange di CALayer, ma funziona. –

0

Partenza RMSkinnedView su Github!

EDIT: RMSkinnedView è un NSView sottoclasse in cui è possibile impostare diverse opzioni, tra cui gli angoli arrotondati, di colore di sfondo, l'immagine di sfondo del modello, ecc, direttamente tramite il runtime Definito attributi utente in Interface Builder.