Domanda

Ho un irritante minore in un NSCollectionView in cui il NSCollectionViewItem rompere visivamente quando ho scorrere la finestra.

Il tasso di rottura dipende dalla velocità di scorrimento. Per esempio, se ho scorrere lentamente la rottura si verifica più spesso. Veloce scorrimento meno. Sembra che il problema è quando l'usanza NSView del NSCollectionViewItem Sto usando attraversa il confine del telaio visibile.

Il mio NSView (visualizzazione personalizzata del NSCollectionViewItem) ha un algoritmo molto semplice disegno -. Niente di troppo complesso

Essenzialmente a creare una cornice all'interno della dirtyRect del metodo drawRect e creare alcuni dei fotogrammi che:

-(void)drawRect:(NSRect)dirtyRect
{   
    NSRect mOuterFrame = NSMakeRect(dirtyRect.origin.x, dirtyRect.origin.y, 104, 94);
    NSRect mSelectedFrame = NSInsetRect(mOuterFrame, 2, 2);
    NSRect mRedFrame = NSInsetRect(mSelectedFrame, 2, 2);
    NSRect mInnerFrame = NSInsetRect(mRedFrame, 2, 2);

    NSBezierPath * mOuterFramePath = [NSBezierPath bezierPathWithRect:mOuterFrame];
    NSBezierPath * mSelectedFramePath = [NSBezierPath bezierPathWithRect:mSelectedFrame];
    NSBezierPath * mRedFramePath = [NSBezierPath bezierPathWithRect:mRedFrame];
    NSBezierPath * mInnerFramePath = [NSBezierPath bezierPathWithRect:mInnerFrame];

    [mainBackgroundColor set];
    [mOuterFramePath fill];

    if (selected)
        [[NSColor yellowColor] set];
    else
        [mainBackgroundColor set];

    [mSelectedFramePath fill];

    if (isRedBorder)
        [[NSColor redColor] set];
    else
        [mainBackgroundColor set];

    [mRedFramePath fill];

    [[NSColor blackColor] set];
    [mInnerFramePath fill];
}

Ho provato bloccare la messa a fuoco e rilasciando prima e dopo il codice così come l'impostazione del contesto grafico e il ripristino -. Nessuno dei quali sembra risolvere il problema

Sto usando Snow Leopard -. Non è che penso che fa la differenza

soluzione di aggiornamento

Per chiunque sia interessato ecco la soluzione al problema, come raccomandato dal NSResponder. Stavo creando il mOuterFrame iniziale in base al drawRect: metodi dirtyRect che, come ha sottolineato, era la cosa corretta da fare. Un rapido cambiamento da:

NSRect mOuterFrame = NSMakeRect(dirtyRect.origin.x, dirtyRect.origin.y, 104, 94);

Per un punto di origine 0 sulla base di:

NSRect mOuterFrame = NSMakeRect(0, 0, 104, 94);

Ho anche ottimizzato l'efficienza del codice, essendo come io sto usando solo i rettangoli, come suggerito anche se la modifica del codice di cui sopra è stato sufficiente a risolvere il problema in sé. Ho dovuto aggiungere un cambiamento per ottenere una linea a due pixel. Nuovo metodo:

-(void)drawRect:(NSRect)dirtyRect
{   
    NSRect mOuterFrame = NSMakeRect(0, 0, 104, 94);
    NSRect mSelectedFrame = NSInsetRect(mOuterFrame, 2, 2);
    NSRect mRedFrame = NSInsetRect(mSelectedFrame, 2, 2);
    NSRect mInnerFrame = NSInsetRect(mRedFrame, 2, 2);

    [NSBezierPath setDefaultLineWidth:2.0];

    [mainBackgroundColor set];
    [NSBezierPath strokeRect:mOuterFrame];

    if (selected)
        [[NSColor yellowColor] set];
    else
        [mainBackgroundColor set];

    [NSBezierPath strokeRect:mSelectedFrame];

    if (isRedBorder)
        [[NSColor redColor] set];
    else
        [mainBackgroundColor set];

    [NSBezierPath strokeRect:mRedFrame];

    [[NSColor blackColor] set];
    [NSBezierPath strokeRect:mInnerFrame];
}
È stato utile?

Soluzione

Per prima cosa che ho notato è che il codice di cui sopra è piuttosto uno spreco, dal momento che si sta creando un gruppo di percorsi in cui si può solo utilizzare NSFrameRect () e NSRectFill (), invece.

In secondo luogo, la geometria di ciò che si disegna non dovrebbe dipendere sul rettangolo passato a -drawRect :. Quel rettangolo appena ti dice quello che l'area da aggiornare è, in modo da poter essere più efficiente nel decidere cosa disegnare se il tuo punto di vista è complessa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top