单击时为什么动画UIButton的位置会重置?

时间:2014-02-07 17:35:34

标签: ios objective-c uibutton

简短描述:当键盘显示时,我翻译了一个按钮,但点击该按钮后,它会弹回原来的位置。

详细描述:我有两个按钮,一个在另一个上面。一个被隐藏,直到满足某些标准,然后它变得可见,另一个被隐藏。

@property (weak, nonatomic) IBOutlet UIButton *skipButton;
@property (weak, nonatomic) IBOutlet UIButton *saveButton;
@property (assign, nonatomic) BOOL saveButtonEnabled;

@property (assign, readonly, nonatomic) CGRect fieldContainerDefaultFrame;
@property (assign, readonly, nonatomic) CGRect skipButtonDefaultFrame;

当视图加载时,我缓存默认位置

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    _fieldContainerDefaultFrame = self.fieldContainerView.frame;
    _skipButtonDefaultFrame = self.skipButton.frame;

    [self.saveButton setHidden:YES];
    self.saveButtonEnabled = NO;
}

按钮正确连接到插座,这些是他们的“内部触摸”动作

#pragma mark - Actions

- (IBAction)didPressSaveButton:(id)sender
{
    // Code here to persist data

    // Code here to push segue to next scene
}

- (IBAction)didPressSkipButton:(id)sender
{
    // Code here to push segue to next scene
}

以下是响应键盘通知的方法。我注册通知我不包括该代码。 (那里没有问题,所有这些东西都能正确运行。)

注意:两个按钮都包含在同一个“容器”框架中(以及其他字段),这些框架会向上翻译。按钮可以转换额外的金额。翻译工作一般,唯一的问题是点击时按钮的重置行为。

#pragma mark - Notification handlers

- (void)handleKeyboardWillShowNotification:(NSNotification *)note
{
    if([self.bioTextView isFirstResponder])
    {
        CGRect newFieldContainerFrame = self.fieldContainerDefaultFrame;
        CGRect newSkipButtonFrame = self.skipButtonDefaultFrame;
        newFieldContainerFrame.origin.y += AGSTSignupDetailsFieldContainerEditingOffset;
        newSkipButtonFrame.origin.y += AGSTSignupDetailsSkipButtonEditingOffset;

        NSTimeInterval duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
        UIViewAnimationCurve animationCurve = [note.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];

        [UIView animateWithDuration:duration animations:^{

            [UIView setAnimationCurve:animationCurve];
            self.fieldContainerView.frame = newFieldContainerFrame;
            self.skipButton.frame = newSkipButtonFrame;
            self.saveButton.frame = newSkipButtonFrame;
        }];
    }
}

- (void)handleKeyboardWillHideNotification:(NSNotification *)note
{
    NSTimeInterval duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve animationCurve = [note.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];

    [UIView animateWithDuration:duration animations:^{

        [UIView setAnimationCurve:animationCurve];
        self.fieldContainerView.frame = self.fieldContainerDefaultFrame;
        self.skipButton.frame = self.skipButtonDefaultFrame;
        self.saveButton.frame = self.skipButtonDefaultFrame;
    }];
}

我很感激有关如何修复错误或如何制定更好的解决方案的任何见解或建议。感谢。

1 个答案:

答案 0 :(得分:0)

好的,我解决了这个问题。虽然我很欣赏rob mayoff的反应作为更好实践的指示(即,在使用自动布局时不设置框架),这不是我案例中问题的实际原因,因此我不认为我的Q& A是我能找到的任何东西的副本。我将发布这个答案,以防其他人遇到类似的问题。

事实证明,正如我今天早些时候所怀疑的那样,按钮的按钮会发生两个相互不兼容的事情:(1)它导致键盘消失,导致字段向下平移; (2)当新的VC到位时,它会使整个场景动画起来,这显然取消了所有待处理的动画(即翻译)并导致这些翻译突然跳转到目的地状态。

最快的解决方案是在viewDidLoad上将BOOL didPressSaveButton设置为NO,并且只在按下按钮时将其设置为YES,然后在每个相关的翻译动画之前检查BOOL:如果BOOL为NO,请继续执行动画,否则什么都不做。这将阻止推送segue之前的突然最终动画。<​​/ p>

更好的解决方案,我将很快实施的解决方案是用自动布局约束替换我对帧的使用。