Кадровая анимация uiimageView уменьшена - PullRequest
0 голосов
/ 13 августа 2011

Привет всем, вот мой код:

- (void)viewDidLoad {

    [[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0/60.0];
    [[UIAccelerometer sharedAccelerometer] setDelegate:self];
    [super viewDidLoad];
}

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    valueX = acceleration.x *20.0;
    valueY = acceleration.y *-20.0;

    int newX = (int)(imageView.center.x+valueX);
    int newY = (int)(imageView.center.y+valueY);

    CGPoint newCenter = CGPointMake(newX,newY);
    imageView.center=newCenter;

    UIImageView* imageView2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ball.png"]];
    imageView2.frame = CGRectMake(newX-12, newY-12, 24, 24);
    [self.view addSubview:imageView2];
    [UIView beginAnimations:nil context:imageView2];
    [UIView setAnimationDuration:10.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    imageView2.frame = CGRectMake(newX-2, newY-2, 4, 4);
    [imageView2 setAlpha:0.0];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(removeSmoke:finished:context:)];
    [UIView commitAnimations];  
    if(imageView2.alpha=0){
        [imageView2 removeFromSuperview];
    }


    [self.view bringSubviewToFront:imageView];

}

Сначала моя анимация очень плавная с 1.0 / 60.0, но через несколько секунд ошибка анимации и не плавная, я думаю, что она станет 1.0 / 5.0. Я не знаю почему. Как я могу решить это, пожалуйста? извините за мой английский я французский: /

1 Ответ

1 голос
/ 13 августа 2011

Мне не совсем понятно, чего вы пытаетесь достичь. Кажется, что каждый раз, когда запускается акселерометр, вы добавляете новую анимацию imageView и хотите переместить ее на основе некоторых правил, а также уменьшить изображение. Есть проблемы с вашим кодом, хотя. Вы никогда не звоните [imageView2 release];, и поэтому, возможно, через некоторое время у вас проблемы с памятью.

Возможно, вы также выполняете слишком много вычислений в методе @selector(removeSmoke:finished:context:), но мне нужно увидеть код, чтобы помочь с этим.

Если вы знаете, сколько UIImageViews вы планируете иметь за один раз, вероятно, лучше предварительно загрузить их и поместить в массив для более удобного доступа. Таким образом, вы можете переместить один UIImageView и перейти к следующему.

Если вы снимаете для iOS 4.0 или выше, я бы также рекомендовал использовать анимацию блоков. Они проще в использовании, и я нахожу намного проще и на процессоре. Что-то вроде:

[UIView animateWithDuration:10.5
                     animations:^{ 
                       CGRect newRect = imageView2.frame;
                       newRect.origin.x -= newX-2;
                       newRect.origin.y -= newY-2;
                       imageView2.frame = newRect;
                     } 
                     completion:^(BOOL finished){

                       [UIView animateWithDuration:0.1
                                        animations:^{ 
                                          // This is where you complete your animation, maybe remove from view or something?
                                        } 
                                        completion:^(BOOL finished){
                                          ;
                                        }];
                     }];

Наконец, вместо добавления и удаления из вида, я бы предложил вам просто установить imageView2.hidden = YES;, и таким образом он не будет прорисован и будет иметь тот же эффект. Надеюсь, это поможет!

...