Domanda

OK, quindi sto cercando di disegnare una scatola tratteggiata suddivisa in sezioni in cui ho intenzione di mettere il contenuto.Ecco il mio codice:

NSBezierPath *path = [NSBezierPath bezierPathWithRect:dirtyRect];
[path setLineWidth:3];
CGFloat pattern[2] = {5, 5};
[path setLineDash:pattern count:2 phase:0];
CGFloat totalHeight = header.frame.origin.y - 10;
CGFloat sectionOffset = 0;
if([game getNumPlayers] == 2) {
    sectionOffset = totalHeight / 2;
} else if([game getNumPlayers] == 3) {
    sectionOffset = totalHeight / 3;
} else if([game getNumPlayers] == 4) {
    sectionOffset = totalHeight / 4;
}
for(int i = 0; i < [[game getPlayers] count]; i++) {
    [path moveToPoint:NSMakePoint(0, totalHeight - (sectionOffset * i))];
    [path lineToPoint:NSMakePoint(dirtyRect.size.width, totalHeight - (sectionOffset * i))];
}
[path stroke];
.

Questo è contenuto nel metodo di guida della mia vista personalizzato, quindi DirtyRect è un NSrect equivalente ai limiti della vista.L'intestazione variabile si riferisce a un'altra vista nella supervisione, che sto basando la posizione delle linee di cui.

Ecco uno screenshot di ciò che questo codice disegna effettivamente (tranne l'etichetta ovviamente):

Come puoi vedere, a meno che non abbhiamo di una sfortunata illusione otticamente, che dubito, i divisori contenuti nella scatola sembrano essere più spessi del contorno della scatola.Ho esplicitamente impostato il linewidth del percorso del percorso per essere tre, quindi non sono sicuro del perché questo sia.Sarei molto riconoscente di qualsiasi suggerimento che può essere fornito.

È stato utile?

Soluzione

OK, penso che il problema sia che la tua scatola esterna si sta solo tagliando dai bordi della sua vista.Chiedi una linea che è larga 3 punti, quindi se il tuo dirtyRect è i limiti effettivi della vista, quindi 1,5 punti della casella di allevamento saranno esterni la vista, quindi vedrai solo 1,5 puntidelle linee del bordo.

Le linee interne mostrano lo spessore completo a 3 punti.

Puoi risolvere questo facendo qualcosa come:

const CGFloat lineWidth = 3;
NSBezierPath *const path = [NSBezierPath bezierPathWithRect:NSInsetRect(dirtyRect, lineWidth/2, lineWidth/2)];
path.lineWidth = lineWidth;
.

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