objective-c - 使用 UIPanGestureRecognizer 围绕某个点旋转 UIView

标签 objective-c ios core-animation uigesturerecognizer uipangesturerecognizer

我正在尝试创建一个动画,允许用户从窗口的一侧拉出一个面板。右上角会显示少量 View ,通过拉动它, View 会向外旋转,固定在屏幕的右下角。希望这些图像显示了我想要实现的目标(右侧的纸张表明 View 的一部分将被隐藏。我希望用户能够拖动它,而不是滑动或点击。

任何人都可以指出我如何实现这一目标的正确方向吗?我对 iOS 中的动画还很陌生。我已经让平移手势起作用了,但我需要这个点来旋转。我可以设置 View 的 .center 属性,但这样做只会将整个 View 移动到那个点,所以我需要一个 center 来旋转,这实际上不是我认为在 View 中间?

enter image description here enter image description here

编辑:我编写了一个有效的方法,但 View 并未“卡在”用户的手指上。我可以拖动我的手指,比如 45 度,但 View 移动的范围不止于此。不确定如何同步它们,有什么想法吗?

- (void) swipeSidebarOpen: (UIPanGestureRecognizer *) recognizer {
    //[self openOrCloseSideBar: YES];
    _sidebarView.layer.anchorPoint = CGPointMake(1.0, 1.0);
    _sidebarView.layer.position = CGPointMake(510, 330);

    UIView *shuttle = [recognizer view];

    if ([recognizer state] == UIGestureRecognizerStateBegan || [recognizer state] == UIGestureRecognizerStateChanged) {
        CGPoint vel = [recognizer velocityInView:[recognizer view]];

        if (vel.x > 0) {
            [recognizer view].transform = CGAffineTransformRotate([[recognizer view] transform], M_PI / 80.0f);
            [recognizer setTranslation: CGPointZero inView:[shuttle superview]];
        } else {
            [recognizer view].transform = CGAffineTransformRotate([[recognizer view] transform], -M_PI / 80.0f);
            [recognizer setTranslation: CGPointZero inView:[shuttle superview]];
        }
    }
}

最佳答案

有点晚了,但我写了一些代码来处理单指使用的平移、缩放和缩放。标准手势在微调工作或在出租车后部蹦来跳去时缺乏一定的准确性。

这两件事可能会对你有所帮助。旋转手势目标方法能够从捏合识别器或平移中接受。不过,您需要跟踪平移识别器的第一个触摸点落在何处,因为您将计算其当前点与手势起点之间的角度。您还需要保存屏幕中心。对我而言,我将所有这些点都放入了窗口的坐标系中,因此您必须选择要使用的点并坚持使用。

CGFloat /* midpoint, startpoint, point */
CGPointAngleATan2(CGPoint mp, CGPoint sp, CGPoint p)
{
    CGFloat angle = 0;
    CGFloat sAngle = atan2(sp.y-mp.y,sp.x-mp.x);
    CGFloat pAngle = atan2(p.y-mp.y,p.x-mp.x);
    angle = pAngle-sAngle;
    return angle;
}


- (CGFloat)calculateRotation:(UIGestureRecognizer *)sender;
{
    CGFloat rotation;

    if ([sender respondsToSelector:@selector(rotation)]){
        rotation = [(UIRotationGestureRecognizer *)sender rotation];
    } else {
        // convert to window co-ordinates, app specific so change if needed
        CGPoint point = [sender locationInView:self.view.window];
        rotation = CGPointAngleATan2(screenCenter,firstTouch,point);
    }
    return rotation;
}

关于objective-c - 使用 UIPanGestureRecognizer 围绕某个点旋转 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13644821/

相关文章:

ios - 动态添加到 Localizable.strings

ios - 动画 UIImageView 从圆角右上角开始并以矩形结束

cocoa - 是否可以在 NSPanel 上使用核心动画(效果)背后的模糊?

ios - 为 UITableView 的索引设置动画的最佳方式?

ios - Core Graphics 的内存问题

objective-c - 连接 UITextField 以更新标签

ios - UIViewController 的模态呈现和旋转

ios - 为什么 beginBackgroundTaskWithExpirationHandler 允许 NSTimer 在后台运行?

ios - 从检索到的 Assets 中删除 CIFilter

objective-c - ipad splitview 导航应用程序中 didSelectRowAtIndexPath 中的 indexPath null