在iOS 7中,焦点栏的动画效果比键盘快

时间:2014-04-11 04:15:20

标签: ios objective-c cocoa-touch ios7 uikeyboard

我正在键盘上实现自定义对焦栏。焦点栏有小工具可以向后和向前移动光标以及完成按钮。

现在,在iOS 7中,我看到焦点栏的移动速度比键盘快。由于这一点,我看到焦点栏后面的屏幕位于键盘顶部之前。这在iOS 6中运行良好。

以下是我正在做的事情:

- (void)keyboardWillShow:(NSNotification *)iNotification {
    self.dismissForm = NO;
    self.shouldScrollCell = YES;
    CGFloat aKeyboardAnimationDuration = [[iNotification userInfo][UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGRect aKeyboardFrame = [[iNotification userInfo][UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect adjustedKeyboardFrame = [self.view convertRect:aKeyboardFrame fromView:nil];
    CGFloat adjustedHeight;
    adjustedHeight = aKeyboardFrame.size.height + self.focusControlBar.frame.size.height;
    [self.focusControlBar viewForFocusControlWillShowWithEndFrame:adjustedKeyboardFrame andAnimationDuration:aKeyboardAnimationDuration];

    [UIView animateWithDuration:0.3 animations:^() {
        [self.tableView setContentInset:UIEdgeInsetsMake(kScreenOrigin, kScreenOrigin, adjustedHeight, 0.0f)];
        [self.tableView setScrollIndicatorInsets:UIEdgeInsetsMake(kScreenOrigin, kScreenOrigin, adjustedHeight, 0.0f)];
    }];
}

这是我的焦点栏动画代码:

- (void)viewForFocusControlWillShowWithEndFrame:(CGRect)iFrame andAnimationDuration:(CGFloat)iDuration {
    BOOL aShouldAppear = YES;   

    if (self.delegate && [self.delegate respondsToSelector:@selector(focusControlBarShouldAppear:)]) {
        aShouldAppear = [self.delegate focusControlBarShouldAppear:self];
    }

    if (aShouldAppear) {
        if (self.delegate && [self.delegate respondsToSelector:@selector(focusControlBarWillAppear:)]) {
            [self.delegate focusControlBarWillAppear:self];
        }
        CGRect aBarFrame = self.frame;
        UIInterfaceOrientation anInterfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
        aBarFrame.size.height = [self heightForOrientation:anInterfaceOrientation];
        self.frame = aBarFrame;
        aBarFrame.origin.y = self.superview.bounds.size.height - iFrame.size.height - aBarFrame.size.height;


        [UIView animateWithDuration:iDuration animations:^(void) {
            self.frame = aBarFrame;
        } completion:^(BOOL iFinished) {
            if (self.delegate && [self.delegate respondsToSelector:@selector(focusControlBarDidAppear:)]) {
                [self.delegate focusControlBarDidAppear:self];
            }
        }];
    }
}

1 个答案:

答案 0 :(得分:0)

我只知道在iOS 7中我们还需要考虑KeyboardAnimationCurve。使用以下修改过的代码,我就有了它的工作。

- (void)keyboardWillShow:(NSNotification *)iNotification {
    self.dismissForm = NO;
    self.shouldScrollCell = YES;

    NSDictionary *aNotificationInfo = [iNotification userInfo];
    CGFloat aKeyboardAnimationDuration = [aNotificationInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve aKeyboardAnimationCurve = [aNotificationInfo[UIKeyboardAnimationCurveUserInfoKey] intValue];
    CGRect aKeyboardFrame = [aNotificationInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect adjustedKeyboardFrame = [self.view convertRect:aKeyboardFrame fromView:nil];
    CGFloat adjustedHeight;
    adjustedHeight = aKeyboardFrame.size.height + self.focusControlBar.frame.size.height;

    [self.focusControlBar viewForFocusControlWillShowWithEndFrame:adjustedKeyboardFrame animationCurve:aKeyboardAnimationCurve andAnimationDuration:aKeyboardAnimationDuration];

    [UIView animateWithDuration:0.3 animations:^() {
        [self.tableView setContentInset:UIEdgeInsetsMake(kScreenOrigin, kScreenOrigin, adjustedHeight, 0.0f)];
        [self.tableView setScrollIndicatorInsets:UIEdgeInsetsMake(kScreenOrigin, kScreenOrigin, adjustedHeight, 0.0f)];
    }];
}

- (void)viewForFocusControlWillShowWithEndFrame:(CGRect)iFrame animationCurve:(UIViewAnimationCurve)iAnimationCurve andAnimationDuration:(CGFloat)iDuration {
    BOOL aShouldAppear = YES;   

    if (self.delegate && [self.delegate respondsToSelector:@selector(focusControlBarShouldAppear:)]) {
        aShouldAppear = [self.delegate focusControlBarShouldAppear:self];
    }

    if (aShouldAppear) {
        if (self.delegate && [self.delegate respondsToSelector:@selector(focusControlBarWillAppear:)]) {
            [self.delegate focusControlBarWillAppear:self];
        }

        CGRect aBarFrame = self.frame;
        UIInterfaceOrientation anInterfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
        aBarFrame.size.height = [self heightForOrientation:anInterfaceOrientation];
        self.frame = aBarFrame;
        aBarFrame.origin.y = self.superview.bounds.size.height - iFrame.size.height - aBarFrame.size.height;

        [UIView animateWithDuration:iDuration delay:0.0 options:(iAnimationCurve << 16) animations:^{
            self.frame = aBarFrame;
        } completion:^(BOOL finished) {
            if (self.delegate && [self.delegate respondsToSelector:@selector(focusControlBarDidAppear:)]) {
                [self.delegate focusControlBarDidAppear:self];
            }
        }];
    }
}