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