1

ビューに を追加すると、「奇妙な」アニメーションの不具合が発生UIToolbarします。UIToolbar をアニメーション化して、 aUIPickerViewまたは aと一緒に下から上にスライドするようにしますUIDatePicker。最初はスライドしているように見えますが、アニメーションが終了するとすぐに消えます。これは、下にスライドすると発生し (UIPickerView をアニメーション化して画面から下にスライドさせます)、その直後に別の UIPickerView を上にスライドさせます。

スライド アップ コールに遅延 ( - performSelector...) を 0.3 秒設定すると、UIToolbar が適切に表示されることに気付きました (0.3 秒未満の場合でも同じ問題が発生します)。何が原因でしょうか?

編集: おそらく、 と の両方を新しいコンテナーに配置する必要がUIToolbarありUIDatePickerますUIViewか?

これは私が使用しているコードです:

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;

    }];
}
4

1 に答える 1

0

と を含む に追加しUIPickerViewUIToolbarから、UIView含む UIView をアニメーション化することで解決しました。

于 2012-07-28T23:45:14.537 に答える