2009-12-15 61 views
0

我想弄清楚在UITextView處理捏手勢的最佳方式。目前我一直試圖在UITextView中處理所有這些,但是我得到的結果並不一致。它似乎能夠在觸動開始的方法中捕捉到我的觸動,但它並不總是在觸動方法中被捕獲。Inconsitant結果與在UITextView Pinches

在視圖中處理觸摸並在多點觸控事件上使用UITextView傳遞會更好嗎?將UITextView放置在滾動視圖中做一些棘手的事情會更好嗎?

在這一點上,我想要做的就是調整多點觸控捏或擴大的字體大小,我可以工作,但它不是一致的,我想我已經設法混淆UITextView比實際得到的結果更多。

我控制的UITextView的子類,並實現UITextViewDelegate:

#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 2009-12-15 20:09:12

+0

根據我在調試器中的NSLog報告,它經常會在觸摸中多次觸發我的觸摸,但只會顯示Touches Moved的一些或兩個日誌報告,通常不會。所以,因爲我的Log語句應該在調用該方法時觸發,我相信它不會被調用。 此外我忘了一段代碼。就在scrollEnabled行之前,有一個封裝if語句將所有內容都包含在雙重觸摸中。我會解決這個問題。 – georryan 2009-12-15 21:37:37

+0

你的手指不能同時移動。在這種情況下,將單獨調用每個手指的touchesMoved,因此[touches count]將返回1.請記住,(NSSet *)觸摸僅包含實際更新的觸摸。 – 2009-12-15 21:46:43

回答

0

我想我會開始完全記錄所有觸及所有事件。確保記錄觸摸的視圖屬性。

您還可以繼承UIWindow的子類來創建一個診斷類,該類將記錄應用程序中的每個觸摸。這對於準確查看觸摸實際發生的位置和時間非常有用。您可能會發現觸摸的路線不同於您的預期。

正如在對OP的評論中指出的那樣,touchesMoved:可以通過一個多點觸摸手勢的移動來調用。所以如果你開始像捏一樣的雙手觸摸手勢,但只能移動一根手指,你只能在touchesMoved:中獲得一次觸摸。例如,人們通常通過放下拇指和食指然後僅移動食指來執行捏合。 (即使他們同時移動,食指也總會比拇指移動更長的距離,因爲它會更長。)