1

我想简单地有一个循环,以便一个对象在底部的屏幕上连续移动。这是我的代码,应该很容易理解。

@interface ViewController ()

@end

@implementation ViewController




    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self performSelector:@selector(spawnRocket) withObject:self afterDelay:2]; //delay before the object moves

    }

    -(void)spawnRocket{
        UIImageView *rocket=[[UIImageView alloc]initWithFrame:CGRectMake(-25, 528, 25, 40)]; //places imageview right off screen to the bottom left
        rocket.backgroundColor=[UIColor grayColor];

        [UIView animateWithDuration:5 animations:^(){rocket.frame=CGRectMake(345, 528, 25, 40);} completion:^(BOOL finished){if (finished)[self spawnRocket];}]; //this should hopefully make it so the object loops when it gets at the end of the screen


    }

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    @end

完成所有这些后,我单击运行,我看到的只是我的 iphone 6.0 模拟器上的白屏

附言。我正在运行 xcode 4.5.1

4

2 回答 2

1

一些东西:

  1. UIImageView *rocket=[[UIImageView alloc]initWithFrame:...

    您没有将图像分配给图像视图,最好的方法是使用:

    UIImage* image = [UIImage imageNamed:@"image.png"];
    UIImageView *rocket = [[UIImageView alloc] initWithImage:image];
    rocket.frame = CGRectMake(-25, 528, 25, 40);
    
  2. (您的问题的根本原因)您没有将您的添加UIImageView到您的主视图中,因此它没有被显示。在spawnRocket中,您应该这样做:

    [self.view addSubview:rocket];
    

    注意:因为你希望这在一个循环中完成,你必须确保你的内存管理是有序的。

    我不知道您是否还希望火箭在完成移动后仍显示在屏幕上,但如果不是,请记住在完成时保留对UIImageView和的引用removeFromSuperview(以防止内存泄漏)。

  3. 呼入可能不是最好的主意,当被调用spawnRocketviewDidLoad它可能还没有到达屏幕spawnRocket。尝试调用它viewWillAppearviewDidAppear(在你的情况下最好的)

  4. [self performSelector:@selector(spawnRocket) withObject:self afterDelay:2];

    您不需要提供selfwithin withObject:,您不接受 inside 的任何参数spawnRocket

于 2012-11-03T19:10:34.547 回答
0

您不添加UIImageView到任何父视图。它只会存在于内存中,但不会显示。创建后将其添加到视图控制器的视图中:

[self.view addSubview:rocket];
于 2012-11-03T19:07:09.157 回答