Quero que um círculo seja desenhado quando o usuário clicar em qualquer lugar da tela. O que está faltando / está errado com este código?
- (void)drawRect:(CGRect)rect
{
if (UITouchPhaseBegan)
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(context, 0, 0, 225, 1);
CGContextSetRGBFillColor(context, 0, 0, 255, 1);
CGRect rectangle = CGRectMake(50, 50, 500, 500);
CGContextStrokeEllipseInRect(context, rectangle);
}
}
Respostas:
1 para resposta № 1Seu código não faz o que você pensa. Veja a definição de UITouchPhaseBegan
dentro UITouch.h
:
typedef NS_ENUM(NSInteger, UITouchPhase) {
UITouchPhaseBegan, // whenever a finger touches the surface.
UITouchPhaseMoved, // whenever a finger moves on the surface.
UITouchPhaseStationary, // whenever a finger is touching the surface but hasn"t moved since the previous event.
UITouchPhaseEnded, // whenever a finger leaves the surface.
UITouchPhaseCancelled, // whenever a touch doesn"t end but we need to stop tracking (e.g. putting device to face)
};
É apenas um valor enum, não um reflexo do queestá acontecendo no seu aplicativo. Acredito que, neste caso, por ser o primeiro valor no enum, provavelmente está sendo definido como 0 pelo compilador e, portanto, está sempre avaliando como falso.
O que você provavelmente quer fazer é definir um ivar como BOOL _touchHasbegun;
. Então, em -touchesBegan:withEvent
ou sua ação do reconhecedor de gestos, dependendo de como você está lidando com o toque, defina _touchHasBegun
para SIM ou NÃO, conforme apropriado.
Quando você souber que sua visualização precisa ser atualizada, ligue para [self setNeedsDisplay]
(ou [self setNeedsDisplayInRect:someRect]
se possível, para obter melhor desempenho) para acionar o -drawRect:
método. Então, tenha seu -drawRect:
método verificar se _touchHasBegun
para determinar se você deseja desenhar seu círculo.
Nota: você nunca deve ligar -drawRect:
você mesmo. Você define a vista como suja e o sistema operacional cuida de desenhá-la no momento certo.