-1

我正在使用一个使用Jonathan BadeenJLBPartialModal类的新应用程序,这个类试图模仿国家地理公园指南中的界面。

我的问题是,当我尝试在第二个视图中显示键盘时,第一次发生这种情况一切看起来都很好,第二次出现问题,键盘更小但仍然可以使用其原始尺寸。

第一次 http://i.stack.imgur.com/kByhh.png

第二次 http://i.stack.imgur.com/GNhbL.png

我不知道是否有任何方法可以强制第二个视图具有becomeFirstResponder

希望有任何建议来解决我的问题。

第一个视图

使用IBAction调用视图

-(IBAction)accion:(id)sender{
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    composeViewController *vc = [sb instantiateViewControllerWithIdentifier:@"composeView"];

    JLBPartialModal *partialModal = [JLBPartialModal sharedInstance];
    partialModal.delegate = vc;

    [partialModal presentViewController:vc dismissal:^{

    }];
}

第二种观点

该类有 3 个委托,其中一个是 didPresentPartialModalView,我使用这个委托在视图和动画结束后显示键盘:

#pragma mark - Partial modal delegate

- (void)didPresentPartialModalView:(JLBPartialModal *)partialModal
{
     self.texto.editable = YES;
     [self.texto becomeFirstResponder];
}

然后,当用户触摸关闭按钮时 UITextView 有resignFirstResponder并且使用NSNotificationCenter我知道键盘是隐藏的:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KeyboardWillHide:) name:UIKeyboardDidHideNotification object:nil];
}

- (IBAction)close:(id)sender
{
    self.texto.editable = NO;
    [self.texto resignFirstResponder];
}

-(void)KeyboardWillHide:(NSNotification *) notification {
    [[JLBPartialModal sharedInstance] dismissViewController];
}

- (BOOL)shouldDismissPartialModalView:(JLBPartialModal *)partialModal
{
   return YES;
}

谢谢你。

编辑

最后!

我已经解决了将removeOnCompletion添加到JLBPartialModal.m 中的问题

- (CAKeyframeAnimation *)pullBackAnimation
- (CAKeyframeAnimation *)pushForwardAnimation

像这样:

- (CAKeyframeAnimation *)pullBackAnimation
{
    CATransform3D startTransform = [self perspectiveTransform];
    CATransform3D endTransform = CATransform3DConcat([self windowScaledTransform], startTransform);
    CATransform3D middleTransform = CATransform3DConcat([self windowRotationTransform], startTransform);

    CAKeyframeAnimation *anim = [self windowAnimation];
    anim.values = @[[NSValue valueWithCATransform3D:startTransform], [NSValue valueWithCATransform3D:middleTransform], [NSValue valueWithCATransform3D:endTransform]];

    anim.removedOnCompletion = YES; // Line added

    return anim;
}

- (CAKeyframeAnimation *)pushForwardAnimation
{
    CATransform3D endTransform = [self perspectiveTransform];
    CATransform3D startTransform = CATransform3DConcat([self windowScaledTransform], endTransform);
    CATransform3D middleTransform = CATransform3DConcat([self windowRotationTransform], startTransform);

    CAKeyframeAnimation *anim = [self windowAnimation];
    anim.values = @[[NSValue valueWithCATransform3D:startTransform], [NSValue valueWithCATransform3D:middleTransform], [NSValue valueWithCATransform3D:endTransform]];

     anim.removedOnCompletion = YES; // Line added

    return anim;
}

有了这个,我确保动画被删除:D

4

1 回答 1

1

我使用 JLBPartialModal 控件对此进行了一些研究。看起来作者添加了一个带有比例的动画- (void)presentViewController:(UIViewController *)viewControllerToPresent dismissal:(void (^)(void))block

    for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
        if (window != self.window) {
            [window.layer addAnimation:[self pullBackAnimation] forKey:@"pullBackAnimation"];
            [UIView animateWithDuration:JLB_PARTIAL_MODAL_ANIMATION_DURATION animations:^{
                window.center = CGPointMake(window.center.x, window.center.y - JLB_PARTIAL_MODAL_WINDOW_VERTICAL_OFFSET);
            } completion:^(BOOL finished) {
                if (!hasCalledDelegate) {
                    [self.delegate didPresentPartialModalView:self];
                    hasCalledDelegate = YES;
                }
            }];
        }
    }

然后删除这个动画- (void)dismissViewController

        for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
            [window.layer removeAllAnimations];
        }

他假设windows第一种方法中的数组是解雇方法中的同一组窗口,我可能会对此提出质疑。您的键盘似乎位于一个设置了此比例属性但尚未删除的窗口中。

因此,我建议您在修复组件问题或作为临时修复时,执行第二个循环(removeAllAnimations 循环)以响应显示的键盘。

在没有看到您的代码的情况下,我不是 100% 确信这是答案。您可能正在其他地方做一些影响窗口系统状态的事情。

编辑:现在您已经发布了代码,我想我可以看到问题所在。您注册的通知是 KeyboardDidHide... 但您将其视为“WillHide”通知。当您调用dismissViewControllerJLBPartialModal 上的 sharedInstance 时,键盘已不再位于该[UIApplication sharedApplication].windows属性的窗口集中。这意味着动画不会从包含键盘的窗口中删除。如果您更改UIKeyboardDidHideNotificationUIKeyboardWillHideNotification.

于 2012-10-31T19:47:25.873 回答