Pergunta

Ok, estou tentando desenhar uma caixa tracejada subdividida em seções onde colocarei o conteúdo.Aqui está meu código:

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

Isso está contido no método drawRect da minha visualização personalizada, portanto dirtyRect é um NSRect equivalente aos limites da visualização.O cabeçalho da variável refere-se a outra visualização na supervisão, na qual estou baseando a localização das linhas.

Aqui está uma captura de tela do que esse código realmente desenha (exceto o rótulo, obviamente):

Como você pode ver, a menos que estejamos lidando com uma ilusão de ótica muito infeliz, o que duvido, as divisórias contidas na caixa parecem ser mais grossas do que o contorno da caixa.Eu defini explicitamente o lineWidth do objeto path como três, então não sei por que isso acontece.Eu ficaria muito grato por quaisquer sugestões que possam ser fornecidas.

Foi útil?

Solução

OK, acho que o problema é que sua caixa externa está sendo cortada pelas bordas de sua visualização.Você pede uma linha com 3 pontos de largura, então se o seu dirtyRect são os limites reais da visualização, então 1,5 pontos da caixa anexa serão fora a vista, então você verá apenas 1,5 pontos das linhas de borda.

As linhas internas mostram a espessura total de 3 pontos.

Você pode corrigir isso fazendo algo como:

const CGFloat lineWidth = 3;
NSBezierPath *const path = [NSBezierPath bezierPathWithRect:NSInsetRect(dirtyRect, lineWidth/2, lineWidth/2)];
path.lineWidth = lineWidth;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top