Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在执行拖动手势时平滑地设置CGAffineTransform动画_Iphone_Ios_Cgaffinetransform_Uipangesturerecognizer - Fatal编程技术网

Iphone 如何在执行拖动手势时平滑地设置CGAffineTransform动画

Iphone 如何在执行拖动手势时平滑地设置CGAffineTransform动画,iphone,ios,cgaffinetransform,uipangesturerecognizer,Iphone,Ios,Cgaffinetransform,Uipangesturerecognizer,我对检测拖动手势的各种方法都非常了解(目前我使用的是UIPangestureRecognitor),但我对转换的理解有限,因此我不确定这是否/如何可能。本质上,我想要的是一个缩放变换,它应用于UIView,与用户在屏幕上其他地方执行拖动动作的速度相同(因为没有更好的词)。换句话说,当用户向上拖动时,我希望视图的大小与该手势的位置成比例地增加,如果用户开始向下拖动,视图应该开始成比例地缩小 希望这是有道理的。作为一个虚拟示例,只需想象一个滑块,您可以调整它来实时更改UIView的大小。有没有一种好

我对检测拖动手势的各种方法都非常了解(目前我使用的是
UIPangestureRecognitor
),但我对转换的理解有限,因此我不确定这是否/如何可能。本质上,我想要的是一个缩放变换,它应用于UIView,与用户在屏幕上其他地方执行拖动动作的速度相同(因为没有更好的词)。换句话说,当用户向上拖动时,我希望视图的大小与该手势的位置成比例地增加,如果用户开始向下拖动,视图应该开始成比例地缩小


希望这是有道理的。作为一个虚拟示例,只需想象一个滑块,您可以调整它来实时更改UIView的大小。有没有一种好方法可以使用
cGrafineTransform
进行增量和恒定大小更新?

在平移手势处理程序中,您只需抓取
TranslationView
locationInView
,计算一个比例,然后相应地更新变换。例如:

- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
    static CGAffineTransform originalTransform;

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        originalTransform = self.viewToScale.transform;
    }
    else if (gesture.state == UIGestureRecognizerStateChanged)
    {
        CGPoint translation = [gesture translationInView:gesture.view];
        CGFloat scale = 1.0 - translation.y / 160.0;
        self.viewToScale.transform = CGAffineTransformScale(originalTransform, scale, scale);
    }
}
你可以根据你想做的事情来玩弄
比例
计算,但希望你能得到这个想法

就我个人而言,我宁愿使用捏手势识别器来调整大小(这是一个用户接受过培训的用户界面,它提供了开箱即用的
比例
因子等),但任何适合你的都可以。如果你做了一个捏手势识别器,它可能看起来像:

- (void)handlePinch:(UIPinchGestureRecognizer *)gesture
{
    static CGAffineTransform originalTransform;

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        originalTransform = self.viewToScale.transform;
    }
    else if (gesture.state == UIGestureRecognizerStateChanged)
    {
        self.viewToScale.transform = CGAffineTransformScale(originalTransform, gesture.scale, gesture.scale);
    }
}

在平移手势处理程序中,只需抓取
translationview
locationInView
,从中计算比例,然后相应地更新变换。例如:

- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
    static CGAffineTransform originalTransform;

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        originalTransform = self.viewToScale.transform;
    }
    else if (gesture.state == UIGestureRecognizerStateChanged)
    {
        CGPoint translation = [gesture translationInView:gesture.view];
        CGFloat scale = 1.0 - translation.y / 160.0;
        self.viewToScale.transform = CGAffineTransformScale(originalTransform, scale, scale);
    }
}
你可以根据你想做的事情来玩弄
比例
计算,但希望你能得到这个想法

就我个人而言,我宁愿使用捏手势识别器来调整大小(这是一个用户接受过培训的用户界面,它提供了开箱即用的
比例
因子等),但任何适合你的都可以。如果你做了一个捏手势识别器,它可能看起来像:

- (void)handlePinch:(UIPinchGestureRecognizer *)gesture
{
    static CGAffineTransform originalTransform;

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        originalTransform = self.viewToScale.transform;
    }
    else if (gesture.state == UIGestureRecognizerStateChanged)
    {
        self.viewToScale.transform = CGAffineTransformScale(originalTransform, gesture.scale, gesture.scale);
    }
}

我发现最好的方法是使用locationInView,这样就可以将以像素为单位的位置偏移与比例相等。例如,如果圆位于视图的中心:

func dragDot(recognizer: UIPanGestureRecognizer) {

    let locationX = recognizer.location(in: self.view).x

    // Expand and contract the circle
    let locationXOffset = locationX - self.view.center.x

    // We need scale to be 1 when locationXOffset = circle radius
    let scale: CGFloat = locationXOffset / (self.widthOfCircle / 2)

    self.ring.transform = CGAffineTransform(scaleX: scale, y: scale)
}
如果圆不在视图的中心,则用圆的初始位置替换
self.view.center.x


此方法适用于所有设备和屏幕分辨率,并避免了校准常数的要求。我发现最好的方法是使用locationInView,以便您可以将以像素为单位的位置偏移与比例相等。例如,如果圆位于视图的中心:

func dragDot(recognizer: UIPanGestureRecognizer) {

    let locationX = recognizer.location(in: self.view).x

    // Expand and contract the circle
    let locationXOffset = locationX - self.view.center.x

    // We need scale to be 1 when locationXOffset = circle radius
    let scale: CGFloat = locationXOffset / (self.widthOfCircle / 2)

    self.ring.transform = CGAffineTransform(scaleX: scale, y: scale)
}
如果圆不在视图的中心,则用圆的初始位置替换
self.view.center.x


这种方法适用于所有设备和屏幕分辨率,并避免了校准常数的要求。对我来说,缺少的一个环节是始终将转换应用于您所称的
原始转换
,因此我现在就可以开始了。我同意,在大多数情况下,当然捏一下手势对缩放最有意义。然而,在本例中,我正在使用创造性的方式在视图之间进行转换,这种比例实际上只是拖动触发转换过程中的一种奇特的副作用。非常感谢你的详尽回答!完美-对我来说,缺少的一个环节是始终将转换应用于您所称的
原始转换
,因此我现在已经走上了正轨。我同意,在大多数情况下,当然捏一下手势对缩放最有意义。然而,在本例中,我正在使用创造性的方式在视图之间进行转换,这种比例实际上只是拖动触发转换过程中的一种奇特的副作用。非常感谢你的详尽回答!你们应该认真地提一下:什么是圆的宽度?否则不要期望选票上升。你们应该认真地提一下:圆圈的宽度是多少?否则,不要期望获得更多的选票。。