2013-02-01 30 views
7

Tôi đang viết một chương trình Objective-C cho iPhone.UILongPressGestureRecognizer sẽ không phản hồi chạm và giữ

Tôi đang cố gắng triển khai UILongPressGestureRecognizer và không thể làm cho ứng dụng hoạt động theo cách tôi muốn.

Những gì tôi muốn làm rất đơn giản:

Respond to một liên lạc là tổ chức xuống trên màn hình.

UILongPressGestureRecognizer chỉ hoạt động tốt bất cứ khi nào chạm di chuyển và khi chạm vào bắt đầu nhưng nếu tôi giữ liên lạc ở cùng một nơi, không có gì xảy ra.

Tại sao?

Làm cách nào để xử lý một lần chạm, không di chuyển và ở cùng một nơi?

Đây là mã hiện tại của tôi.


// Configure the press and hold gesture recognizer 
touchAndHoldRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(touchAndHold:)]; 
touchAndHoldRecognizer.minimumPressDuration = 0.1; 
touchAndHoldRecognizer.allowableMovement = 600; 
[self.view addGestureRecognizer:touchAndHoldRecognizer]; 
+0

// Định cấu hình báo chí và giữ công cụ nhận dạng cử chỉ touchAndHoldRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector (touchAndHold :)]; touchAndHoldRecognizer.minimumPressDuration = 0.1; touchAndHoldRecognizer.allowableMovement = 600; [self.view addGestureRecognizer: touchAndHoldRecognizer]; –

+0

Điểm của tôi chính xác. Bạn không nhận được các sự kiện lặp lại nếu bạn không di chuyển. Đó là những gì tôi đang cố gắng sửa chữa. Bạn có biết một phương pháp mà tôi có thể lặp lại các sự kiện nếu tôi không di chuyển không? –

+2

Điều này sẽ được mở cửa trở lại vì nếu bạn nhìn kỹ vào câu hỏi này, nó không hỏi "làm thế nào để làm một cử chỉ báo chí dài", mà là "bây giờ tôi nhận được thông báo ở giữa một cử chỉ báo chí dài, thậm chí mặc dù tôi không di chuyển. " Đây không phải là một bản sao của câu hỏi khác. – Rob

Trả lời

12

Các hành vi bạn mô tả, nơi nhận dạng cử chỉ của bạn không nhận cuộc gọi hơn nữa để xử lý của bạn khi bạn không di chuyển là hành vi tiêu chuẩn. Thuộc tính state cho các cử chỉ này khi bạn di chuyển thuộc loại UIGestureRecognizerStateChanged, do đó, điều đó có nghĩa là nếu mọi thứ không thay đổi, trình xử lý của bạn sẽ không được gọi.

Bạn có thể

  • Khi cuộc gọi đến nhận dạng cử chỉ của bạn với state của UIGestureRecognizerStateBegan bắt đầu một giờ lặp lại;
  • Khi gọi đến trình nhận dạng cử chỉ của bạn bằng state của UIGestureRecognizerStateCancelled, UIGestureRecognizerStateFailed hoặc UIGestureRecognizerStateEnded rồi invalidate và nhả bộ hẹn giờ;
  • Hãy chắc chắn rằng phương pháp cử chỉ nhận dạng được tiết kiệm bất cứ điều gì giá trị mà bạn đang tìm kiếm trong một số tài sản lớp (ví dụ như giá trị của locationInView hoặc bất cứ điều gì)

Vì vậy, có lẽ cái gì đó như:

@interface ViewController() 

@property (nonatomic) CGPoint location; 
@property (nonatomic, strong) NSTimer *timer; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
    gesture.minimumPressDuration = 0.1; 
    gesture.allowableMovement = 600; 
    [self.view addGestureRecognizer:gesture]; 
} 

- (void)handleTimer:(NSTimer *)timer 
{ 
    [self someMethod:self.location]; 
} 

- (void)handleGesture:(UIGestureRecognizer *)gesture 
{ 
    self.location = [gesture locationInView:self.view]; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]; 
    } 
    else if (gesture.state == UIGestureRecognizerStateCancelled || 
      gesture.state == UIGestureRecognizerStateFailed || 
      gesture.state == UIGestureRecognizerStateEnded) 
    { 
     [self.timer invalidate]; 
     self.timer = nil; 
    } 

    [self someMethod:self.location]; 
} 

- (void)someMethod:(CGPoint)location 
{ 
    // move whatever you wanted to do in the gesture handler here. 

    NSLog(@"%s", __FUNCTION__); 
} 

@end 
+0

... Tôi nghĩ tôi bắt đầu nhận được nó. Vấn đề của tôi là, tôi đã không hiểu phương pháp của Apple với cách họ đối phó với những xúc chạm. Tôi nghĩ rằng lý do tại sao tôi dành 4 giờ ngày hôm nay cọ rửa internet cho câu trả lời và nhận được ngày càng thất vọng là tôi đã bị mất điểm.Bạn đã giúp tôi xem Rob này. Không có phương pháp nào trong Cocoa giống như "handleTouchesRemainedStationary" bởi vì nếu một liên lạc chưa kết thúc, và chưa di chuyển ... Sau đó __obviously__ nó vẫn giữ nguyên. Bạn chỉ có thể tiếp tục lặp trong vòng lặp thực hiện của mình. Cảm ơn, Rob! –

+0

@ J-Rock Cool. Việc triển khai của bạn có thể thay đổi (ví dụ: bạn có thể đặt lại bộ hẹn giờ theo cử chỉ, vì vậy bạn không nhận được cuộc gọi hẹn giờ nếu bạn đang di chuyển), nhưng bạn có ý tưởng. FYI, tôi đơn giản hóa mã của tôi một chút. – Rob

+0

@ J-Rock Và một quan sát cuối cùng, mà tôi đã ám chỉ trước đó. Nếu bạn muốn một cử chỉ liên tục bắt đầu rất nhanh sau khi bạn chạm vào màn hình và tiếp tục khi bạn di chuyển xung quanh, bạn có thể muốn sử dụng 'UIPanGestureRecognizer'. Nếu điều đó phù hợp với bạn, điều đó có ý nghĩa hơn. Hầu hết các lập trình viên sẽ bị đánh lừa bởi việc sử dụng trình nhận dạng cử chỉ báo chí dài cho phép di chuyển 600 điểm. Nếu bạn phải sử dụng báo chí dài vì một lý do nào đó (ví dụ, điều quan trọng là phải chờ đợi 0,1 lần đầu), sử dụng nó, nếu không, hãy xem xét 'UIPanGestureRecognizer'. – Rob

Các vấn đề liên quan