Мое приложение состоит из колоды карт. Каждая карта имеет scrollview, которая позволяет просматривать изображения, связанные с этой картой. Вы можете перетащить, чтобы посмотреть на другую карту в колоде с помощью жесты. К сожалению, если вы не выполняете чистое перетаскивание в первый раз (например, если вы перетаскиваете половину пути, а затем оттягиваете палец), приложение застряло на этой карте. Вы можете прокручивать вверх и вниз, но вы не сможете перетащить. Когда вы пытаетесь, вы просто перемещаете backgroundScrollView в пределах супервизора (так что прокрутка вправо означает, что вы видите серые правые поля между scrollview и супервидом).Pangesture Fails, а затем застрял на вид
Это метод, который UIPanGestureRecognizer называет:
-(void)beingDragged:(UIPanGestureRecognizer *)gestureRecognizer {
NSLog(@"I am being dragged");
xFromCenter = [gestureRecognizer translationInView:self].x; //%%% positive for right swipe, negative for left
yFromCenter = [gestureRecognizer translationInView:self].y; //%%% positive for up, negative for down
switch (gestureRecognizer.state) {
//%%% just started swiping
case UIGestureRecognizerStateBegan:{
self.backgroundScrollView.scrollEnabled = NO;
self.originalPoint = self.center;
_backgroundScrollView.autoresizingMask = UIViewAutoresizingNone;
_backgroundScrollView.translatesAutoresizingMaskIntoConstraints = YES;
likeBadge.autoresizingMask = UIViewAutoresizingNone;
likeBadge.translatesAutoresizingMaskIntoConstraints = YES;
passBadge.autoresizingMask = UIViewAutoresizingNone;
passBadge.translatesAutoresizingMaskIntoConstraints = YES;
reviewButton.autoresizingMask = UIViewAutoresizingNone;
reviewButton.translatesAutoresizingMaskIntoConstraints = YES;
break;
};
//%%% in the middle of a swipe
case UIGestureRecognizerStateChanged:{
//%%% dictates rotation (see ROTATION_MAX and ROTATION_STRENGTH for details)
CGFloat rotationStrength = MIN(xFromCenter/ROTATION_STRENGTH, ROTATION_MAX);
//%%% degree change in radians
CGFloat rotationAngel = (CGFloat) (ROTATION_ANGLE * rotationStrength);
//%%% amount the height changes when you move the card up to a certain point
CGFloat scale = MAX(1 - fabsf(rotationStrength)/SCALE_STRENGTH, SCALE_MAX);
//%%% move the object's center by center + gesture coordinate
self.center = CGPointMake(self.originalPoint.x + xFromCenter, self.originalPoint.y + yFromCenter);
//%%% rotate by certain amount
CGAffineTransform transform = CGAffineTransformMakeRotation(rotationAngel);
//%%% scale by certain amount
CGAffineTransform scaleTransform = CGAffineTransformScale(transform, scale, scale);
//%%% apply transformations
self.transform = scaleTransform;
[self updateOverlay:xFromCenter:yFromCenter];
break;
};
//%%% let go of the card
case UIGestureRecognizerStateEnded: {
self.backgroundScrollView.scrollEnabled = YES;
[self afterSwipeAction];
break;
};
case UIGestureRecognizerStatePossible:{
self.backgroundScrollView.scrollEnabled = YES;
};
case UIGestureRecognizerStateCancelled:{
self.backgroundScrollView.scrollEnabled = YES;
};
case UIGestureRecognizerStateFailed:{
self.backgroundScrollView.scrollEnabled = YES;
};
}
}