Chcę narysować okrąg, gdy użytkownik kliknie dowolne miejsce na ekranie. Czego brakuje / jest źle w tym kodzie?
- (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);
}
}
Odpowiedzi:
1 dla odpowiedzi № 1Twój kod nie działa tak, jak myślisz. Zobacz definicję UITouchPhaseBegan
w 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)
};
To tylko wartość wyliczana, a nie odzwierciedlenie tego, codzieje się w Twojej aplikacji. Uważam, że w tym przypadku, ponieważ jest to pierwsza wartość w wyliczeniu, kompilator prawdopodobnie ustawia ją na 0, a zatem zawsze przyjmuje wartość false.
To, co prawdopodobnie chcesz zrobić, to ustawić takie jak ivar BOOL _touchHasbegun;
. Następnie w -touchesBegan:withEvent
lub działanie rozpoznawania gestów, w zależności od sposobu obsługi dotykowej, ustaw _touchHasBegun
na TAK lub NIE, stosownie do przypadku.
Kiedy wiesz, że twój widok wymaga aktualizacji, zadzwoń [self setNeedsDisplay]
(lub [self setNeedsDisplayInRect:someRect]
jeśli możesz, dla lepszej wydajności), aby uruchomić -drawRect:
metoda. Więc, miej -drawRect:
sprawdź, czy _touchHasBegun
aby ustalić, czy narysować koło.
Uwaga: nigdy nie należy dzwonić -drawRect:
siebie. Ustawiasz widok jako brudny, a system operacyjny zajmuje się rysowaniem go we właściwym czasie.