3

に1つあるモジュールを1つ持つアプリケーションを開発しUIImageViewましたself.view。その上imageviewで、ユーザーは正常に機能しているいくつかの操作を実行できます。私の問題は、ユーザーがそれを操作していない場合、imageview5秒後に自動的にimageviewから削除する必要があるということです。self.viewどうすればこれを実装できますか?タイマーなどを使う必要がありますか?

4

2 に答える 2

4

はい、そのために使用できます。次のように 5 秒間NSTimerスケジュールします -NSTimer

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(removeImageView) userInfo:nil repeats:NO];

ここでもう1つ、画面をユーザーが使用するtimerときにこれをスケジュールする必要がありtouch、ユーザーtouchが画面を再度使用する場合は、invalidateこのタイマーを何度もスケジュールする必要がありますreschedule

于 2012-05-28T04:30:54.910 に答える
3

UIWindow をサブクラス化し、CustomWindow クラスでコードを実装しました (私の時間は 3 分間非アクティブで、タイマーが「起動」します)。

@implementation CustomWindow

// Extend method 
- (void)sendEvent:(UIEvent *)event 
{
    [super sendEvent:event];

    // Only want to reset the timer on a Began touch, to reduce the number of timer resets.
    NSSet *allTouches = [event allTouches];
    if ([allTouches count] > 0) 
    {
        // allTouches count only ever seems to be 1, so anyObject works here.
        UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;
        if (phase == UITouchPhaseBegan || phase == UITouchPhaseEnded) 
        {
            // spirko_log(@"touch  and class of touch - %@",  [((UITouch *)[allTouches anyObject]).view  class]);
            [self resetIdleTimer:NO];
        }
    }
}


- (void) resetIdleTimer:(BOOL)force 
{
    // Don't bother resetting timer unless it's been at least 5 seconds since the last reset.
    // But we need to force a reset if the maxIdleTime value has been changed.
    NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
    if (force || (now - lastTimerReset) > 5.0) 
    {
        // DebugLog(@"Reset idle timeout with value %f.", maxIdleTime);
        lastTimerReset = now;
        // Assume any time value less than one second is zero which means disable the timer.
        // Handle values > one second.
        if (maxIdleTime > 1.0) 
        {
            // If no timer yet, create one
            if (idleTimer == nil)
            {
                // Create a new timer and retain it.
                idleTimer = [[NSTimer scheduledTimerWithTimeInterval:maxIdleTime target:self selector:@selector(idleTimeExceeded) userInfo:nil repeats:NO] retain];
            }
            // Otherwise reset the existing timer's "fire date".
            else 
            {
              //  idleTimer = [[NSTimer scheduledTimerWithTimeInterval:maxIdleTime target:self selector:@selector(idleTimeExceeded) userInfo:nil repeats:NO] retain];

                [idleTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:maxIdleTime]];
            }
        }
        // If maxIdleTime is zero (or < 1 second), disable any active timer.
        else {
            if (idleTimer)
            {
                [idleTimer invalidate];
                [idleTimer release];
                idleTimer = nil;
            }
        }
    }
}

- (void) idleTimeExceeded 
{
  // hide your imageView or do whatever
}
于 2012-05-28T05:11:41.660 に答える