UIPickerView 动画屏幕上和屏幕外的行为

UIPickerView Animate on and off screen behavior

这是这个问题的延续

CGRectMake : How To Calculate X and Y For UIPickerView Animation?

回答者https://whosebug.com/users/2315974/danypata

我有一个选择器视图,我想在按下按钮并使用之前的代码时在屏幕上和屏幕外设置动画 question/answer 我已经让它在第一次按下按钮时在屏幕上设置动画.

第二次按下按钮它就消失了然后第三次按下它动画到错误的地方......请帮忙

代码

if (self.pickerSort.hidden == NO) {


    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        self.pickerSort.frame = CGRectMake(0,self.view.frame.size.height
                                           +  self.pickerSort.frame.size.height,-self.pickerSort.frame.size.width,-self.pickerSort.frame.size.height);
    }
                     completion:^(BOOL finished) {
                     }];
    self.pickerSort.hidden = YES;
   // [self performSelector:@selector(hidePicker) withObject:nil afterDelay:1];

} else if (self.pickerSort.hidden == YES) {

    self.pickerSort.hidden = NO;

    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        self.pickerSort.frame = CGRectMake(0 ,
                                       self.view.frame.size.height
                                       -  self.pickerSort.frame.size.height,
                                       self.pickerSort.frame.size.width,
                                       self.pickerSort.frame.size.height);
    }
                     completion:^(BOOL finished) {
                     }];
    [self.view bringSubviewToFront:self.pickerSort];

图像中的行为 - 按钮按下动画精美地呈现在屏幕上

第二次按下消失,没有动画

第三次按下动画到这里

任何帮助都会很棒...我正在寻找的功能是如何将选择器视图放回动画中,以便第三次按下与第一次相同

请尝试使用下面的代码。

    self.pickerSort.hidden = NO;
    NSTimeInterval duration = 0.5;
    [UIView animateWithDuration:duration
                          delay:0
                        options:UIViewAnimationOptionCurveLinear
                     animations:^{
                         CGRect pickerFrame = self.pickerSort.frame;

                         // currently picker is off the screen, show it.
                         if (pickerFrame.origin.y == self.view.frame.size.height) {
                             // set frame to show picker
                             pickerFrame.origin.y = self.view.frame.size.height - self.pickerSort.frame.size.height;
                         } else {
                             // set frame to hide picker
                             pickerFrame.origin.y = self.view.frame.size.height;
                         }
                         self.pickerSort.frame = pickerFrame;
                     }
                     completion:^(BOOL finished) {
                         self.pickerSort.hidden = YES;
                     }];

在尝试并学习了框架和 CGRect 的来龙去脉之后,我通过使用以下代码实现了这一点

  if (pickerSort.hidden == YES) {
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        pickerSort.hidden = NO;

        visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        [self.tableStations addSubview:visualEffectView];
        pickerSort.frame = CGRectMake(0,0,originalPickerFrame.size.width,originalPickerFrame.size.height);
        visualEffectView.frame = CGRectMake(0,0,originalPickerFrame.size.width,originalPickerFrame.size.height - 64);
    }
                     completion:^(BOOL finished) {

                         self.navigationController.navigationItem.leftBarButtonItem.enabled = NO;

                     }];
}
else
{
    visualEffectView.hidden = YES;
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{

        pickerSort.frame = CGRectMake(0,-originalPickerFrame.size.height,0,0);
    }
                     completion:^(BOOL finished) {

                         self.navigationController.navigationItem.leftBarButtonItem.enabled = YES;
                         pickerSort.hidden = YES;

                     }];
}

我在viewDidLoad中设置了原来的frame size是这样的

 pickerSort = [[UIPickerView alloc]initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height)];
originalPickerFrame = pickerSort.frame;

pickerSort.frame = CGRectMake(0,-originalPickerFrame.size.height,0, 0);

希望这对以后的人有所帮助