0

背景: 私は xcode 3.1.4 と iphone シミュレーター 3.1 を使用しています (時代遅れであることはわかっているので、コメントしないでください)。

目標:ビューがロードされて継続的に下に移動すると作成される UIImageView を取得しようとしています。UIImageView の作成は正常に機能しますが、移動機能は機能しません。何も起こりません。私はNSTimerを使用しています。ビューコントローラー.mファイルのコードは次のとおりです。

-(void)viewDidLoad{
    UIImageView *six = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Meteor.png"]];
    CGRect rectSix = CGRectMake(arc4random() % (250), arc4random() % (1), 35, 35);
    [six setFrame:rectSix];
    [self.view addSubview:six];
    [self moveMeteor:six];
    [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(moveMeteor:) userInfo:six repeats:YES];

}

-(void)moveMeteor:(UIImageView *)t{

    t.center=CGPointMake(t.center.x, t.center.y + 1); 


}

そしてもちろん、view controller.h ファイルで moveMeteor 関数を宣言しました。次のように入力します。

-(void)moveMeteor:(UIImageView *)t;

問題の内容とその解決策についてのアイデアはありますか?

4

2 に答える 2

0

または、UIView の animateWithDuration を利用するこのようなことを行うこともでき、見た目がはるかに良くなります。タイマーは必要ありません。

// in your interface declaration...
@property (nonatomic, assign) BOOL meteorShouldAnimate;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

// in your implementation...
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.meteorShouldAnimate = YES;
    [self moveMeteorWithAnimationOptions:UIViewAnimationOptionCurveEaseIn]; // ease in to the animation initially
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.meteorShouldAnimate = NO;
}


- (void)moveMeteorWithAnimationOptions: (UIViewAnimationOptions) options {
    __weak MyViewController * weakSelf = self;
    if (self.meteorShouldAnimate) {
        [UIView animateWithDuration:0.2 delay:0.0 options:options animations:^{
            self.imageView.transform = CGAffineTransformMakeTranslation(20.0, 20.0); // or whatever x and y values you choose
        } completion:^(BOOL finished) {
            MyViewController * strongSelf = weakSelf; // in case our view controller is destroyed before our completion handler is called
            if (strongSelf) {
                UIViewAnimationOptions nextOptions = strongSelf.meteorShouldAnimate ? UIViewAnimationOptionCurveLinear : UIViewAnimationOptionCurveEaseOut; // linear if we're continuing to animate, ease out if we're stopping
                [strongSelf moveMeteorWithAnimationOptions:nextOptions];
            }
        }];
    }
}
于 2013-07-22T22:31:13.467 に答える