2012-02-14 12 views
6

Rysuję linie zgodnie z metodą touchesMoved: i zazwyczaj działa dobrze. Ale kiedy przybliżam obraz i rysuję, poprzednio narysowane linie są zarówno przemieszczane, jak i coraz bardziej rozmyte, ostatecznie zanikające. Próbowałem używać UIPinchGestureRecognizer i po prostu zwiększać liczbę z myImageView (tylko dla zdarzeń wielodotykowych), ale problem występuje w obie strony. Oto kod do rysowania:CGContextStrokePath nie działa podczas powiększania i rysowania obrazów

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
NSArray *allTouches = [touches allObjects]; 
int count = [allTouches count]; 
if(count==1){//single touch case for drawing line 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPoint = [touch locationInView:myImageView]; 
    UIGraphicsBeginImageContext(myImageView.frame.size); 
    [drawImage.image drawInRect:CGRectMake(0, 0, myImageView.frame.size.width, myImageView.frame.size.height)]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 2.0); 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    lastPoint = currentPoint; 
} 
else{//multi touch case 
    // handle pinch/zoom 
    } 
} 

Oto obraz wyciągnąć ponad bez powiększania:

enter image description here

I to jest obraz przedstawiający problem po powiększania-in z czerwoną strzałkę pokazuje segment który został już narysowany przed powiększeniem (jak pokazano na poprzednim obrazie). Obraz jest zamazany i przesunięty zarówno:

enter image description here

Można również zauważyć, że część linii poprowadzonej pod koniec jest nienaruszone i zjawisko występuje dla liniami w czasie. Wierzę, że powodem tego jest to, że atrybuty rozmiaru obrazu są tracone podczas powiększania/pomniejszania, co prawdopodobnie powoduje rozmycie i przesunięcie, ale nie jestem tego pewien!

EDYCJA - Przesłałem a short video, aby pokazać, co się dzieje. To zabawne ...

EDYCJA 2- Oto a sample single-view app koncentrujące się na problemie.

+0

Myślę, że może to mieć coś wspólnego z contentMode widoku, który rysujesz. Spróbuj użyć UIViewContentModeRedraw? – kevboh

+0

Próbowałem ustawić dla 'myImageView' i' drawImage' (oba są 'UIImageView's), ale to nie zadziałało :(... – tipycalFlow

+0

@kevboh Przesłałem wideo (i dodano w odpowiedzi), które może daje lepsze wyobrażenie o problemie ... – tipycalFlow

Odpowiedz

4

Pobrałem Twój projekt i znalazłem problem polegający na autoreoryzacji. Następujące kroki będą go rozwiązać:

Krok 1. Komentarz linia 70:

drawImage.frame = CGRectMake(0, 0, labOrderImgView.frame.size.width, labOrderImgView.frame.size.height); 

w swojej metodzie touchesMoved.

Etap 2. dodać jedną linię kodu po drawImage jest alloc DE (linia 90) viewDidLoad sposobem:

drawImage.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

Następnie problem został rozwiązany.

+0

Absolutnie genialny ... dzięki człowieku! Zasługujesz na więcej przebojów! – tipycalFlow

1

I wdrożone zachowanie jak to w następnym sposób:

  1. Należy pamiętać wszystkie współrzędne swojej drodze (model).
  2. Narysuj swoją ścieżkę w tymczasowym widoku obrazu.
  3. Gdy użytkownik zacznie szczypać/powiększać obraz - nie robić nic, tzn. Ścieżka będzie skalowana przez iOS
  4. W momencie, gdy użytkownik zakończy zbliżanie palcem - przerysuj ścieżkę we właściwy sposób, używając modelu.

Jeśli zapiszesz ścieżkę jako obraz, w rezultacie uzyskasz złe skalowanie. Również - nie narysuj ścieżki bezpośrednio do obrazu - narysuj do pewnego przezroczystego widoku i podziel razem na koniec edycji.

+0

BTW, rozważałem twoje przykładowy kod - a ja zaleciłbym, aby zaimplementować ścieżkę przechwytywania/zapisywania oddzielnie od rysunku, co może pomóc w uniknięciu wielu problemów Wzorzec widoku kontrolera modelu – SVGreg

+0

W rzeczywistości złe wyniki nie pojawiają się podczas powiększania. Rysuję ** po ** przybliżeniu, że to dziwactwo się dzieje.Zobacz krótki filmik w pytaniu, aby uzyskać lepszy pomysł – tipycalFlow

+0

Tak, widziałem wideo - to jakiś niewyraźny efekt - nie rysuj ścieżki wprost do obrazu - rysuj do niektórych przezroczysty vie w i podzielić je razem pod koniec edycji. – SVGreg

1

Zawsze rysujesz obraz w rozmiarze obrazu, który jest rozmazany, ponieważ po powiększeniu nie dostosowujesz się do wyższej rozdzielczości. Bardziej sensownym rozwiązaniem byłoby jednorazowe utworzenie UIBezierPath. i po prostu dodaj do niego linię (z addLineToPoint:) w metodzie touchesMoved, a następnie narysuj ją w niestandardowej metodzie drawRect poprzez [bezierPath stroke]. Możesz również dodać tylko CAShapeLayer jako podzbiór widoku obrazu i ustawić jego właściwość path na wcześniej utworzoną przez ciebie CGPath.

Przykładem jest Drawing bezier curves with my finger in iOS?.

Powiązane problemy