ios - 使用平移手势重置 UIView 的框架,无需硬编码起始值

标签 ios uiview uipangesturerecognizer

我有一个附加到 UIView 的 UIPanGestureRecognizer。我想做的基本上就是拖放到桶中。如果用户放开 UIView 并且它不在存储桶中,我希望它以动画方式返回到其原始开始位置。我的 UIPanGestureRecognizer 调用的选择器是:

- (void)handleDragDescriptionView:(UIPanGestureRecognizer *)gestureRecognizer {
    UIView *panViewPiece = [gestureRecognizer view];
    CGRect originalFrame = CGRectMake(946, 20, 58, 30);

    CGPoint translation = [gestureRecognizer translationInView:panViewPiece];
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan || gestureRecognizer.state == UIGestureRecognizerStateChanged) {
        panViewPiece.center = CGPointMake(panViewPiece.center.x + translation.x, panViewPiece.center.y + translation.y);

        [gestureRecognizer setTranslation:CGPointZero inView:panViewPiece.superview];
    }
    else if (gestureRecognizer.state == UIGestureRecognizerStateCancelled) {
        [UIView animateWithDuration:0.25 animations:^{
            self.dragDescriptionView.frame = originalFrame;
        }];
    }
    else {
        [UIView animateWithDuration:0.25 animations:^{
            self.dragDescriptionView.frame = originalFrame;
        }];
    }

}

我想知道是否可以在方法顶部没有 originalFrame 的情况下执行此操作。我本来就有

CGRect originalFrame = _dragDescriptionView.frame; 

而不是硬编码,但它不会恢复。可能是因为我在拖动时更新了该值。我不太喜欢硬编码值,但我不确定是否有办法解决这个问题。谢谢!

最佳答案

您实际上只需要跟踪 View 的原始中心。将 originalCenter 设为实例变量,并仅在手势开始时设置它:

@implementation MyViewController {
    CGPoint _originalCenter;
}

- (void)handleDragDescriptionView:(UIPanGestureRecognizer *)gestureRecognizer {
    UIView *panViewPiece = [gestureRecognizer view];

    switch (gestureRecognizer.state) {
        case UIGestureRecognizerStateBegan:
            _originalCenter = panViewPiece.center;
            break;

        case UIGestureRecognizerStateChanged: {
            CGPoint translation = [gestureRecognizer translationInView:panViewPiece.superview];
            panViewPiece.center = CGPointMake(panViewPiece.center.x + translation.x, panViewPiece.center.y + translation.y);
            [gestureRecognizer setTranslation:CGPointZero inView:panViewPiece.superview];
            break;
        }

        case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateCancelled: {
            [UIView animateWithDuration:0.25 animations:^{
                panViewPiece.center = _originalCenter;
            }];
            break;
        }

        default:
            break;
    }
}

关于ios - 使用平移手势重置 UIView 的框架,无需硬编码起始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13353288/

相关文章:

ios - 使用 Xcode 11 模拟位置

ios - 如何使用 SDWebImage - Swift 在 imageURL 为空时设置默认图像

ios - UIPanGestureRecognizer 获取开始和停止之间的长度

tvOS上的UIScrollView

objective-c - 在启用 ARC 的情况下更新属性

ios - 如何在 iOS 上强制停止 JavaScriptCore JSContext 评估?

iphone - 在 Objective-C 中将 'safe path' 绘制到 UIImageView 上

ios - 滑动 UIView 时的动画错误

ios - 在另一个 View Controller 展开 segue 后重新加载 UIView 数据上的自定义 TableView

ios - 为什么在 iOS 中实现评级星级后 TableView 变慢?