Ios 使用物镜c绘制带有平移的箭头

Ios 使用物镜c绘制带有平移的箭头,ios,objective-c,transform,skitch,Ios,Objective C,Transform,Skitch,我的工作是: 我一直在尝试在应用程序中添加箭头,但要让它完成它需要做的事情却非常困难。当用户在屏幕上拖动手指时,箭头需要从手指触摸的起点开始绘制,并增大尺寸。然后,当手指抬起时,箭头必须停止绘制 我遇到的问题是: 当用户触摸箭头两端的某个点并向某个方向拖动手指时,箭头必须能够围绕起点和终点旋转。旋转时,箭头必须能够增减其大小 我能够让箭头围绕起点旋转,但有问题。围绕端点旋转会产生鱼尾效应。我很确定我这样做是完全错误的,但我不知道还有其他方法。这就是为什么要求社区引导我走向正确的方向 @imple

我的工作是:

我一直在尝试在应用程序中添加箭头,但要让它完成它需要做的事情却非常困难。当用户在屏幕上拖动手指时,箭头需要从手指触摸的起点开始绘制,并增大尺寸。然后,当手指抬起时,箭头必须停止绘制

我遇到的问题是:

当用户触摸箭头两端的某个点并向某个方向拖动手指时,箭头必须能够围绕起点和终点旋转。旋转时,箭头必须能够增减其大小

我能够让箭头围绕起点旋转,但有问题。围绕端点旋转会产生鱼尾效应。我很确定我这样做是完全错误的,但我不知道还有其他方法。这就是为什么要求社区引导我走向正确的方向

@implementation ViewController {
ArrowView *_selectedArrowView;
UIColor *_selectedColor;
CGFloat _selectedWeight;
CGFloat _initalAngle;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    _selectedColor = [UIColor yellowColor];
    _selectedWeight = 3;

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panHandler:)];
    [self.view addGestureRecognizer:pan];

    _selectedArrowView = [[ArrowView alloc] initWithFrame:CGRectMake(300, 300, 150, 25) withColor:_selectedColor withWeight:_selectedWeight withStartPoint:CGPointMake(300, 300) withEndPoint:CGPointMake(450, 300)];
    _selectedArrowView.delegate = self;
    _selectedArrowView.layer.anchorPoint = CGPointMake(0, 0);
    _selectedArrowView.layer.position = CGPointMake(150,300);
    [self.view addSubview:_selectedArrowView];
    [self.view bringSubviewToFront:_selectedArrowView];
}

- (void) panHandler: (UIPanGestureRecognizer *) sender {
    CGPoint touchPoint = [sender locationInView:sender.view];

    if (sender.state == UIGestureRecognizerStateBegan) {
        _initalAngle = atan2(touchPoint.y, touchPoint.x);
    } else if (sender.state == UIGestureRecognizerStateChanged) {
        CGFloat currentAngle = atan2(touchPoint.y, touchPoint.x);
        CGFloat angle = _initalAngle - currentAngle;
        CGAffineTransform transform = CGAffineTransformMakeRotation(angle * -1);
        _selectedArrowView.transform = transform;
    }
}

@end

我认为你实际遇到的问题的核心是你的评论:

如果用户选择一端并在屏幕上移动手指,则箭头应围绕用户触摸的另一端旋转,并调整箭头长度

让我们假设箭头实际上是一个在其自身内绘制箭头的视图。这实际上是关于拉伸和旋转视图。现在让我们来讨论旋转部分。显然,这将通过应用跟随用户触摸的旋转变换来实现。这里要理解的是,视图实际上是一个层,层围绕其锚点旋转

因此,当用户第一次触摸视图时,您必须查看触摸在视图中的位置,并确定这是哪一端。然后必须将锚点移动到另一端,这样当我们随后旋转时,您将围绕另一端旋转。但是,更改锚点将导致视图跳跃,除非同时更改层的位置以进行补偿,因此您也可以这样做

我们现在已经安全地将锚点移到用户手指对面的一端。现在,我们只需要围绕它旋转,随着手势的继续,跟随用户的手指。通过将接触坐标从笛卡尔坐标转换为极坐标,从而给出要应用的角度,可以做到这一点。在手势开始时,保存初始角度;当手势继续时,从当前角度减去该角度,并使用产生的差分角度将变换设置为旋转变换

这通常有助于简化问题。在本例中,我没有跟随手指-只是设置动画。如你所见,我可以很容易地围绕箭头的一端旋转,然后旋转另一端,然后再旋转第一端,依此类推。这显示了在应用旋转变换之前移动锚点和位置的效果。我建议您先解决问题的这一简单方面,然后再担心是否会听从用户的指示


与Skitch应用程序中的箭头具有相同功能的箭头您能描述一下这意味着什么吗?箭头需要执行以下操作:1。用手指在屏幕上画画。我让它工作了。2.以箭头的起点或终点为轴心点,在360度圆中平移。就是那个我很难纠正的。我举了一个Skitch的例子,因为它比描述容易得多。所以你误用了pan这个词?你真的是指旋转?是的,围绕箭头的原点旋转一个360度的箭头,同时可以从原点增加大小。很抱歉,你一直在更改规格。这是你第一次提到可以增加大小。这使问题变得非常不清楚,并且无法提供帮助。请停下来想想你到底想要什么。然后编辑你的问题,清楚地描述你所遇到的问题,展示你到目前为止得到的代码。我已经实现了上面的步骤,但它最多只能旋转30度。我肯定我只是个小人物。我已经编辑了这个问题,以包含实现的代码。我保持它的简单性,只处理试图得到一个旋转的点。你必须计算相对于你想要旋转的锚定点的角度极坐标。-这可能有助于您了解一些实际工作的代码:好的,我围绕视图的中心旋转,而不是视图的远端,但原理完全相同。谢谢,先生。我非常感谢你的帮助。我现在可以绕着两端旋转箭头了。现在,当我将箭头从45度角重新定位到135度角时,另一端跳到Y位置。这是有意义的,因为锚点发生了变化。现在我要去寻找解决办法
问题我还向你订购了编程iOS 8,因为我显然需要它。再次感谢。当我将箭头从45度角重新定位到135度角时,另一端跳到Y位置。这是有道理的,因为锚点的改变,我想这会得到解决,当我说你需要改变位置时,你改变了锚点,但显然不是-这听起来像旋转变换也必须改变,以补偿,这是我没有想到的。对不起!你知道一个很好的例子如何改变它吗?我尝试过使用CGAffineTransformTranslate,但我不确定是否应该使用该事件。我还尝试了变换箭头层本身,但也没有成功。