2012-07-28 3 views
1

Je rencontre un petit problème d'animation lorsque j'ajoute un UIToolbar à la vue. J'anime l'UIToolbar de sorte qu'il glisse du bas avec un UIPickerView ou un UIDatePicker. Au début, je vois que ça glisse mais une fois l'animation terminée, elle disparaît rapidement. Cela se produit lorsque je glisse vers le bas (en animant le UIPickerView pour glisser vers le bas de l'écran) et juste après cela, j'ai une autre diapositive UIPickerView vers le haut.iOS - Pépin d'animation avec UIToolbar

J'ai remarqué que si je règle un délai (- performSelector...) sur l'appel de la diapositive pendant 0,3 secondes, il affichera le UIToolbar correctement (tout moins de 0,3 secondes aura toujours le même problème). Qu'est-ce qui pourrait en être la cause?

EDIT: Peut-être que je devrais placer à la fois la UIToolbar et UIDatePicker dans un nouveau conteneur UIView?

Ce code J'utilise:

if ([self.view.subviews containsObject:self.dateRepeatPicker]) { 

     [self dismissDateRepeatPickerSegmentChanged:NO]; 

     // "Hack", if I don't delay this call the UIToolbar will not display 
     [self performSelector:@selector(showDatePicker) withObject:nil afterDelay:0.3]; 

} else if (![self.view.subviews containsObject:self.datePicker]) { 

     [self showDatePicker]; 
} 


- (void)dismissDateRepeatPickerSegmentChanged:(BOOL)segmentChanged { 

    CGRect toolbarTargetFrame = CGRectMake(0, self.view.bounds.size.height, 320, 44); 
    CGRect dateRepeatPickerTargetFrame = CGRectMake(0, self.view.bounds.size.height+44, 320, 216); 

    [UIView animateWithDuration:0.2 

        animations:^{ 
         self.pickerToolbar.frame = toolbarTargetFrame; 
         self.dateRepeatPicker.frame = dateRepeatPickerTargetFrame; 
        } 

        completion:^(BOOL finished) { 

         if (segmentChanged) { 

          [self.pickerToolbar removeFromSuperview]; 
          [self.dateRepeatPicker removeFromSuperview]; 
          [self.remindMeTableView reloadData]; 

         } else { 

          [self.pickerToolbar removeFromSuperview]; 
          [self.dateRepeatPicker removeFromSuperview]; 
         } 

        }]; 
} 

- (void)showDatePicker { 


    // Create the Toolbar over the Picker 
    CGRect toolbarTargetFrame = CGRectMake(0, self.view.bounds.size.height-216-44, 320, 44); 

    if (self.pickerToolbar == nil) { 

     self.pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height, 320, 44)]; 
     self.pickerToolbar.barStyle = UIBarStyleBlack; 
     self.pickerToolbar.translucent = YES; 
    } 

    UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"picker-dismiss.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(dismissDatePickerToolbar)]; 
    [self.pickerToolbar setItems:[NSArray arrayWithObjects:spacer, doneButton, nil]]; 
    [self.view addSubview:self.pickerToolbar]; 


    // Create the Picker under the Toolbar 
    CGRect datePickerTargetFrame = CGRectMake(0, self.view.bounds.size.height-216, 320, 216); 

    if (self.datePicker == nil) { 

     self.datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height+44, 320, 216)]; 
     [self.datePicker setMinuteInterval:5]; 

     [self.datePicker addTarget:self action:@selector(changeDate:) forControlEvents:UIControlEventValueChanged]; 

    } 

    [self.view addSubview:self.datePicker]; 

    [UIView animateWithDuration:0.2 animations:^{ 

     self.pickerToolbar.frame = toolbarTargetFrame; 
     self.datePicker.frame = datePickerTargetFrame; 

    }]; 
} 

Répondre

0

Résolu en ajoutant le UIPickerView et le UIToolbar à un contenant UIView puis animant les contenant UIView.