0

少し問題があります。この方法でアニメーション付きのビューを表示しようとしています:

self.vistaAiuti = [[UIView alloc] initWithFrame:CGRectMake(10, -200, 300, 200)];
self.vistaAiuti.backgroundColor = [UIColor blueColor];


UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
closeButton.frame = CGRectMake(50, 140, 220, 40);
[closeButton setTitle:@"Go back" forState:UIControlStateNormal];
[closeButton addTarget:self action:@selector(closeView:) forControlEvents:UIControlEventTouchUpInside];

[self.vistaAiuti addSubview:closeButton];    
[self.view addSubview:self.vistaAiuti];

[UIView beginAnimations:@"MoveView" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:0.5f];
self.vistaAiuti.frame = CGRectMake(10, 0, 300, 200);
[UIView commitAnimations];  

そしてこれはそれを閉じるためのものです:

[UIView beginAnimations:@"MoveView" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:0.5f];
self.vistaAiuti.frame = CGRectMake(10, -200, 300, 0);
[UIView commitAnimations]; 

問題は、vista aiuto のボタンが vistaAiuti よりも遅いことです。そのため、ビューを閉じると、ボタンが数秒間後ろに残ります...同じ速度にするために何をしなければなりませんか?

4

1 に答える 1

3

問題は、近いアニメーションでvistaAiutiフレームがゼロの高さに設定されていることです。ボタンは遅れているように見えますが、実際に起こっているのは、下の親ビューがゼロの高さと-200の原点に縮小していることです。

アニメーションを閉じるターゲットフレームを次のように変更します。

self.vistaAiuti.frame = CGRectMake(10, -200, 300, 200);

また、他のアドバイス:

ビューの作成と表示を分離します。このようにして、表示するたびに別のサブビューを追加する必要はありません。

- (void)addVistaAiutiView {

    // your creation code
    self.vistaAiuti = [[UIView alloc] initWithFrame:CGRectMake(10, -200, 300, 200)];
    self.vistaAiuti.backgroundColor = [UIColor blueColor];

    UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    closeButton.frame = CGRectMake(50, 140, 220, 40);
    [closeButton setTitle:@"Go back" forState:UIControlStateNormal];
    [closeButton addTarget:self action:@selector(closeView:) forControlEvents:UIControlEventTouchUpInside];

    [self.vistaAiuti addSubview:closeButton];    
    [self.view addSubview:self.vistaAiuti];
}

ブロックアニメーションを使用すると、書き込みがはるかにコンパクトになり、読みやすくなります

- (BOOL)vistaAiutiIsHidden {

    return self.vistaAiuti.frame.origin.y < 0.0; 
}

- (void)setVistaAiutiHidden:(BOOL)hidden animated:(BOOL)animated {

    if (hidden == [self vistaAiutiIsHidden]) return;  // do nothing if it's already in the state we want it

    CGFloat yOffset = (hidden)? -200 : 200;           // move down to show, up to hide
    NSTimeInterval duration = (animated)? 0.5 : 0.0;  // quick duration or instantaneous

    [UIView animateWithDuration:duration animations: ^{
        self.vistaAiuti.frame = CGRectOffset(0.0, yOffset);
    }];
}
于 2012-06-09T07:16:27.707 に答える