2010-05-19 28 views
8

Tôi cảm thấy như tôi nên biết điều này nhưng tôi đã stumped cho giờ bây giờ và tôi đã hết ý tưởng.performSelector: withObject: afterDelay: không hoạt động từ scrollViewDidZoom

Lý thuyết rất đơn giản, người dùng thao tác thu phóng và định vị trong chế độ xem cuộn bằng cách sử dụng một chụm. Nếu họ giữ pinch đó trong một khoảng thời gian ngắn thì scrollview sẽ ghi lại mức thu phóng và độ lệch nội dung.

Vì vậy, tôi nghĩ rằng tôi muốn bắt đầu một performSelector: withObject: withDelay trên phương thức ủy nhiệm scrollViewDidZoom. Nếu nó hết hạn sau đó tôi ghi lại các thiết lập. Tôi xóa các cuộc gọi theo lịch trình mỗi khi scrollViewDidZoom được gọi và khi cử chỉ chụm kết thúc.

Đây là những gì tôi có:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView{ 
    NSLog(@"resetting timer"); 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(positionLock) object:nil]; 

    [self performSelector:@selector(positionLock) withObject:nil afterDelay:0.4];    
} 

-(void)positionLock{ 
    NSLog(@"position locked "); 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{ 

    NSLog(@"deleting timer"); 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(positionLock) object:nil]; 
} 

Đây là kết quả:

2010/05/19 22: 43: 01,931 đặt hẹn giờ
2010/05/19 22: 43: 01,964 đặt hẹn giờ
2010/05/19 22: 43: 02,231 đặt hẹn giờ
2010/05/19 22: 43: 02,253 đặt hẹn giờ
2010/05/19 22: 43: 02,269 timer
đặt2010-05-19 22: 43: 02.298 đặt lại hẹn giờ
2010-05-19 22: 43: 05.399 xóa bộ hẹn giờ

Như bạn có thể thấy sự chậm trễ giữa các sự kiện cuối cùng và thứ hai cuối cùng phải là quá đủ để cuộc gọi chọn trì hoãn thực hiện.

Nếu tôi thay performSelector: withObject: withDelay với performSelector cũ đồng bằng: Tôi có được điều này:

2010-05-19 23: 08: 30,333 đặt hẹn giờ
2010/05/19 23: 08: 30,333 vị trí khóa
2010/05/19 23: 08: 30,366 timer
2010/05/19 23 đặt: 08: 30,367 vị trí khóa
2010/05/19 23: 08: 30,688 xóa timer

nào isn' t những gì tôi muốn nhưng phục vụ để cho thấy rằng nó chỉ là sự chậm trễ gây ra nó để không func tion, không phải cái gì để làm với bộ chọn không được khai báo trong tiêu đề, là lỗi chính tả hoặc bất kỳ lý do nào khác.

Bất kỳ ý tưởng nào về lý do tại sao nó không hoạt động?

Trả lời

19

Tôi nghĩ rằng các sự kiện hẹn giờ bị bỏ qua trong quá trình theo dõi (khi một ngón tay xuống để cuộn hoặc thu phóng). Bạn có thể phải thực hiện bộ chọn ở chế độ khác (xem [NSObject performSelector:withObject:afterDelay:inModes:]). Cụ thể, hãy thử sử dụng hằng số NSRunLoopCommonModes cho chế độ.

+0

có vẻ như bạn đã có điểm. tôi tự hỏi tại sao những sự kiện đó bị bỏ qua. đây có phải là lựa chọn thiết kế không? có bất kỳ tài liệu nào về điều này không? – erkanyildiz

+0

Bạn hoàn toàn đúng. Điều đó đã khiến tôi khốn khổ ..! –

3

Chỉ cần thêm vào những gì Brian nói - đây là thực hiện của tôi về câu trả lời của mình:

[self performSelector:@selector(callMethod) withObject:0 afterDelay:1.0 inModes:@[NSRunLoopCommonModes]]; 

Note - inModes: mất một mảng của chế độ.

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