4

人々がこの質問のポップアップを再び見たとき、私はため息をつくことを想像できます. ただし、ここ、ドキュメント、Google の両方で多くの情報を読みましたが、まだ解決策が見つかりません。だからここでは何も行きません。

Facebook のログイン画面を再作成しようとしています。この画面では、スペースと位置がキーボードでアニメーション化され、ユーザーがすべての入力フィールドとログイン ボタンを表示できるようになっています。

これは、 を使用してkCAFillModeForwardsに設定removedOnCompletionすると機能しNOます。しかし、SO の別のスレッドで述べたように、これはプロパティを視覚的に変更するだけのようで、実際のタップ位置は変更されません。そのため、ユーザーが入力フィールドをタップしているように見える場合、iOS はそれをバックグラウンドでのタップとして解釈します。

そのため、新しい位置とサイズを設定しようとしましたが、アニメーションが再生されず、新しい位置にスナップするだけです。トランザクションの有無にかかわらず、呼び出しの前後にaddAnimation配置しても、違いはありません。

デリゲート メソッドは引き続き呼び出されますが、アニメーションを視覚的に確認することはできません。

if([notification name] == UIKeyboardWillShowNotification) {

    CGRect currBounds = self.loginTable.tableHeaderView.layer.bounds;
    CGSize newSize = CGSizeMake(self.loginTable.tableHeaderView.bounds.size.width, 60);
    CGPoint newPos = CGPointMake(self.loginTable.layer.position.x, self.loginTable.layer.position.x - 50);


    //[CATransaction begin];
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds.size"];
    [animation setToValue:[NSValue valueWithCGSize:newSize]];
    [animation setDelegate:self];

    [self.loginTable.tableHeaderView.layer addAnimation:animation forKey:@"headerShrinkAnimation"];


    CABasicAnimation *formPosAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
    [formPosAnimation setToValue:[NSValue valueWithCGPoint:newPos]];
    [formPosAnimation setDelegate:self];        

    //formPosAnimation.removedOnCompletion = NO;
    //formPosAnimation.fillMode = kCAFillModeForwards;

    [self.loginTable.layer addAnimation:formPosAnimation forKey:@"tableMoveUpAnimation"];
    //[CATransaction commit];

    [self.loginTable.tableHeaderView.layer setBounds:CGRectMake(currBounds.origin.x, currBounds.origin.y, newSize.width, newSize.height)];
    [self.loginTable.layer setPosition:newPos];
}
4

1 に答える 1

2

私はそれを機能させる方法を見つけました。それが最善の方法であるかどうかはわかりませんが、現在は機能しているようです。

重要なことは、ほとんどすべてを組み合わせることでした。そのため、メソッドの位置を更新しながら、アニメーションを維持する必要がremovedOnCompletionありました。2つのアニメーションパラメータを設定しなくても機能しますが、最終的に小さなちらつきが見られます。fillModeanimationDidStop

- (void)keyboardWillChange:(NSNotification *)notification {
newSize = CGSizeZero;
newPos = CGPointZero;

if([notification name] == UIKeyboardWillShowNotification) {
    newSize = CGSizeMake(self.loginTable.tableHeaderView.bounds.size.width, 60);
    newPos = CGPointMake(self.loginTable.layer.position.x, self.loginTable.layer.position.x - 50);
} else {
    newSize = CGSizeMake(self.loginTable.tableHeaderView.bounds.size.width, 150);
    newPos = CGPointMake(self.loginTable.layer.position.x, self.loginTable.layer.position.x + 50);
}

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds.size"];
[animation setToValue:[NSValue valueWithCGSize:newSize]];
[animation setDelegate:self];

animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

[self.loginTable.tableHeaderView.layer addAnimation:animation forKey:@"headerShrinkAnimation"];

/*-----------------------------*/

CABasicAnimation *formPosAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
[formPosAnimation setToValue:[NSValue valueWithCGPoint:newPos]];
[formPosAnimation setDelegate:self];        

formPosAnimation.removedOnCompletion = NO;
formPosAnimation.fillMode = kCAFillModeForwards;

[self.loginTable.layer addAnimation:formPosAnimation forKey:@"tableMoveUpAnimation"];

}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
NSLog(@"Animation did stop");

CGRect currBounds = self.loginTable.tableHeaderView.layer.bounds;

[self.loginTable.tableHeaderView.layer setBounds:CGRectMake(currBounds.origin.x, currBounds.origin.y, newSize.width, newSize.height)];
[self.loginTable.layer setPosition:newPos];

[self.loginTable.tableHeaderView.layer removeAnimationForKey:@"headerShrinkAnimation"];
[self.loginTable.layer removeAnimationForKey:@"tableMoveUpAnimation"];

}

于 2012-01-10T21:24:14.017 に答える