问题
I want a circle to be drawn when the user clicks anywhere on the screen. Whats missing/is wrong with this code?
- (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);
}
}
回答1:
Your code doesn’t do what you think it does. Have a look at the definition of UITouchPhaseBegan
in 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)
};
It’s just an enum value, not a reflection of what is going on in your app. I believe that in this case, because it is the first value in the enum, it is probably being set to 0 by the compiler, and is therefore always evaluating to false.
What you probably want to do is to set an ivar like BOOL _touchHasbegun;
. Then, in -touchesBegan:withEvent
or your gesture recognizer action, depending on how you’re doing touch handling, set _touchHasBegun
to YES or NO as appropriate.
When you know your view needs to be updated, call [self setNeedsDisplay]
(or [self setNeedsDisplayInRect:someRect]
if you can, for better performance) to trigger the -drawRect:
method. Then, have your -drawRect:
method check whether _touchHasBegun
to determine whether to draw your circle.
Note: You should never call -drawRect:
yourself. You set the view as dirty, and the OS takes care of drawing it at the right time.
来源:https://stackoverflow.com/questions/15076306/draw-a-circle-when-clicked-using-quartz