自定义UIView在识别平移手势时调整大小

时间:2014-04-21 18:40:32

标签: ios animation uiview uigesturerecognizer

我试图达到以下效果。我有一个可以处于两种不同状态的视图 - 折叠和展开。请参阅屏幕截图,了解我的想法:

Collapsed Expanded

这些状态之间的转换应该通过平移手势触发 - 用户平移视图会扩展,用户平移 - 视图会崩溃。

我可以通过在我的视图子类的init部分实现自定义手势识别器来实现这一点:

UIPanGestureRecognizer* recognizer = [[UIPanGestureRecognizer alloc] initWithTarget: self action: @selector(panned:)];
recognizer.delegate = self;
[self addGestureRecognizer: recognizer];

然后检测正确的垂直平移手势:

- (void)panned:(UIPanGestureRecognizer*)gestureRecognizer
{
    static CGPoint lastPoint;
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        lastPoint = [gestureRecognizer locationInView: self];
        return;
    }

    if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
        if (p.y > lastPoint.y && self.expanded == NO) {
            [self toggle];
        }
        else if (p.y < lastPoint.y && self.expanded == YES)
        {
            [self toggle];
        }
    }
}

然后基于self.expanded属性我布局子视图并相应地更改框架。一切都或多或少都可以。我唯一的问题是 - 我希望在用户平移手指时显示两个状态之间的转换 - 所以基本上视图应该开始来回逐渐扩展(如果用户来回平移)然后进入扩展状态手势完成时。

最简单的方法是什么?

1 个答案:

答案 0 :(得分:0)

我要做的是在折叠状态和展开状态之间设计动画。 (这可能涉及随着时间的推移改变一个视图,或者在两个不同的视图之间淡入/移动,一个处于折叠状态而另一个处于展开状态。)现在按照手势驱动动画,正如我在此解释:

https://stackoverflow.com/a/22677298/341994

基本上,您将动画附加到图层,其speed设置为0,以便实际上不会发生任何事情。然后你跟踪手势并不断更改图层的timeOffset以更改动画的“框架”以匹配。

(在这方面,人们无法观察到这是通过自定义过渡动画为您所做的事情 - 即两个视图控制器的视图之间的转换,您可以在其中添加自己的交互动画。 ,如果你只是iOS 7,实际上使用自定义过渡动画可能是最简单的。实际上如何实现Calendar应用程序中每周 - 每月的过渡,你在评论中如此恰当地提到它 - 它只是一个带有自定义交互动画的推/弹转换。)