アニメーションを停止したい場合は、
[layer removeAllAnimations];
ビューのアニメーション化された非表示中の現在を知りたい場合alpha
(適切な場所から開始してアニメーションを反転できるように、次の操作を実行できます。
CALayer *presentationLayer = layer.presentationLayer;
CGFloat startingAlpha = presentationLayer.opacity;
次に、アルファをstartingAlpha
1.0に設定して、画面をちらつくことなく再表示をアニメーション化できます。
ブロックベースのアニメーションを使用して実際のアニメーションを実行できます。または、使用できると思いますがCABasicAnimation
、理由はわかりません。
したがって、たとえば、次のようなことができます(私の例では、「表示」ボタンがあります)。私はブロックアニメーションを使用していますが、それもうまくいくと思いCABasicAnimation
ます:
- (IBAction)onPressShowButton:(id)sender
{
[self showAndScheduleHide];
}
- (void)showAndScheduleHide
{
[UIView animateWithDuration:1.0
animations:^{
self.containerView.alpha = 1.0;
}
completion:^(BOOL finished) {
[self scheduleHide];
}];
}
- (void)show
{
[UIView animateWithDuration:1.0
animations:^{
self.containerView.alpha = 1.0;
}
completion:nil];
}
- (void)scheduleHide
{
self.timer = [NSTimer scheduledTimerWithTimeInterval:5.0
target:self
selector:@selector(startToHide)
userInfo:nil
repeats:NO];
}
- (void)startToHide
{
self.timer = nil;
self.hiding = YES;
[UIView animateWithDuration:5.0
delay:0.0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
self.containerView.alpha = 0.0;
}
completion:^(BOOL finished) {
self.hiding = NO;
}];
}
次に、それを元に戻したり、進行中の非表示を再スケジュールしたりするためのユーティリティメソッドを使用できます。
- (void)reverseAndPauseHide
{
// if we have a "hide" scheduled, then cancel that
if (self.timer)
{
[self.timer invalidate];
self.timer = nil;
}
// if we have a hide in progress, then reverse it
if (self.hiding)
{
[self.containerView.layer removeAllAnimations];
CALayer *layer = self.containerView.layer.presentationLayer;
CGFloat currentAlpha = layer.opacity;
self.containerView.alpha = currentAlpha;
[self show];
}
}
次に、問題は、これreverseAndPauseHide
をいつ呼び出すか、いつscheduleHide
再度呼び出すかです。したがって、たとえば、タッチを処理できます。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
[self reverseAndPauseHide];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
[self scheduleHide];
}