Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone键盘问题_Iphone_Objective C_Ios_Keyboard - Fatal编程技术网

iPhone键盘问题

iPhone键盘问题,iphone,objective-c,ios,keyboard,Iphone,Objective C,Ios,Keyboard,我正在使用一个新的应用程序,它使用Jonathan Badeen的类JLBPartialModel,这个类试图模仿《国家地理》公园指南中的界面 我的问题是,当我试图在第二个视图中显示键盘时,第一次出现这种情况时,一切看起来都很好,第二次出现问题时,键盘变小了,但仍能按原来的大小工作 第一次 第二次 我不知道是否有任何方法可以迫使第二个视图成为第一响应者 希望你能给我一些建议来解决我的问题 第一视图 使用iAction调用视图 -(IBAction)accion:(id)sender{ U

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

我的问题是,当我试图在第二个视图中显示键盘时,第一次出现这种情况时,一切看起来都很好,第二次出现问题时,键盘变小了,但仍能按原来的大小工作

第一次

第二次

我不知道是否有任何方法可以迫使第二个视图成为第一响应者

希望你能给我一些建议来解决我的问题

第一视图 使用iAction调用视图

-(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已退出FirstResponder
,通过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;
}
多谢各位

编辑 终于

我已经解决了将removedOnCompletion添加到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

我用jlbPartialModel控件对此进行了一些研究。看起来作者在
-(void)presentViewController:(UIViewController*)viewControllerToPresent demission:(void(^)(void))块中添加了一个具有比例的动画

    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];
        }
他假设第一个方法中的
窗口数组
与第二个方法中的窗口是同一组,我可能会质疑这一点。键盘似乎位于设置了此比例属性的窗口中,但尚未删除

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

如果没有看到您的代码,我不能100%相信这是答案。您可能正在其他地方执行影响窗口系统状态的操作


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

对不起,我已经添加了第二个视图的代码查看我的答案,我已经根据您的代码对其进行了更新。嗯,我明白了。。。我要做几个测试看看我是否能解决这个问题。非常感谢@OCRickard我已将通知类型UIKeyboardDidHideNotification更改为UIKeyboardWillHideNotification,问题仍然存在。我正在研究JLBPartialModel类,看看是否可以解决我的问题,谢谢您的帮助。