-1

Jonathan BadeenのクラスJLBPartialModalを使用する新しいアプリを使用しています。このクラスは、ナショナル ジオグラフィックのパーク ガイドのインターフェイスを模倣しようとしています。

私の問題はこれです.2番目のビューでキーボードを表示しようとすると、最初にこれが発生するとすべてがうまく見えます.2回目に問題が発生し、キーボードは小さくなりますが、元のサイズで動作します.

初めて http://i.stack.imgur.com/kByhh.png

二度目 http://i.stack.imgur.com/GNhbL.png

2番目のビューにbecomeFirstResponderを強制する方法があるかどうかはわかりません。

私の問題を解決するための提案があれば幸いです。

最初のビュー

View は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:^{

    }];
}

セカンドビュー

このクラスには、didPresentPartialModalView の 1 つである 3 つのデリゲートがあり、ビューとアニメーションの終了後にキーボードを表示するためにこのデリゲートを使用しています。

#pragma mark - Partial modal delegate

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

次に、ユーザーが [閉じる] ボタンをタッチすると、UITextView に rejectFirstResponder があり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;
}

ありがとうございました。

編集

ついに!

removeOnCompletionJLBPartialModal.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彼は、最初のメソッドの の配列が却下メソッドのウィンドウのセットと同じであると想定していますが、これについては疑問に思うかもしれません。キーボードは、このスケール属性が設定されているウィンドウにあるように見えますが、削除されていません。

したがって、コンポーネントの問題を修正するとき、または暫定的な修正として、表示されているキーボードに応答してこの 2 番目のループ (removeAllAnimations のループ) を実行することをお勧めします。

コードを見ずにこれが答えであると100%確信しているわけではありません。ウィンドウシステムの状態に影響を与える何かを他の場所で行っている可能性があります。

編集:コードを投稿したので、問題がわかると思います。サインアップしようとしている通知は KeyboardDidHide... ですが、「WillHide」通知として扱います。dismissViewControllerJLBPartialModal sharedInstance でを呼び出すまでに、キーボードは[UIApplication sharedApplication].windowsプロパティ内の一連のウィンドウに含まれていません。これは、キーボードを含むウィンドウからアニメーションが削除されないことを意味します。UIKeyboardDidHideNotificationに変更すると、おそらく機能しますUIKeyboardWillHideNotification

于 2012-10-31T19:47:25.873 に答える