6

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

谁能指出我如何实现这一目标的正确方向?我对 iOS 中的动画很陌生。我已经让平移手势工作了,但我需要这个点来旋转。我可以设置视图的.center属性,但这样做只是将整个视图移动到那个点,所以我需要一个center旋转,这实际上不是视图的中间,我想?

在此处输入图像描述 在此处输入图像描述

编辑:我编写了一个有效的方法,但视图并没有“卡”在用户的手指上。我可以拖动手指,比如 45 度,但视图会移动得更多。不知道如何同步它们,有什么想法吗?

- (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]];
        }
    }
}
4

3 回答 3

3

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

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

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;
}
于 2013-09-11T21:26:08.557 回答
1

默认情况下,视图将围绕其中心旋转,但您可以通过anchorPoint为视图设置另一个来更改它layer。(您需要导入核心动画来做到这一点(QuartzCore.framework))。

锚点被归一化(X 和 Y 都从 0 变为 1)。默认情况下它位于中心 (0.5, 0.5),但您想将其更改为右下角 (1.0, 1.0)。

myView.layer.anchorPoint = CGPointMake(1.0, 1.0);

更改anchorPoint 将在屏幕上直观地移动您的视图,以便position超级视图中的视图层与视图旋转的点相同。

myView.layer.position = theFixedHerePoint; // The point you are showing in your drawing...

例如:如果超级视图从 (0,0) 变为 (100, 100),则positionmyView 的点应该是右下角的点,而不是 myView 的中心所在的点。如下图所示(X 是锚点 (1, 1) 和位置 (95, 95))。请注意,95 只是一个任意值。

┌───────────────────┐
│ superview         │
│                   │
│      ┌──────────┐ │
│      │ myView   │ │
│      │          │ │
│      │          │ │
│      └──────────X │
└───────────────────┘

现在,当您平移时,您可以简单地设置适当的旋转变换,视图将围绕其右下角旋转。

于 2012-11-30T12:34:30.323 回答
0

您需要做的是在平移时,在 pangesturerecognizer 的处理程序中,您需要对正在平移的视图应用旋转变换。喜欢self.SomeView.transform = CGAffineTransformMakeRotation(some rotation)。您需要对要应用的旋转量进行一些计算。同样用于设置中心。

于 2012-11-30T12:08:31.510 回答