Bạn cần xử lý các thao tác của mình trong phần giám sát thay vì ở chế độ xem mà bạn muốn tắt. Điều này sẽ cho phép bạn chuyển chế độ xem mà không mất sự kiện chạm của bạn. Khi bạn làm điều này mặc dù, bạn sẽ phải kiểm tra chính mình cho dù liên lạc đang xảy ra trong subview cụ thể bạn muốn chuyển ra ngoài. Điều này có thể được thực hiện nhiều cách khác nhau, nhưng đây là một số phương pháp để giúp bạn bắt đầu:
Chuyển đổi dễ phân biệt/Point để nhìn khác:
[view convertRect:rect toView:subview];
[view convertPoint:point toView:subview];
Dưới đây là một số phương pháp để kiểm tra nếu điểm nằm trong giao diện :
[subView hitTest:point withEvent:nil];
CGRectContainsPoint(subview.frame, point); //No point conversion needed
[subView pointInside:point withEvent:nil];
Nói chung, tốt hơn nên sử dụng UIGestureRecognizers. Ví dụ, nếu bạn đang sử dụng một UIPanGestureRecognizer, bạn sẽ tạo ra một phương thức mà bộ nhận dạng cử chỉ có thể gọi và trong phương thức đó bạn làm công việc của bạn. Ví dụ:
- (void) viewPanned:(UIPanGestureRecognizer *)pan{
if (pan.state == UIGestureRecognizerStateBegan){
CGRect rect = subView.frame;
newView = [[UIView alloc] initWithFrame:rect];
[subView removeFromSuperview];
[self addSubview:newView];
} else if (pan.state == UIGestureRecognizerStateChanged){
CGPoint point = [pan locationInView:self];
newView.center = point;
} else {
//Do cleanup or final view placement
}
}
Sau đó, bạn init recognizer, gán nó vào mục tiêu (thường tự) và thêm nó:
[self addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(viewPanned:)]];
Bây giờ ngã (đó sẽ là SuperView quản lý nó subviews) sẽ trả lời để xoay chuyển động.
Nguồn
2012-04-05 15:24:19
Không chắc chắn lý do tại sao. Bạn có thể gửi mã không? BTW, điều gì khiến bạn không thể sử dụng UIGestureRecognizer? Trong hầu hết mọi trường hợp tôi đã xem xét bằng cách sử dụng Touches, tôi đã thấy rằng một UIGestureRecognizer hiện có hoặc subclassing UIGestureRecognizer hoạt động tốt hơn (và tôi có thể tái sử dụng nó). –
Nếu bạn đang sử dụng chứng khoán UIPanGestureRecognizer, 'touchesBegan' sẽ không nằm trong mã của bạn. Bạn nên thiết lập một số phương pháp đích như sau: '- (void) viewPanned: (UIPanGestureRecognizer) pan'. Khi bạn khởi tạo trình nhận dạng, bạn đặt mục tiêu của nó: '[[UIPanGestureRecognizer alloc] initWithTarget: hành động tự: @selector (viewPanned :)]'.Phương thức đó sẽ được gọi lặp lại và bạn có thể kiểm tra trạng thái và thực hiện các hành động thích hợp: 'If (pan.state == UIGestureRecognizerStateBegan) {.......}' hoặc 'If (pan.state == UIGestureRecognizerStateChanged {. ....} 'etc ... –
Tôi mở rộng câu trả lời của mình để phản ánh điều này –