2011-04-25 6 views
3

아무 이유없이 중지하고 다음과 같이 완료/touchesBegan/이동 구현 :이있는 touchesMoved는 몇 번을 발사,하지만 내가있는 UIImageView를 서브 클래 싱 한

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"Began"); 

mouseSwiped = NO; 
UITouch *touch = [touches anyObject]; 

if ([touch tapCount] == 2) { 
    self.image = nil; 
    return; 
} 

lastPoint = [touch locationInView:self]; 
lastPoint.y -= 20; 

} 




- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    mouseSwiped = YES; 
     NSLog(@"Moved"); 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPoint = [touch locationInView:self]; 
    currentPoint.y -= 20; 


    UIGraphicsBeginImageContext(self.bounds.size); 

    [self.image drawInRect:CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height)]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 18.0); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.5, 1.0, 1.0); 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    self.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    lastPoint = currentPoint; 

} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
     NSLog(@"Ended"); 
    UITouch *touch = [touches anyObject]; 

    if ([touch tapCount] == 2) { 
     self.image = nil; 
     return; 
    } 


    if(!mouseSwiped) { 
     NSLog(@"here?"); 
     UIGraphicsBeginImageContext(self.bounds.size); 
     [self.image drawInRect:CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height)]; 
     CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
     CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 18.0); 
     CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.5, 1.0, 1.0); 
     CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
     CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
     CGContextStrokePath(UIGraphicsGetCurrentContext()); 
     CGContextFlush(UIGraphicsGetCurrentContext()); 
     self.image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    } 
} 

을 그리고에 나타납니다 처음 조금 일하는 것. TouchesBegan()이 매번 실행되면 이동을 시작할 때 touchesMoved()가 가끔 5 번, 때로는 3 번, 때로는 7 번 발사되기도하지만 멈추는 경우도 있습니다. touchesEnded()는 해고 된 적이 없으며, 나는 무엇이 계속되고 있는지 보지 못했습니다!

나는 잠시 동안 이것을 꼼짝 않고 바라 보았습니다. 누군가 내가 놓친 것을 보았습니까?

+0

iOS 3.1 이하를 타겟팅합니까? 그렇지 않은 경우 터치를 추적하는 대신 제스처 인식기를 사용해보십시오. –

답변

1

재정 및 구현 :이 호출되는 경우

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event을 참조하십시오.

만약 그렇다면 무언가가 터치 이벤트를 취소하고 있습니다. 메모리가 부족할 수 있습니다.

+0

취소 중입니다! 나는 메모리 문제의 가능성을 조사하고 있지만, 앞으로 어떤 일이 벌어 질지에 관해서 다른 아이디어가 있습니까? –

1

향후이 문제를 읽는 사용자는 UIImageView를 컨테이너 UIView로 래핑하는 것이 해결책입니다. Ido it 그리기 앱을위한 방법은 단일 UIView를 하나의 목적, 즉 내가 그린 UIImageView를 포함하는 것입니다.

는 "UIView의"의 서브 클래스로 "ImageContainer"라는 이름의 클래스를 만듭니다

ImageContainer *view = [[ImageContainer alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]]; 

물론, 프레임이 당신이 원하는 무엇이든 할 수있다.

그런 다음, "ImageContainer"클래스 (헤더 파일) 내부에 다음과 같이 속성을 추가 :

@property UIImageView *imageView; 

이 구현 파일 (ImageContainer.m) 안에 해당 속성을 합성하고 추가하는 것은에 하위 뷰 같다 "- (id) initWithFrame : (CGRect) frame"메서드의 ImageContainer를 호출합니다.

다음, 대신 참조의 드로우 코드에서 다음

self.image 

참조 :

[[[self imageView] image] drawInRect:self.bounds]; 
[[self imageView] setImage:...]; 

희망이 거기에 누군가가 도움이!