столкновение двух изображений, проблема с объявлением - PullRequest
0 голосов
/ 28 июня 2011

У меня есть метод с изображением "imageView":

- (void)createNewImageView {
// Get the view's frame to make it easier later on


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


// Add it at a random point
[imageView setCenter:[self randomPointSquare]];
[[self view] addSubview:imageView];


// Animate it into place
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:8.0f];
[imageView setCenter:CGPointMake(240, 160)];
[UIView commitAnimations];
 [imageView release];

}

и другое изображение "viewToRotate" (IBOuutlet, определенный в .h и построитель интерфейса)

И я хочу проверитьстолкновение с этим методом:

- (void)myRunloop
{
 // check collision

 if( CGRectIntersectsRect(imageView.frame, viewToRotate.frame) )
 {
    viewToRotate.alpha=0.2;
 }
}

Но xcode всегда выдает мне ошибку: «imageView undeclared», и я не знаю, как это решить.Я не хочу определять это снова в этом методе.

Ответы [ 4 ]

0 голосов
/ 28 июня 2011

Я только что столкнулся с подобной проблемой, на самом деле, когда вы установили кадр imageView в строке

   [imageView setCenter:CGPointMake(240, 160)];   

imageView устанавливается в этой точке памяти, просто это происходит из-заБлок анимации показывает, что imageView перемещается к месту назначения, но на самом деле координаты вида назначены месту назначения, вы можете подтвердить это, записав координаты сразу после строки кода.Если вам действительно нужно сделать это аналогичным образом, вы можете использовать таймер вместо блока анимации и анимировать себя.Но я обхожу эту проблему с помощью animationDelegate.Просто установите делегат анимации на себя и определите animationDidStopSelector, и все готово.Ваш animationDidstopSelector будет запущен, когда анимация закончится, и, следовательно, объект достиг своего конечного пункта назначения, или вы можете сказать, что есть столкновение (в пользовательском интерфейсе).Надеюсь, что это поможет
Вот пример кода:

- (void)createNewImageView {
// Get the view's frame to make it easier later on


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


// Add it at a random point
[imageView setCenter:[self randomPointSquare]];
[[self view] addSubview:imageView];


// Animate it into place
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:)];
[UIView setAnimationDuration:8.0f];
[imageView setCenter:CGPointMake(240, 160)];
[UIView commitAnimations];
[imageView release];

} 

ваш animationDidStopSelector будет выглядеть так:

-(void)animationDidStop:(id)sender {  
      //This is almost similar to collision detection, you can do something here 
}
0 голосов
/ 28 июня 2011

imageView является локальной переменной для функции createNewImageView и, следовательно, myRunloop

не может получить к ней доступ. Если вы объявили imageView как IBOutlet, вы можете установить изображение следующим образом

UIImage *image = [UIImage imageNamed:@"abouffer_03.png"];
imageView.image = image
0 голосов
/ 28 июня 2011

Вы можете назначить тег для изображения, чтобы найти его позже другим способом:

[imageView setTag:1];

// in myRunloop
UIImageView* imageView = [[self view] viewWithTag:1];
0 голосов
/ 28 июня 2011

В интерфейсе (.h файл) объявляйте так

UIImageView *imageView;

И в вашем createNewImageView() методе. Используйте

imageView = [[UIImageView alloc] initWithImage:image];
...