2012-12-21 60 views
6

Tôi đang gặp một số sự cố khi cố gắng triển khai một ngón tay 3 ngón tay.Cử chỉ chụm ba ngón tay

Tôi đã sử dụng pinch 2 ngón tay với xoay 2 ngón tay, riêng lẻ! (không có cử chỉ đồng thời cần thiết hay không) vấn đề là nhiều lần, hệ thống xác định chuyển động sai vì cả hai đều rất giống nhau, vì vậy tôi phải loại bỏ các ngón tay và nhấn lại để cố gắng xác định hệ thống Tôi đã tìm kiếm rất nhiều để xem liệu delayBegin có giúp ích không, hoặc nếu tôi có thể làm điều gì đó kích hoạt cử chỉ đồng thời, nhưng không ai làm việc được, vì vậy ý ​​tưởng của tôi là thay vì sử dụng 2 ngón tay để kẹp, tôi có thể sử dụng 3 (vì nó dễ dàng hơn để pinch hơn xoay).

Vấn đề là, như bạn biết, Pinch chỉ hoạt động với 2 ngón tay. Vì vậy, tôi quyết định tôi có thể phân lớp UIPinchGestureReconizer và chỉ cho phép nó hoạt động khi có 3 ngón tay trên màn hình. Phần còn lại nó có thể hoạt động như công cụ pinch tiêu chuẩn, thậm chí bỏ qua ngón tay thứ ba (để tính tỷ lệ) nhưng chắc chắn ngón tay thứ ba vẫn còn trên màn hình.

Vì vậy, tôi đã cố gắng thực hiện sau đây cho ThreeFingerPinchRecognizer (mà lớp Sub các UIPinchGestureRecognizer) tôi

@implementation GRThreeFingerPinchRecognizer 

-(id)initWithTarget:(id)target action:(SEL)action 
    { 
    self = [super initWithTarget:target action:action]; 
    if(self){ 
    } 
    return self; 
} 

- (void)reset 
{ 
    [super reset]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    int numberOfTouches = event.allTouches.count; 
    if (numberOfTouches == 3) 
    { 
     [super touchesBegan:touches withEvent:event]; 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    int numberOfTouches = event.allTouches.count; 
    if (numberOfTouches == 3) 
    { 
     [super touchesMoved:touches withEvent:event]; 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
     [super touchesEnded:touches withEvent:event]; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesCancelled:touches withEvent:event]; 
} 

Vì vậy, như bạn thấy, tôi đang cố gắng để có được những chức năng tương tự của nhúm 2 ngón tay (bằng cách chỉ gọi [super] chức năng, và tại các chức năng touchesBegantouchesMoved, tôi đang thử nghiệm nếu có 3 ngón tay trên màn hình (bằng cách nhìn vào event.alltouches.count)

với điều này, vòng quay đang làm việc hoàn hảo với hai ngón tay, nhưng pinch là n ot hoạt động rất tốt, khó có thể kích hoạt nó và khi nó hoạt động, nó không hoạt động như hai ngón tay ...

Tôi biết tôi có thể làm điều này hoàn toàn sai, vì vậy mọi trợ giúp sẽ tuyệt vời !!

Cảm ơn bạn rất nhiều!

+0

cách tiếp cận intersting, nhưng PinchGestureRecognizer (mà cuối cùng bạn đang gọi) có thể được mong đợi 2 chạm không 3, tôi sẽ có lẽ cố gắng loại bỏ một trong những chạm trước khi bạn gọi super..you sẽ phải tìm ra cái nào để loại bỏ mặc dù .. – Daniel

+0

Tôi tin rằng đó là xử lý bên trong PinchGesture, vì tôi không thay đổi bất cứ điều gì trong sự kiện được thông qua, Im chỉ chuyển tiếp nó! Nếu tôi xóa "if", pinch hoạt động chính xác (nhưng bằng 2 ngón tay) –

+0

* Lưu ý tốt: Các tính năng 3 ngón tay sẽ không hoạt động trên thiết bị của người dùng đã bật thu phóng trong cài đặt (một tính năng của Apple nơi bạn nhấn đúp vào màn hình bằng 3 Các ngón tay để phóng to (trong bất kỳ ứng dụng nào, giống như cách tính năng chụp màn hình hoạt động trong bất kỳ ứng dụng nào)) ... Sử dụng khả năng phát hiện 3 ứng dụng tốt hơn có thể nguy hiểm như sử dụng tính năng phát hiện nút home. (Tôi, cùng với nhiều tính năng khác đã bật tính năng thu phóng này) –

Trả lời

0

Xem một số câu liên này có thể giúp u xác định Nhà nước nhúm:

if (pinch.numberOfTouches > 1) 
{ 
    CGPoint firstPoint = [pinch locationOfTouch:0 inView:self]; 
    CGPoint secPoint = [pinch locationOfTouch:1 inView:self]; 
    currentUpperY = MIN(firstPoint.y, secPoint.y); 
    if (previousY == 0) previousY = currentUpperY; 
    Float32 y = (self.contentOffset.y + previousY - currentUpperY); 
    [self setContentOffset:CGPointMake(0, y < 0 ? 0 : y) animated:NO]; 

    if (pinch.state == UIGestureRecognizerStateBegan) 
    { 
     pinchStarted = YES; 
     firstY = MIN(firstPoint.y, secPoint.y); 
     secondY = MAX(firstPoint.y, secPoint.y); 
     NSArray *pinchedIndexs = [self indexPathsForRowsInRect:CGRectMake(0.0, firstY, CGRectGetWidth(self.bounds), secondY)]; 
     if (pinchedIndexs.count) itemToOpenOrClose = [[currentItems subarrayWithRange:NSMakeRange(((NSIndexPath *)[pinchedIndexs objectAtIndex:0]).row, pinchedIndexs.count - 1)] copy]; 
    } 
} 

if ((pinch.state == UIGestureRecognizerStateChanged && pinchStarted && itemToOpenOrClose.count) 
    || pinch.state == UIGestureRecognizerStateEnded) 
{ 
    if (pinch.scale > 1) // Pinch OUT 
    { 
     for (Item *item in itemToOpenOrClose) 
     {     
      [self openItem:item inIndexPath:[NSIndexPath indexPathForRow:[currentItems indexOfObject:item] inSection:0]]; 
     } 
    } 
    else if (pinch.scale < 1) // Pinch IN 
    { 
     for (Item *item in itemToOpenOrClose) 
     { 
      [self closeItem:item inIndexPath:[NSIndexPath indexPathForRow:[currentItems indexOfObject:item] inSection:0]]; 
     } 
    } 

    if (pinch.state == UIGestureRecognizerStateEnded) 
    { 
     pinchStarted = NO; 
     itemToOpenOrClose = nil; 
     previousY = 0; 
    } 
} 
Các vấn đề liên quan