在动画之后执行Segue,但是动画项目会回到它们之前的位置



我有这个问题,我在Storyboard中设置了UIButton,在触摸其中一个之后,它们必须移动,所以我使用动画实现了这个,并且工作得很好。但是在动画完成后,我正在执行一个模态segue,问题是,当模态segue开始时,从底部提高新的UIView, 2 UIButton返回到它们以前的位置,我在Storyboard中设置它们,这是难以看到的。我怎么解决这个问题?下面是我使用的代码

@property (strong, nonatomic) IBOutlet UIButton *maleBtn;
@property (strong, nonatomic) IBOutlet UIButton *femaleBtn;
- (void)viewDidLoad
{
    [super viewDidLoad];
    [_maleBtn addTarget:self
                 action:@selector(chooseGender:)
       forControlEvents:UIControlEventTouchUpInside];
    [_femaleBtn addTarget:self
                   action:@selector(chooseGender:)
         forControlEvents:UIControlEventTouchUpInside];
}
- (IBAction)chooseGender:(id)sender
{
    CGRect maleFrame;
    CGRect femaleFrame;
    if (sender == _maleBtn) {
        maleFrame = self.maleBtn.frame;
        maleFrame.origin.x = (self.view.bounds.size.width/2) - 15;
        femaleFrame = self.femaleBtn.frame;
        femaleFrame.origin.x = self.view.bounds.size.height;
    }
    else {
        maleFrame = self.maleBtn.frame;
        maleFrame.origin.x = -self.view.bounds.size.height;
        femaleFrame = self.femaleBtn.frame;
        femaleFrame.origin.x = (self.view.bounds.size.width/2) - 15;
    }
    [UIView animateWithDuration:0.5
                          delay:0.5
                        options:UIViewAnimationCurveEaseOut
                     animations:^{
                         _maleBtn.frame = maleFrame;
                         _femaleBtn.frame = femaleFrame;
                     }
                     completion:^(BOOL finished){
                         if(sender == _maleBtn)
                             [self performSegueWithIdentifier:@"toMale" sender:self];
                         else
                             [self performSegueWithIdentifier:@"toFemale" sender:self];
                     }];
}

如果你喜欢,你可以在你的。h中添加一个bool值或属性。但是我要用一个局部变量

BOOL didAnimate;

在viewDidLoad中你设置它

- (void)viewDidLoad
{
    [super viewDidLoad];
    //Set the bool value here to no;
    didAnimate = NO;
    [_maleBtn addTarget:self
                 action:@selector(chooseGender:)
       forControlEvents:UIControlEventTouchUpInside];
    [_femaleBtn addTarget:self
                   action:@selector(chooseGender:)
         forControlEvents:UIControlEventTouchUpInside];
}

在这里使用它,我也冒昧地重写了一下你的代码。

- (IBAction)chooseGender:(id)sender
{
    CGRect maleFrame;
    CGRect femaleFrame;
    if (sender == _maleBtn) {
        maleFrame = self.maleBtn.frame;
        maleFrame.origin.x = (self.view.bounds.size.width/2) - 15;
        femaleFrame = self.femaleBtn.frame;
        femaleFrame.origin.x = self.view.bounds.size.height;
    }
    else {
        maleFrame = self.maleBtn.frame;
        maleFrame.origin.x = -self.view.bounds.size.height;
        femaleFrame = self.femaleBtn.frame;
        femaleFrame.origin.x = (self.view.bounds.size.width/2) - 15;
    }
    [UIView animateWithDuration:0.5
                          delay:0.5
                        options:UIViewAnimationCurveEaseOut
                     animations:^{
                         _maleBtn.frame = maleFrame;
                         _femaleBtn.frame = femaleFrame;
                     }
                     completion:^(BOOL finished){
                     didAnimate = YES;
                     }];
     if(sender == _maleBtn && didAnimate){
           [self performSegueWithIdentifier:@"toMale" sender:self];
     }
     else if((sender == _femaleBtn && didAnimate)){
           [self performSegueWithIdentifier:@"toFemale" sender:self];
     }
     else{
     NSLog(@"failure to transition");
     }
}

我没有测试过这个,可能有拼写错误之类的。所以复制/粘贴可能不工作

最新更新