2012-03-31 7 views
9

Jestem początkującym programistom iOS, więc przepraszam, jeśli moje pytanie jest głupie pytanie.Podklasa UIView: drawRect nie nazywane

Próbuję utworzyć aplikację, która wykonuje niestandardowy rysunek na załadowanym obrazie.

Aby to zrobić, dowiedziałem się, że rozwiązaniem jest podklasa UIView i edycja metody drawRect.

Zrobiłem to na poniższym kodzie, który aktywuje się na IBAction połączony z przyciskiem w pliku scenariusza programu Interface Builder.

UIImageView *image = [[UIImageView alloc] initWithImage: [UIImage imageNamed:  @"SampleImage.jpg"]]; 
image.frame = previewView.frame; 
[image setContentMode:UIViewContentModeScaleAspectFit];  

[previewView addSubview:image]; 

customView *aCustomView = [[customView alloc] initWithFrame: CGRectMake(image.bounds.origin.x, image.bounds.origin.y, image.bounds.size.width, image.bounds.size.height)]; 
[previewView addSubview:aCustomView]; 

customView jest UIView podklasa że stworzyłem, którego init i drawRect metody są ustawione tak:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    NSLog(@"INITIALIZING"); 
    if (self) { 
     // Initialization code 
     [self setBackgroundColor:[UIColor clearColor]]; 
    } 
    return self; 
} 


- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    NSLog(@"DRAWING"); 

    CGContextClearRect(ctx, rect); 

    CGContextSetRGBFillColor(ctx, 0, 255, 0, 0.3); 
    CGContextFillEllipseInRect(ctx, rect); 

    CGContextSetRGBStrokeColor(ctx, 255, 0, 0, 1); 
    CGContextSetLineWidth(ctx, 2); 
    CGContextStrokeEllipseInRect(ctx, rect); 
} 

Problem, który mam jest, że żaden rysunek wykonany i na NSLog mam Komunikat "INICJALIZACJA", ale nie rysunek "RYSOWANIE".

Zasadniczo stanowi to initWithFrame, ale nie wywołuje metody drawRect.

Czy możesz wskazać mi, co robię źle?

Odpowiedz

5

Paolo

Oto kilka rzeczy, które można spróbować:

  1. w initWithFrame sprawdzić, czy zmienna frame zawiera co oczekiwałby go: NSLog(@"Frame: %@", NSStringFromCGRect(frame));
  2. Spróbuj zadzwonić [preview setNeedsDisplay]; po dodaniu go do swojego nadawcy

Na koniec zmieniłbym

image.frame = previewView.frame;

z:

image.bounds CGRectMake = (0, 0, previewView.frame.size.width, previewView.frame.size.height);

+0

Dzięki, umieszczając NSLog dowiedziałem się, że coś było nie tak w wywołaniu metody drawRect. Po dodaniu [previewView setNeedDisplay] wywoływana jest metoda, ale nie wtedy, gdy oczekuję, że zostanie wykonana. Mam na myśli, że wykonując kroki kodu, wykonanie linii [previewView setNeedDisplay] nie powoduje pojawienia się niestandardowego rysunku, zamiast tego pojawia się później w jakiś sposób. Chciałbym zrozumieć, w którym momencie wywoływana jest metoda drawRect, ale mimo to początkowy problem został rozwiązany, dzięki :) – Dobrodeveloper

13
  1. Upewnij się, że nowa klasa pogląd instacji UIView, nie UIImageView.
  2. Aby upewnić się, że pojawi się nowy widok, należy wykonać [viewContainer addSubView:], aby wywołać funkcję drawRect.

Ref od Doc:

Klasa UIImageView jest zoptymalizowany rysować swoje obrazy na ekranie. UIImageView nie wywoła metody drawRect: podklasy.Jeśli twoja podklasa potrzebuje niestandardowego kodu rysunku, zaleca się używanie UIView jako klasy bazowej.

https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIImageView_Class/Reference/Reference.html

+0

można ustawić niestandardową klasę, która przesłania draw rect do kodera – Subhash

2

Może pytanie jest rama aCustomView jest (0,0,0,0).
Możesz spróbować przekazać ciągły parametr CGRect, taki jak: CGRectMake(5, 5, 100, 100)。

Powiązane problemy