iOS:使用具有惯性和开销的Pinch手势进行缩放

时间:2016-11-09 12:06:50

标签: ios objective-c

我对iOS很新,我正在试图弄清楚如何使用Pinch手势来缩放惯性和开销(我不知道在这种情况下单词开销是否正确,在德语中它将被称为“ Überschwingen“)。

基本上应该做什么:它应该有一个最大和最小刻度(在我的情况下为1.0到4.0),你可以在其中进行缩放。当手势完成时,它应该采用给定的速度并制作曲线动画,同时允许视图上下给定的刻度,然后像张力一样回到最小值或最大值。

我为此运行了Gesture Recognizer,并设法让它使用我的最小和最大比例(使用stackoverflow中的示例)。这是我到目前为止所得到的:

- (void)handle_pinch:(UIPinchGestureRecognizer *)recognizer
{

    if([recognizer state] == UIGestureRecognizerStateBegan) {
        previousScale = 1.0;
        lastPoint = [recognizer locationInView:[recognizer view]];
    }

    if ([recognizer state] == UIGestureRecognizerStateChanged) {

        CGFloat currentScale = [[[recognizer view].layer valueForKeyPath:@"transform.scale"] floatValue];

        // Constants to adjust the max/min values of zoom
        const CGFloat kMaxScale = 4.0;
        const CGFloat kMinScale = 1.0;

        CGFloat newScale = 1 -  (previousScale - [recognizer scale]); // new scale is in the range (0-1)
        newScale = MIN(newScale, kMaxScale / currentScale);
        newScale = MAX(newScale, kMinScale / currentScale);
        scale = newScale;

        CGAffineTransform transform = CGAffineTransformScale([[recognizer view] transform], newScale, newScale);

        [recognizer view].transform = transform;

        CGPoint point = [recognizer locationInView:[recognizer view]];
        CGAffineTransform transformTranslate = CGAffineTransformTranslate([[recognizer view] transform], point.x-lastPoint.x, point.y-lastPoint.y);

        [recognizer view].transform = transformTranslate;
        NSLog(@"Transformed");
    }       
}

但我现在知道如何在这里添加动画。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您应该使用UIScrollView来实现缩放缩放效果,因为UIScrollView已经与动画集成在一起。只需在UIScrollView中添加您的UIView。

这是关于UIScrollView的精彩教程。他正在使用UIImageView,但UIView将以类似的方式运行。

https://www.raywenderlich.com/122139/uiscrollview-tutorial