1

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

希望这是有道理的。作为一个虚拟的例子,想象一个滑块,你可以调整它来实时改变 UIView 的大小。有没有一种很好的方法来进行这些类型的增量和恒定大小更新CGAffineTransform

4

2 回答 2

3

在您的平移手势处理程序中,您只需抓住translationInViewor 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);
    }
}

您可以scale根据您想要做什么来进行计算,但希望您能明白这一点。

就个人而言,我宁愿使用捏合手势识别器来调整大小(它是用户接受过培训的 UI,它为您提供了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);
    }
}
于 2013-04-17T19:42:22.353 回答
1

我发现最好的方法是使用 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为圆圈的初始位置。

此方法适用于所有设备和屏幕分辨率,并且无需校准常数

于 2017-06-28T21:53:04.707 回答