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에 저장됩니다. 그게 효과가 있는지 없는지 나는 모른다.
설명 : touchesMoved의 터치를 잡지 않는다고 말하면 (1) 메서드가 호출되지 않았거나 (2) 호출되었지만 두 접촉을 모두 포함하지 않거나 (3) 관련이없는 터치가 포함되어 있습니까? – TechZen
디버거의 내 NSLog 보고서에 따르면 자주 터치를 여러 번 시작하지만 여러 번 시작되지만 Touches Moved에 대한 로그 보고서는 한 번 또는 두 번 표시되지만 일반적으로 전혀 표시되지 않습니다. 그래서 내 Log 문은 그 메소드가 호출 될 때마다 실행되어야하기 때문에 호출되지 않는다고 나는 믿는다. 또한 코드 섹션을 깜빡했습니다. scrollEnabled 줄 바로 앞에는 캡슐화 if 문이있어이를 모두 이중으로 감싸줍니다. 나는 그것을 고쳐 줄 것이다. – georryan
손가락이 동시에 움직이지 않을 수 있습니다. 이 경우 touchesMoved는 각 손가락마다 개별적으로 호출되므로 [터치 카운트]는 1을 반환합니다. (NSSet *) 터치는 실제로 업데이트 된 터치 만 포함합니다. –