2013-05-01 16 views
6

Mam viewController, który jest oczywiście podklasy UIViewController o nazwie MapViewController. W tym widokuController Używam GPS, aby uzyskać lokalizację użytkownika.setNeedsDisplay nie wypalanie DrawRect

Mam również widok o nazwie DrawCircle. Ten widok jest podklasą UIView.

Korzystanie z drawCircle Chciałbym móc w dowolnym momencie narysować na moim MapViewController. Ale nie jestem pewien, czy rozumiem koncepcję takiego działania. Wiem, że mój kod rysunkowy działa, użyłem go wcześniej. Ale nie wiem, jak narysować na MapViewController przy użyciu DrawCircle.

Z tego, co mi się wydaje, gdy dzwonię pod numer [myCustomView setNeedsDisplay], nie wywołuje on w moim widoku metody DrawRect.

Oto kod: MapViewController.h

#import "DrawCircle.h" 


@interface MapViewController: UIViewController <CLLocationManagerDelegate>{ 
    DrawCircle *circleView; 
} 

@property (nonatomic, retain) DrawCircle *circleView; 
@end 

MapViewController.m

#import "DrawCircle.h" 

@interface MapViewController() 
@end 

@implementation MapViewController 
@synthesize circleView; 

- (void) viewDidLoad 
{ 
    circleView = [[DrawCircle alloc] init]; 
    [self setNeedsDisplay]; 

    [super viewDidLoad]; 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

@end 

DrawCircle.m

#import "DrawCircle.h" 

@interface DrawCircle() 
@end 

@implementation DrawCircle 

-(id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if(self) { 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 


     CGPoint point = CGPointMake(40, 137); 
     CGContextAddEllipseInRect(ctx, CGRectMake(point.x, point.y, 10, 10)); 
    } 

    CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor redColor] CGColor])); 
    CGContextFillPath(ctx); 
} 

Również, jeśli oferuje to jakąkolwiek pomoc w moim procesie myślowym, oto moja scena StoryBoard. StoryBoard Scene

Tam, gdzie niestandardową klasą viewcontrollers jest MapViewController, a niestandardową klasą widoków jest DrawCircle.

** EDYCJA: ** Chciałbym również wspomnieć, że w moim DrawCircle.m mam metody, które wywołuję z MapViewController.m i działają.

Również. Początkowo wywoływana jest metoda DrawRect, ale nie można ręcznie wywołać za pomocą setNeedsUpdate. Podczas debugowania nie wprowadza nawet metody DrawRect.

+0

Przy okazji, mam nadzieję, że moja odpowiedź poniżej pomoże, Twój komentarz na temat map i GPS sprawia, że ​​zastanawiam się, jakiego rodzaju mapy używasz. Jeśli używasz 'MKMapView' i jeśli chcesz, aby ten widok był powiązany ze współrzędnymi długości/długości, istnieje wiele lepszych sposobów na osiągnięcie tego celu (np. Niestandardowa adnotacja lub nakładka' MKCircle'). Ale jeśli chcesz, aby to czerwone kółko unosiło się w przestrzeni, nie ruszając się, gdy użytkownik patrzy i przybliża mapę, twój widok niestandardowy jest w porządku. Tylko zależy od tego, co próbujesz zrobić. – Rob

Odpowiedz

5

Tworzysz DrawCircle, ale nigdy nie dodajesz go do widoku, np.

[self.view addSubview:circleView]; 

W związku z tym jest poza zakresem i (jeśli używasz ARC) zostanie zwolniony. Ty również nie wydają się być ustawienie jego frame, takich jak:

circleView = [[DrawCircle alloc] initWithFrame:self.view.bounds]; 

Alternatywnie, można dodać widok w konstruktora interfejsu (standardowy UIView, ale następnie określić prawo w niestandardowej klasy IB).

Pamiętaj też, że zazwyczaj nie musisz nawet dzwonić pod numer setNeedsDisplay. Dodanie go do hierarchii widoków wywoła to za Ciebie. Tę funkcję należy wywołać tylko wtedy, gdy trzeba zaktualizować widok na podstawie niestandardowej właściwości.


Osobiście byłbym skłonny określić drawRect tak:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    // I'd just use `rect` and I can then use the `frame` to coordinate location and size of the circle 

    CGContextAddEllipseInRect(ctx, rect); 

    // perhaps slightly simpler way of setting the color 

    CGContextSetFillColorWithColor(ctx, [[UIColor redColor] CGColor]); 

    CGContextFillPath(ctx); 
} 

ten sposób, położenie i wielkość okręgu będzie podyktowany przez frame mam ustawiony na kole (przez sposób, przepraszam, jeśli to sprawia, że ​​jest bardziej zagmatwany, ale używam innej nazwy klasy, CircleView, ponieważ lubię mieć View w nazwie mojej podklasy UIView).

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIView *circle; 

    circle = [[CircleView alloc] initWithFrame:CGRectMake(100.0, 100.0, 200.0, 200.0)]; 
    circle.backgroundColor = [UIColor clearColor]; // because it calls `super drawRect` I can now enjoy standard UIView features like this 
    [self.view addSubview:circle]; 

    circle = [[CircleView alloc] initWithFrame:CGRectMake(300.0, 300.0, 10.0, 10.0)]; 
    circle.backgroundColor = [UIColor blackColor]; // because it calls `super drawRect` I can now enjoy standard UIView features like this 
    [self.view addSubview:circle]; 
} 
+0

Wielkie dzięki Rob! To zdecydowanie rozwiązało mój problem z możliwością aktualizacji mojego widoku! Jedynym problemem, który pojawił się teraz, jest to, że chociaż ustawiłem mój circlView na rozmiar moich granic odsłon, jest on ograniczony tylko do połowy ekranu, a nie na pełnym ekranie. – Johnrad

+0

@JohnnyWhisman to krąg, który jest zbyt mały? A może sam widok jest zbyt mały? Pozwoliłem, na przykład, na kolor tła dla widoku koła i zobaczyć, jednoznacznie, gdzie on jest, ale potem sprawić, aby rysunek okręgu zajął całą ramkę. Powstrzymuję się również od twardych rozmiarów kodowania, ale raczej pozwól, aby proces ustawiania ramki kontrolował rozmiar. Zobacz aktualizację. Poza tym, trudno jest powiedzieć, dlaczego nie widzisz pełnego koła bez zaktualizowanego przykładu kodu, ale powyższe działa dla mnie. – Rob

+0

@JohnnyWhisman Mam nadzieję, że moja zaktualizowana odpowiedź z przykładami kodu nie sprawi, że będzie bardziej myląca. Po prostu lubię, gdy moje niestandardowe widoki zachowują się jak standardowe 'UIView' /' UIImageView', gdzie 'frame' określa położenie i rozmiar kontrolki. Ale jeśli masz inne potrzeby z twojej klasy "DrawCircle", gdzie być może rysuje ona kilka okręgów i animuje je i tym podobne, wtedy posiadanie koła nie zajmuje całej "ramki" ma sens. To zależy od tego, jaki jest twój cel. Nadal jednak dostosowywanie kolorów tła może pomóc zdiagnozować, co się dzieje, oddzielając problemy 'frame' od problemów' drawRect'. – Rob

Powiązane problemy