Tôi có một số UICollectionView
triển khai bố cục dựa trên lưới tùy chỉnh UICollectionViewCells
. Để cho phép các ô phản hồi việc kéo, tôi cá nhân thêm một UIPanGestureRecognizer
vào mỗi ô.Làm thế nào để chuyển cử chỉ pan sang UICollectionVIew từ UICollectionViewCell?
UICollectionView
Vẫn cuộn (ngang) khi tôi chạm xuống và trượt sang trái/phải bắt đầu từ điểm giữa các ô, nhưng miễn là trình nhận dạng cử chỉ được thêm vào ô, có vẻ như CollectionView
từ chối di chuyển khi tôi bắt đầu thao tác vuốt của tôi trong một ô.
Ngay bây giờ, tôi tách riêng các kéo ngang/phải ngang từ kéo lên/xuống theo chiều dọc, vì vậy không nên có bất kỳ xung đột nào giữa các ô kéo ra (trượt dọc) và cuộn CollectionView
(vuốt ngang). Trong trường hợp này, làm thế nào tôi có thể vượt qua thao tác vuốt đến chế độ xem bộ sưu tập/cuộn để nó biết cuộn như bình thường? Nó thực sự gây phiền nhiễu khi phải bắt đầu trên ranh giới hoặc khoảng cách giữa các tế bào.
Khi tôi xóa cử chỉ di chuyển khỏi ô, việc cuộn hoạt động như bình thường bất kể tôi bắt đầu vuốt trên ô hay giữa các ô.
EDIT: mong muốn hành vi cử chỉ chảo đăng tải dưới đây là mã hiện
// Handle pans by detecting swipes:
-(void) handlePan:(UIPanGestureRecognizer*)recognizer
{
// Calculate touch location
CGPoint touchXY = [recognizer locationInView:masterWindowView];
// Handle touch
if (recognizer.state == UIGestureRecognizerStateBegan)
{
gestureWasHandled = NO;
pointCount = 1;
startPoint = touchXY;
}
if (recognizer.state == UIGestureRecognizerStateChanged)
{
++pointCount;
// Calculate whether a swipe has occurred
float dX = deltaX(touchXY, startPoint);
float dY = deltaY(touchXY, startPoint);
BOOL finished = YES;
if ((dX > kSwipeDragMin) && (ABS(dY) < kDragLimitMax)) {
touchType = TouchSwipeLeft;
NSLog(@"LEFT swipe detected");
[recognizer requireGestureRecognizerToFail:recognizer];
//[masterScrollView handlePan]
}
else if ((dX < -kSwipeDragMin) && (ABS(dY) < kDragLimitMax)) {
touchType = TouchSwipeRight;
NSLog(@"RIGHT swipe detected");
[recognizer requireGestureRecognizerToFail:recognizer];
}
else if ((dY > kSwipeDragMin) && (ABS(dX) < kDragLimitMax)) {
touchType = TouchSwipeUp;
NSLog(@"UP swipe detected");
}
else if ((dY < -kSwipeDragMin) && (ABS(dX) < kDragLimitMax)) {
touchType = TouchSwipeDown;
NSLog(@"DOWN swipe detected");
}
else
finished = NO;
// If unhandled and downward, produce a new draggable view
if (!gestureWasHandled && finished && (touchType == TouchSwipeDown))
{
[self.delegate cellBeingDragged:self];
dragView.center = touchXY;
dragView.hidden = NO;
dragView.backgroundColor = [UIColor clearColor];
masterScrollView.scrollEnabled = NO; // prevent user from scrolling during
gestureWasHandled = YES;
}
else if (gestureWasHandled)
{
// allow continued dragging after detection
dragView.center = touchXY;
}
}
if (recognizer.state == UIGestureRecognizerStateEnded)
{
// ensure that scroll view returns to scrollable
if (gestureWasHandled) {
[self.delegate cell:self dragEndedAt:touchXY];
}
}
}
// Allow simultaneous recognition
-(BOOL) gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer
{
return YES;
}
Mã này hoạt động khi trao cho mỗi tế bào riêng lẻ. Nó không hoạt động khi được gắn vào UICollectionView như là trình nhận dạng cử chỉ của nó, và thực tế nó dừng tất cả việc di chuyển.
Mã đó ở đâu? Mã nhận dạng cử chỉ của bạn phải nằm trong bộ điều khiển chế độ xem của bạn. Phương thức 'gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer' cho phép hai cử chỉ khác nhau chạy đồng thời, ** không ** một cử chỉ được nhận dạng bởi hai khung nhìn khác nhau - đó là những gì bạn định? – KerrM