如何在碰撞检测后使UIImageView的帧大小更大



我有两个名为image1和image2的UIImageView。我想做的是:当image1和image2碰撞时,image1应该变大(使用比例动画(。例如,如果image1与image2碰撞十倍,image1就应该变大十倍。

我尝试对碰撞使用缩放动画和CGRectIntersectsRect,然后对碰撞使用计时器,但图像只变大一次,并在所有后续碰撞后保持该大小。

这是我的代码:

-(void)collision {
    if(CGRectIntersectsRect(imageView.frame,centre.frame)){
        scale=scale+1;
        imageView.alpha=0.5;
        [imageView removeFromSuperview];
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:1.0f];
        centre.transform = CGAffineTransformScale(centre.transform, scale, scale);
        [UIView commitAnimations];
    }
}
- (void)viewDidLoad {
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(collision) userInfo:nil repeats:YES];
}

(TechZen说——作者最初指出,他以法语为母语,英语有点粗糙。(

变换不是累加的,例如,每个变换都对原始矩阵进行运算,而不是对上一次变换返回的矩阵进行运算。这就是为什么image1对象变换一次然后保持不变的原因。这是一次又一次从开头开始的完全相同的变换。

您需要对scale变量进行累加或求和,而不是尝试对变换进行累加或加和。使scale变量成为包含该方法的控制器对象的属性,然后逐渐递增该值以使image1变大。

类似于:

-(void)collision {
    if(CGRectIntersectsRect(imageView.frame,centre.frame)){
        self.scale=self.scale+1; // scale is no longer a local value and will increment
        imageView.alpha=0.5;
        [imageView removeFromSuperview];
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:1.0f];
        centre.transform = CGAffineTransformScale(centre.transform, scale, scale);
        [UIView commitAnimations];
    }
}

更新:

要转换本地变量,即在单个方法中定义的变量,您可以将定义移动到头(.h(文件中,如下所示:

@implementation MyViewController:NSViewController{
//... various definitions
}
@property NSInteger *scale;

然后在实现文件(.m(中添加synthesis指令:

@synthesize scale;

现在,您可以使用self.scale引用类中任何位置的scale属性,它将被保留。每次打电话:

self.scale=self.scale + 1;

该值将递增并保存,以便可用于下一次碰撞。

每次调用collision时,标度值都会更改一,例如

centre.transform = CGAffineTransformScale(centre.transform, 1, 1);
...
centre.transform = CGAffineTransformScale(centre.transform, 2, 2);
....
centre.transform = CGAffineTransformScale(centre.transform, 3, 3);
//... and so on

CCD_ 8将增加图像视图到大尺寸的变换。

最新更新