移动 UIImageView

Posted

技术标签:

【中文标题】移动 UIImageView【英文标题】:Move a UIImageView 【发布时间】:2009-05-14 07:56:59 【问题描述】:

沿点阵列移动图像的最佳方法是什么?

【问题讨论】:

【参考方案1】:

我推荐的方法是将 UIImage 包装在 UIImageView 中,并使用 CAKeyframeAnimation 沿通过您的三个点的路径为 UIImageView 的图层设置动画:

UIImage *image = [UIImage imageNamed:@"image.png"];
imageView = [[UIImageView alloc] initWithImage:image];
[mainView addSubview:imageView];
// Remember to remove the image view and release it when done with it

CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.duration = 1.0f;
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO;

CGMutablePathRef pointPath = CGPathCreateMutable();
CGPathMoveToPoint(pointPath, NULL, viewOrigin.x, viewOrigin.y);
CGPathAddLineToPoint(pointPath, NULL, point1.x, point1.y);
CGPathAddLineToPoint(pointPath, NULL, point2.x, point2.y);
CGPathAddLineToPoint(pointPath, NULL, point3.x, point3.y);
pathAnimation.path = pointPath;
CGPathRelease(pointPath);

[imageView.layer addAnimation:pathAnimation forKey:@"pathAnimation"];

请注意,默认情况下,图层的位置在图层的中心。如果您想相对于另一个参考点移动图层,您可以将图层的 anchorPoint 属性设置为类似于 (0.0, 0.0) 的左上角(在 iPhone 上)或 (0.0, 1.0) 的下角离开了。

此外,这不会在 UIImageView 完成后更改帧,因此如果您稍后引用该帧,您可能需要考虑到这一点,或者在动画结束时添加委托方法回调将其设置为适当的值。

您还可以通过将 CGPathAddLineToPoint() 调用替换为 CGPathAddCurveToPoint() 来使图像沿曲线而不是直线移动。

编辑(2009 年 5 月 14 日):我添加了缺少的 pathAnimation.path = pointPath 行,并将对弯曲路径的错误引用更改为 pointPath。

【讨论】:

我有很多处理正在进行(多线程),导致延迟,所以这个动画甚至没有被执行,它只是非常跳跃......有没有办法将 CAKeyFrameAnimation 放在线程并赋予其最高优先级执行?【参考方案2】:

最简单的方法是使用UIView animations

假设您能够使用 UIImageView 来保存图像并使用 NSArray 来保存您的观点的快速示例。

    UIImage *image = [UIImage imageNamed:@"image.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

    [someView addSubview:imageView]; // Assume someView exists

    NSValue *firstPoint = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
    NSValue *secondPoint = [NSValue valueWithCGPoint:CGPointMake(100, 0)];
    NSValue *thirdPoint = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
    // And so on....

    NSArray *points = [NSArray arrayWithObjects:firstPoint, secondPoint, thirdPoint, nil];

    for (NSValue *pointValue in points) 

        [UIView beginAnimations:@"UIImage Move" context:NULL];

        CGPoint point = [pointValue CGPointValue];
        CGSize size = imageView.frame.size;

        imageView.frame = CGRectMake(point.x, point.y, size.width, size.height);

        [UIView commitAnimations];
    

【讨论】:

实际上,这将无法正常工作,因为您将同时触发三个动作。动画发生在后台线程上,您需要等待它们完成。您的动画行为将是不可预测的,而不是沿着路径移动。

以上是关于移动 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

iOS事件处理之七种手势

寻找 UIImageView UIImageView.center 的中心出乎意料的结果

ios怎么实现uiview的自适应高度

简单移动平均线加权移动平均线指数平滑移动平均

移动web——移动开发选择和技术解决方案

移动端------移动事件对象