Как сделать UIImageView Framesize больше после обнаружения столкновений - PullRequest
2 голосов
/ 01 июля 2011

У меня есть два UIImageViews с именем image1 и image2.Я хочу сделать следующее: когда изображения1 и изображение2 сталкиваются, изображение1 должно увеличиваться (с масштабной анимацией). Например, если изображение1 сталкивается с изображением2 в десять раз, изображение1 должно становиться в 10 раз больше.

Я пытаюсь использовать масштабную анимацию и 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 говорит - Автор изначально указал на то, что он является носителем французского языка и что его английский немного грубоват. )

1 Ответ

0 голосов
/ 02 июля 2011

Преобразования не накапливаются, например каждое преобразование работает с исходной матрицей, а не с матрицей, возвращаемой последним преобразованием. Вот почему вы 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) добавьте директиву syntheize:

@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

... CGAffineTransformScale будет увеличивать преобразование изображения в большой размер.

...