2009-12-15 5 views
0

UITextView에서 집기 동작을 처리하는 가장 좋은 방법을 찾으려고합니다. 현재 나는 그것을 UITextView에서 다 처리하려고 노력해 왔지만 일관성없는 결과를 얻고있다. 그것은 터치 시작 방법에 내 감동을 잡을 수있는 것 같아요,하지만 항상 감동 방법에 감동 잡힐되지 않습니다.UITextView에서 핀치로 인한 부주의 한 결과

보기에서 터치를 처리하고 UITextView를 멀티 터치 이벤트에 전달하는 것이 더 좋을까요? scrollview에 UITextView를 배치하는 것과 같이 까다로운 작업을하는 것이 더 낫겠습니까?

이 시점에서 내가하고 싶은 것은 멀티 터치 핀치에서 폰트 크기를 조정하거나 확장 할 수 있습니다.하지만 작동하지는 않습니다.하지만 일관성이 없습니다. UITextView는 실제로 결과를 얻는 것 이상입니다.

내 컨트롤 UITextViewDelegate UITextView의 서브 클래스에서 구현합니다

#import "MyUITextView.h" 
@implementation MyUITextView 

/* skipping unimportant code */ 


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if([touches count] == 2) 
    { 
     NSLog(@"two touches"); 
     UITouch *first = [[touches allObjects] objectAtIndex:0]; 
     UITouch *second = [[touches allObjects] objectAtIndex:1]; 
     initialDistance = [self distanceBetweenTwoPoints:[first locationInView:self] toPoint:[second locationInView:self]]; 

    } 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches moved"); 
    if([touches count] == 2) 
    { 
     self.scrollEnabled = NO; 
     UITouch *first = [[touches allObjects] objectAtIndex:0]; 
     UITouch *second = [[touches allObjects] objectAtIndex:1]; 
     CGFloat currentDistance = [self distanceBetweenTwoPoints:[first locationInView:self] toPoint:[second locationInView:self]]; 
     if(initialDistance == 0) 
      initialDistance = currentDistance; 
     else if(currentDistance > initialDistance) 
     { 
      NSLog(@"zoom in"); 
      self.scrollEnabled = YES; 
      self.font = [UIFont fontWithName:[self.font fontName] size:[self.font pointSize] + 1.0f]; 
      self.text = self.text; 
     } 
     else if(currentDistance < initialDistance) 
     { 
      NSLog(@"zoom out"); 
      self.scrollEnabled = YES; 
      self.font = [UIFont fontWithName:[self.font fontName] size:[self.font pointSize] = 1.0f]; 
      self.text = self.text; 
     } 
    }  
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touches ended."); 
    initialDistance = 0; 
    [super touchesEnded:touches withEvent:event]; 

} 

-(CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint 
{ 
    float x = toPoint.x - fromPoint.x; 
    float y = toPoint.y - fromPoint.y; 
    return sqrt(x*x + y*y); 

} 

-(BOOL)canBecomeFirstResponder 
{ return NO; } 

기본적으로 그때 내가 화면에 두 개의 터치가있을 때 스크롤을 해제하고 시도했습니다 내가 이루어졌다 때 다시 활성화 . 또한, 복사 및 붙여 넣기 메뉴로 싸울 필요가 없도록 첫 번째 응답자가 될 수있는 기능을 사용 중지했습니다. 원터치를 사용할 때 복사 및 붙여 넣기 메뉴를 허용하여이 작업을 수행하는 것이 더 좋은 방법이라면 나는 모든 귀입니다. 나는 기본적으로이 제스처 비즈니스에 대한 첫 번째 항목에 대해 더 고급 예제를 사용하고 있다고 생각합니다.

또한 컨트롤이 자체적으로 모든 것을 처리하기 때문에 터치 이벤트를 전달할 필요가 없다고 생각합니다. 내가 잘못?

마지막으로 내 UITextView는 프로그래밍 방식으로 만들어지고 UINavigationControl에 저장됩니다. 그게 효과가 있는지 없는지 나는 모른다.

+0

설명 : touchesMoved의 터치를 잡지 않는다고 말하면 (1) 메서드가 호출되지 않았거나 (2) 호출되었지만 두 접촉을 모두 포함하지 않거나 (3) 관련이없는 터치가 포함되어 있습니까? – TechZen

+0

디버거의 내 NSLog 보고서에 따르면 자주 터치를 여러 번 시작하지만 여러 번 시작되지만 Touches Moved에 대한 로그 보고서는 한 번 또는 두 번 표시되지만 일반적으로 전혀 표시되지 않습니다. 그래서 내 Log 문은 그 메소드가 호출 될 때마다 실행되어야하기 때문에 호출되지 않는다고 나는 믿는다. 또한 코드 섹션을 깜빡했습니다. scrollEnabled 줄 바로 앞에는 캡슐화 if 문이있어이를 모두 이중으로 감싸줍니다. 나는 그것을 고쳐 줄 것이다. – georryan

+0

손가락이 동시에 움직이지 않을 수 있습니다. 이 경우 touchesMoved는 각 손가락마다 개별적으로 호출되므로 [터치 카운트]는 1을 반환합니다. (NSSet *) 터치는 실제로 업데이트 된 터치 만 포함합니다. –

답변

0

나는 완전히 모든 터치와 모든 이벤트를 로깅하는 것으로 시작한다고 생각합니다. 터치의 view 속성을 로깅해야합니다.

UIWindow의 하위 클래스로 앱의 모든 터치를 기록하는 진단 클래스를 만들 수도 있습니다. 이 기능은 터치가 실제로 발생하는 위치와 시간을 정확하게 볼 때 유용합니다. 터치가 예상보다 다른보기로 라우팅되고 있음을 알 수 있습니다.

OP에 대한 의견에서 언급했듯이 touchesMoved:은 멀티 터치 제스처를 한 번만 움직여 호출 할 수 있습니다. 따라서 집게 손가락처럼 두 손 제스처를 시작하고 손가락 하나만 움직이면 touchesMoved:에 원터치 만받습니다. 예를 들어, 사람들은 종종 엄지 손가락과 집게 손가락을 내려 놓고 집게 손가락 만 움직이면 대타를합니다. (두 손가락을 움직이더라도 집게 손가락은 항상 길기 때문에 엄지 손가락보다 먼 거리를 이동합니다.)