Pergunta

Estou trabalhando em uma visualização de arrastar e soltar e encontrei alguns manipuladores para ações de arrastar e soltar na web.Quero fazer com que fique azul quando o usuário arrasta um arquivo sobre a área de arrastar e soltar e cinza novamente quando sair da área de arrastar e soltar.O problema é que ele não é atualizado quando você arrasta o mouse sobre ele ou sai dele.Aqui está um pouco do código:

- (void)drawRect:(NSRect)rect
{
   NSRect bounds = [self bounds];
   [[NSColor grayColor] set];
   [NSBezierPath fillRect:bounds];
}

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender  {
    NSRect bounds = [self bounds];
    [[NSColor blueColor] set];
    [NSBezierPath fillRect:bounds];

    return NSDragOperationCopy;

}

- (void)draggingExited:(id <NSDraggingInfo>)sender {
    NSRect bounds = [self bounds];
    [[NSColor grayColor] set];
    [NSBezierPath fillRect:bounds];

}

Obrigado por qualquer ajuda.

Foi útil?

Solução

O desenho só funciona quando um contexto (como uma tela para pintura) está configurado para você desenhar.Quando a estrutura chama -drawRect: ele configurou um contexto de desenho para você, então comandos de desenho como -[NSColor set] e -[NSBezierPath fillRect:] trabalhe como você espera.

Fora de -drawRect: geralmente não há contexto de desenho configurado.Usando comandos de desenho fora do -drawRect: é como agitar um pincel no ar;não há tela, então nenhuma pintura acontece.

Em 99,99% dos casos, todos os desenhos de vista devem ser mantidos dentro -drawRect: porque o NSView faz muito trabalho que você não deseja fazer para configurar o contexto do desenho de maneira correta e eficiente.

Então, como você altera o desenho da sua visualização dentro do seu -draggingEntered: e -draggingExited: métodos?Por efeitos colaterais.

Você está fazendo a mesma coisa nos três casos:1) Definir uma cor e 2) Desenhar um retângulo.A única diferença são as mudanças de cor em cada método.Então, por que não controlar qual cor você usa em -drawRect: com um ivar, assim:

- (void)draggingEntered:(id <NSDraggingInfo>)sender {
    drawBlueColorIvar = YES;
    // ...
}

Então em -drawRect: você faz isso:

- (void)drawRect:(NSRect)rect {
    NSColor *color = drawBlueColorIvar ? [NSColor blueColor] : [NSColor grayColor];
    [color set];
    [NSBezierPath fillRect:rect];
}

(Observe que não usei [self bounds].É mais eficiente apenas desenhar no reto "sujo", quando possível.)

Finalmente, você precisa de alguma forma de informar ao framework que sua visão precisa ser redesenhada quando drawBlueColorIvar for alterado.A estrutura não desenhará nada, a menos que seja informado que é necessário.Como disse Chris Cooper, você faz isso com [self setNeedsDisplay:YES].Isso deve acontecer depois de qualquer lugar que você mudar drawBlueColorIvar.

Outras dicas

Você está ligando [yourView: setNeedsDisplay] em qualquer lugar?

É assim que você informa à estrutura de desenho que precisa enviar uma mensagem ao seu UIView subclasse com drawRect:, então você deve fazer isso sempre que as coisas mudarem.No seu caso, isso provavelmente significa quando o mouse entra ou sai da área de soltar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top