আইফোন: ব্যবহারকারীর নিষ্ক্রিয়তা / নিষ্ক্রিয় সময় শেষ স্ক্রিন টাচ থেকে সনাক্ত করা


152

কেউ কি এমন কোনও বৈশিষ্ট্য প্রয়োগ করেছেন যেখানে ব্যবহারকারী যদি নির্দিষ্ট সময়ের জন্য পর্দা স্পর্শ না করে, আপনি একটি নির্দিষ্ট পদক্ষেপ নিয়েছেন? আমি এটি করার সর্বোত্তম উপায়টি বের করার চেষ্টা করছি।

ইউআইএ অ্যাপ্লিকেশনটিতে এই কিছুটা সম্পর্কিত পদ্ধতি রয়েছে:

[UIApplication sharedApplication].idleTimerDisabled;

যদি আপনার পরিবর্তে এরকম কিছু থাকে তবে ভাল লাগবে:

NSTimeInterval timeElapsed = [UIApplication sharedApplication].idleTimeElapsed;

তারপরে আমি একটি টাইমার সেট আপ করতে এবং পর্যায়ক্রমে এই মানটি পরীক্ষা করতে পারি এবং এটি যখন একটি প্রান্তিকের চেয়ে বেশি হয়ে যায় তখন কিছু ব্যবস্থা নিতে পারি।

আশা করি এটি আমি যা খুঁজছি তা ব্যাখ্যা করে। কেউ ইতিমধ্যে এই সমস্যাটি মোকাবেলা করেছেন, বা আপনি কীভাবে এটি করবেন তা নিয়ে কোনও চিন্তাভাবনা রয়েছে? ধন্যবাদ।


এটা একটা ভাল প্রশ্ন. উইন্ডোজ একটি অনআইডল ইভেন্টের ধারণা আছে তবে আমি মনে করি এটি অ্যাপটি আইওএস আইডিমালটাইমারডিজিয়েল সম্পত্তি যা বনাম কেবলমাত্র ডিভাইসটিকে লক করার সাথে সম্পর্কিত বলে মনে হচ্ছে কোনও বার্তা পাম্পের কোনও কিছুই পরিচালনা করছে না about আইওএস / ম্যাকোএসএক্স-এ উইন্ডোজ ধারণার খুব কাছাকাছি কিছু রয়েছে কিনা এমন যে কেউ জানেন?
স্টোনডাউজ

উত্তর:


153

আমি যে উত্তরটি খুঁজছিলাম তা এখানে:

আপনার অ্যাপ্লিকেশন প্রতিনিধি সাবক্লাস ইউআইএ আবেদন করুন। বাস্তবায়ন ফাইলে, সেন্ডইভেন্ট: পদ্ধতিটিকে ওভাররাইড করুন

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

    // Only want to reset the timer on a Began touch or an Ended 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)
            [self resetIdleTimer];
    }
}

- (void)resetIdleTimer {
    if (idleTimer) {
        [idleTimer invalidate];
        [idleTimer release];
    }

    idleTimer = [[NSTimer scheduledTimerWithTimeInterval:maxIdleTime target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO] retain];
}

- (void)idleTimerExceeded {
    NSLog(@"idle time exceeded");
}

যেখানে maxIdleTime এবং idleTimer হল উদাহরণ ভেরিয়েবল।

এটি কাজ করার জন্য, আপনাকে ইউআইএপ্লিকেশন মেইনকে আপনার প্রতিনিধি শ্রেণিকে (উদাহরণস্বরূপ, অ্যাপডেলিগেট) প্রধান শ্রেণি হিসাবে ব্যবহার করতে বলার জন্য আপনার মেইন.এম পরিবর্তন করতে হবে:

int retVal = UIApplicationMain(argc, argv, @"AppDelegate", @"AppDelegate");

3
হাই মাইক, আমার অ্যাপ্লিকেশনটি এনএসবজেক্টের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে তাই ব্যবহারকারীকে নিষ্ক্রিয় হয়ে ওঠার জন্য এটি ইউআইএপ্লিকেশন এবং উপরের পদ্ধতিগুলি প্রয়োগ করুন তবে আমি ত্রুটি পাচ্ছি "অপ্রয়োজনীয় ব্যতিক্রমের কারণে অ্যাপ্লিকেশনটি সমাপ্ত করা হচ্ছে 'এনএসআইটার্নাল ইনক্লিনিসিটি এক্সপেশন', কারণ: 'কেবলমাত্র একটি ইউআইএপ্লিকেশন উদাহরণ থাকতে পারে।' ".. আমার আর কিছু করা দরকার ...?
মিহির মেহতা

7
আমি যুক্ত করব যে ইউআইএপ্লিকেশন সাবক্লাসটি ইউআইএপ্লিকেশনডেলিগেট সাবক্লাস থেকে আলাদা হওয়া উচিত
বলিভা

আমি নিশ্চিত নই যে টাইমাররা গুলি চালানো বন্ধ করলে ডিভাইসটি নিষ্ক্রিয় অবস্থায় প্রবেশ করে কীভাবে এটি কাজ করবে?
অ্যানোমিস

যদি আমি টাইমআউট ইভেন্টের জন্য পপটোরোটভিউ কনট্রোলার ফাংশনটি ব্যবহার করে নিই তবে সঠিকভাবে কাজ করে না। এটি তখন ঘটে যখন আমি ইউআইএলআর্টভিউ দেখি, তারপরে পপটো রুটভিউ কনট্রোলার, তারপরে আমি ইউআইআইএলআর্টভিউতে যে কোনও বোতাম টিপুন ইউভিউকন্ট্রোলারের একটি নির্বাচক যা ইতিমধ্যে পপ করা হয়েছে
গারগো

4
খুব সুন্দর! যাইহোক, NSTimerযদি অনেক স্পর্শ থাকে তবে এই পদ্ধতির ফলে প্রচুর দৃষ্টান্ত তৈরি হয়।
Andreas Ley

86

আমার কাছে নিষ্ক্রিয় টাইমার সমাধানের একটি প্রকরণ রয়েছে যার জন্য ইউআইএপ্লিকেশন সাবক্লাসিংয়ের প্রয়োজন হয় না। এটি একটি নির্দিষ্ট ইউআইভিউউকন্ট্রোলার সাবক্লাসে কাজ করে, তাই কার্যকর যদি আপনার কাছে কেবলমাত্র একটি ভিউ কন্ট্রোলার থাকে (যেমন একটি ইন্টারেক্টিভ অ্যাপ্লিকেশন বা গেম থাকতে পারে) বা কেবল নির্দিষ্ট ভিউ নিয়ামকটিতে নিষ্ক্রিয় সময়সীমা হ্যান্ডেল করতে চান।

নিষ্ক্রিয় টাইমার পুনরায় সেট করার সময় এটি NSTimer অবজেক্টটিকে পুনরায় তৈরি করে না। এটি কেবল তখনই একটি নতুন তৈরি করে যদি টাইমার গুলি চালায়।

আপনার কোডটি resetIdleTimerনিষ্ক্রিয় টাইমারকে (যেমন উল্লেখযোগ্য অ্যাক্সিলোমিটার ইনপুট হিসাবে) অকার্যকর করতে পারে এমন অন্য কোনও ইভেন্টের জন্য কল করতে পারে।

@interface MainViewController : UIViewController
{
    NSTimer *idleTimer;
}
@end

#define kMaxIdleTimeSeconds 60.0

@implementation MainViewController

#pragma mark -
#pragma mark Handling idle timeout

- (void)resetIdleTimer {
    if (!idleTimer) {
        idleTimer = [[NSTimer scheduledTimerWithTimeInterval:kMaxIdleTimeSeconds
                                                      target:self
                                                    selector:@selector(idleTimerExceeded)
                                                    userInfo:nil
                                                     repeats:NO] retain];
    }
    else {
        if (fabs([idleTimer.fireDate timeIntervalSinceNow]) < kMaxIdleTimeSeconds-1.0) {
            [idleTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:kMaxIdleTimeSeconds]];
        }
    }
}

- (void)idleTimerExceeded {
    [idleTimer release]; idleTimer = nil;
    [self startScreenSaverOrSomethingInteresting];
    [self resetIdleTimer];
}

- (UIResponder *)nextResponder {
    [self resetIdleTimer];
    return [super nextResponder];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self resetIdleTimer];
}

@end

(ব্রেভিটির জন্য মেমরি ক্লিনআপ কোড বাদ দেওয়া হয়েছে))


1
খুব ভালো. এই উত্তর শিলা! উত্তরটিকে সঠিক হিসাবে চিহ্নিত হিসাবে চিহ্নিত করেছেন যদিও আমি জানি এটি অনেক আগে ছিল তবে এটি এখন আরও ভাল সমাধান।
চিন্তন প্যাটেল

এটি দুর্দান্ত, তবে একটি সমস্যা আমি পেয়েছি: ইউআইটিএবলভিউজে স্ক্রোলিংয়ের ফলে পরবর্তী রিসপন্ডার কল করার কারণ নেই। আমি টাচস বিগান: এবং টাচস মোভেড: এর মাধ্যমেও ট্র্যাকিংয়ের চেষ্টা করেছি, তবে কোনও উন্নতি হয়নি। কোন ধারনা?
গ্রেগ ম্যালেটিক

3
@ গ্রেগম্যালিটিক: আমারও একই সমস্যা ছিল তবে শেষ পর্যন্ত আমি যুক্ত করেছি - (শূন্য) স্ক্রোলভিউ উইলবিগিনড্র্যাগিং: (ইউআইএসক্রোলভিউ *) স্ক্রোলভিউ {এনএসএলজি (@ "টানা শুরু করবে"); } - (অকার্যকর) স্ক্রোলভিউডিডিস্ক্রোল: (ইউআইএসক্রোলভিউ *) স্ক্রোলভিউ {এনএসএলজি (@ "স্ক্রোল ডিড হয়েছে"); [স্ব-রিসেটআইডলটাইমার]; তুমি কি চেষ্টা করেছ?
অক্ষয় আহের

ধন্যবাদ। এটি এখনও সহায়ক। আমি এটি সুইফটে পোর্ট করেছি এবং এটি দুর্দান্ত কাজ করেছে।
Mark.ewd

আপনি একটি রক তারকা. kudos
প্রসারণ

21

দ্রুত v 3.1 এর জন্য

অ্যাপলিজিট // @ ইউআইএপ্লিকেশনমেইনে এই লাইনটি মন্তব্য করতে ভুলবেন না

extension NSNotification.Name {
   public static let TimeOutUserInteraction: NSNotification.Name = NSNotification.Name(rawValue: "TimeOutUserInteraction")
}


class InterractionUIApplication: UIApplication {

static let ApplicationDidTimoutNotification = "AppTimout"

// The timeout in seconds for when to fire the idle timer.
let timeoutInSeconds: TimeInterval = 15 * 60

var idleTimer: Timer?

// Listen for any touch. If the screen receives a touch, the timer is reset.
override func sendEvent(_ event: UIEvent) {
    super.sendEvent(event)

    if idleTimer != nil {
        self.resetIdleTimer()
    }

    if let touches = event.allTouches {
        for touch in touches {
            if touch.phase == UITouchPhase.began {
                self.resetIdleTimer()
            }
        }
    }
}

// Resent the timer because there was user interaction.
func resetIdleTimer() {
    if let idleTimer = idleTimer {
        idleTimer.invalidate()
    }

    idleTimer = Timer.scheduledTimer(timeInterval: timeoutInSeconds, target: self, selector: #selector(self.idleTimerExceeded), userInfo: nil, repeats: false)
}

// If the timer reaches the limit as defined in timeoutInSeconds, post this notification.
func idleTimerExceeded() {
    NotificationCenter.default.post(name:Notification.Name.TimeOutUserInteraction, object: nil)
   }
} 

main.swif ফাইল তৈরি করুন এবং এটি যুক্ত করুন (নামটি গুরুত্বপূর্ণ)

CommandLine.unsafeArgv.withMemoryRebound(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)) {argv in
_ = UIApplicationMain(CommandLine.argc, argv, NSStringFromClass(InterractionUIApplication.self), NSStringFromClass(AppDelegate.self))
}

অন্য যে কোনও শ্রেণিতে বিজ্ঞপ্তি পর্যবেক্ষণ করা হচ্ছে

NotificationCenter.default.addObserver(self, selector: #selector(someFuncitonName), name: Notification.Name.TimeOutUserInteraction, object: nil)

2
আমি বুঝতে পারছি না কেন আমরা একটি চেক প্রয়োজন if idleTimer != nilমধ্যে sendEvent()পদ্ধতি?
গুয়াঙ্গু ওয়াং

timeoutInSecondsওয়েব পরিষেবা প্রতিক্রিয়া থেকে আমরা কীভাবে মূল্য নির্ধারণ করতে পারি ?
ব্যবহারকারী_1191

12

এই থ্রেডটি একটি দুর্দান্ত সহায়তা ছিল এবং আমি এটিকে একটি ইউআইওয়াইন্ডো সাবক্লাসে গুটিয়ে রাখি যা বিজ্ঞপ্তিগুলি প্রেরণ করে। আমি এটিকে সত্যিকারের looseিলে coupালা মিশ্রণ হিসাবে বিজ্ঞপ্তিগুলি বেছে নিয়েছি তবে আপনি যথেষ্ট পরিমাণে প্রতিনিধি যুক্ত করতে পারেন।

এখানে সংক্ষেপ:

http://gist.github.com/365998

এছাড়াও, ইউআইএআইপ্লিকেশন সাবক্লাস সমস্যার কারণ হ'ল এনআইবি সেটআপ করে 2 টি ইউআইএপ্লিকেশন অবজেক্ট তৈরি করতে কারণ এটিতে অ্যাপ্লিকেশন এবং প্রতিনিধি থাকে। UIWindow সাবক্লাস যদিও দুর্দান্ত কাজ করে।


1
আপনি কি আমাকে আপনার কোড ব্যবহার করতে পারেন বলতে পারেন? কীভাবে এটি বলা যায় তা আমি বুঝতে পারি না
আর দেবী

2
এটি ছোঁয়ায় দুর্দান্ত কাজ করে তবে কীবোর্ড থেকে ইনপুট হ্যান্ডেল করছে বলে মনে হয় না। এর অর্থ যদি ব্যবহারকারী গুই কীবোর্ডে স্টাফ টাইপ করে থাকেন তবে এটি শেষ হয়ে যাবে।
মার্টিন উইকম্যান

2
আমিও এটি কীভাবে ব্যবহার করব তা বুঝতে সক্ষম হয়েছি না ... আমি আমার ভিউ কন্ট্রোলারে পর্যবেক্ষক যুক্ত করি এবং অ্যাপ্লিকেশনটি ছোঁয়া / নিষ্ক্রিয় থাকাকালীন বিজ্ঞপ্তিগুলি নিক্ষেপ করা হবে বলে আশা করি .. তবে কিছুই ঘটেনি ... প্লাস থেকে আমরা অলস সময়টি নিয়ন্ত্রণ করতে পারি? আমি চাই যে 120 সেকেন্ডের অলস সময় চাই যাতে 120 সেকেন্ড পরে আইডলনোটিকেশনটি আগুন উচিত, তার আগে নয়।
উত্তর

5

আসলে সাবক্লাসিং ধারণাটি দুর্দান্ত কাজ করে। কেবল আপনার প্রতিনিধি UIApplicationসাবক্লাস করবেন না । UIApplication(যেমন মাই অ্যাপ) থেকে উত্তরাধিকার সূত্রে প্রাপ্ত অন্য একটি ফাইল তৈরি করুন । আইবি ইন বর্গ সেট fileOwnerকরার বস্তু myAppএবং myApp.m বাস্তবায়ন sendEventউপরের মতো পদ্ধতি। মেইন.এম ইন:

int retVal = UIApplicationMain(argc,argv,@"myApp.m",@"myApp.m")

এট ভয়েইল!


1
হ্যাঁ, একা একা ইউআইএপ্লিকেশন সাবক্লাস তৈরি করা ভাল মনে হচ্ছে। আমি দ্বিতীয় parm শূন্য রইল।
হট লিকস

@Roby, যে আমার প্রশ্নের সাথে একটি চেহারা আছে stackoverflow.com/questions/20088521/...
তীর্থ

4

আমি কেবল একটি গেমটি দিয়ে গতি দ্বারা নিয়ন্ত্রিত এই সমস্যাটির সাথে দৌড়েছি অর্থাৎ স্ক্রিন লকটি অক্ষম আছে তবে মেনু মোডে থাকা অবস্থায় এটি আবার সক্ষম করা উচিত। একটি টাইমার পরিবর্তে আমি setIdleTimerDisabledনীচের পদ্ধতিগুলি সরবরাহ করে একটি ছোট শ্রেণীর মধ্যে সমস্ত কলকে আবদ্ধ করে রেখেছি :

- (void) enableIdleTimerDelayed {
    [self performSelector:@selector (enableIdleTimer) withObject:nil afterDelay:60];
}

- (void) enableIdleTimer {
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
}

- (void) disableIdleTimer {
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
}

disableIdleTimerনিষ্ক্রিয় টাইমার নিষ্ক্রিয় enableIdleTimerDelayedকরে, মেনুতে প্রবেশ করার সময় বা নিষ্ক্রিয় টাইমার দিয়ে চালিত হওয়া উচিত এবং সক্রিয়enableIdleTimer আপনার applicationWillResignActiveসমস্ত পরিবর্তনগুলি সিস্টেমের ডিফল্ট আচরণে সঠিকভাবে পুনরায় সেট করা যায় তা নিশ্চিত করার জন্য আপনার অ্যাপডেলিগেটের পদ্ধতি থেকে কল করা হয়।
আমি একটি নিবন্ধ লিখেছি এবং আইফোন গেমসে আইডল টাইমারম্যানেজার আইডল টাইমার হ্যান্ডলিংয়ের জন্য সিঙ্গলটন ক্লাসের কোড সরবরাহ করেছি


4

ক্রিয়াকলাপ শনাক্ত করার আরেকটি উপায় এখানে:

টাইমারটি এতে যুক্ত করা হয়েছে UITrackingRunLoopMode, তাই যদি UITrackingকার্যকলাপ থাকে তবে তা কেবল গুলি চালাতে পারে। এটি সমস্ত স্পর্শ ইভেন্টের জন্য আপনাকে স্প্যাম না দেওয়ার দুর্দান্ত সুবিধা রয়েছে, এভাবে শেষ ACTIVITY_DETECT_TIMER_RESOLUTIONসেকেন্ডে কোনও কার্যকলাপ ছিল কিনা তা অবহিত করে । আমি এর keepAliveজন্য উপযুক্ত ব্যবহারের মামলা বলে মনে হয় নির্বাচককে নামকরণ করেছি । সম্প্রতি যে কার্যকলাপ হয়েছে সে তথ্য দিয়ে আপনি অবশ্যই যা কিছু করতে পারেন তা করতে পারেন।

_touchesTimer = [NSTimer timerWithTimeInterval:ACTIVITY_DETECT_TIMER_RESOLUTION
                                        target:self
                                      selector:@selector(keepAlive)
                                      userInfo:nil
                                       repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_touchesTimer forMode:UITrackingRunLoopMode];

তা কিভাবে? আমি বিশ্বাস করি এটি স্পষ্ট যে আপনার যা প্রয়োজন তা আপনাকে "কিপলাইভ" নির্বাচনকারী হিসাবে নিজেকে তৈরি করা উচিত। আমি কি তোমার দৃষ্টিকোণটি মিস করছি?
মিহাই তিমার

আপনি বলছেন যে কার্যকলাপটি সনাক্ত করার এটি অন্য একটি উপায়, তবে এটি কেবলমাত্র একটি আইভিআর ইনস্ট্যান্ট করে যা একটি এনএসটিমিকার। এটি কীভাবে ওপি-র প্রশ্নের উত্তর দেয় তা আমি দেখতে পাচ্ছি না।
জ্যাস্পার

1
টাইমারটি ইউআইটি ট্র্যাকিং রুনলুপমোডে যুক্ত করা হয়েছে, তাই যদি ইউআইটি ট্র্যাকিংয়ের ক্রিয়াকলাপ থাকে তবে এটি কেবল গুলি চালাতে পারে। এটি সমস্ত স্পর্শ ইভেন্টের জন্য আপনাকে স্প্যাম না করার চমৎকার সুবিধা রয়েছে, এভাবে গত ACTIVITY_DETECT_TIMER_RESOLUTION সেকেন্ডে কোনও কার্যকলাপ ছিল কিনা তা অবহিত করে ing আমি নির্বাচককে কিপএলাইভের নামকরণ করেছি কারণ এটি এর জন্য উপযুক্ত ব্যবহারের ক্ষেত্রে মনে হয়। সম্প্রতি যে কার্যকলাপ হয়েছে সে তথ্য দিয়ে আপনি অবশ্যই যা কিছু করতে পারেন তা করতে পারেন।
মিহাই তিমার

1
আমি এই উত্তরটি উন্নত করতে চাই। আপনি যদি এটি আরও পরিষ্কার করে তুলতে পয়েন্টারগুলির সাহায্য করতে পারেন তবে এটি একটি দুর্দান্ত সহায়তা would
মিহাই তিমার

আমি আপনার উত্তরে আপনার ব্যাখ্যা যুক্ত করেছি। এটি এখন অনেক বেশি অর্থবোধ করে।
জ্যাস্পার

3

অবশেষে আপনার নির্ধারণ করা দরকার যা আপনি নিষ্ক্রিয় বলে মনে করেন - এটি কি নিষ্ক্রিয় ফলাফল ব্যবহারকারীর পর্দা স্পর্শ না করে বা কোনও কম্পিউটারের সংস্থান ব্যবহার না করা হলে এটি সিস্টেমের অবস্থা? টাচ স্ক্রিনের মাধ্যমে ডিভাইসের সাথে সক্রিয়ভাবে ইন্টারঅ্যাক্ট না করা সত্ত্বেও ব্যবহারকারী কিছু করার জন্য এটি অনেক অ্যাপ্লিকেশনেই সম্ভব। ব্যবহারকারী সম্ভবত ডিভাইসটি ঘুমাতে যাচ্ছেন এবং স্ক্রিনটি ম্লান হয়ে যাওয়ার মাধ্যমে যে নোটিশটি ঘটবে সে সম্পর্কে ধারণা থাকলেও অকারণে তারা কিছু ঘটবে বলে আশা করা উচিত নয় - আপনার সতর্কতা অবলম্বন করা উচিত আপনি কি করবেন সম্পর্কে। তবে মূল বিবৃতিতে ফিরে যাওয়া - আপনি যদি 1 ম কেসটিকে নিজের সংজ্ঞা হিসাবে বিবেচনা করেন তবে এটি করার কোনও সহজ উপায় নেই। আপনার প্রতিটি স্পর্শ ইভেন্ট গ্রহণ করা দরকার, প্রাপ্তির সময়টি লক্ষ্য করার সময় এটি প্রয়োজনমতো প্রতিক্রিয়াশীল চেইনে বয়ে দেওয়া। এটি আপনাকে নিষ্ক্রিয় গণনা করার জন্য কিছু ভিত্তি দেবে। যদি আপনি দ্বিতীয় কেসটিকে আপনার সংজ্ঞা হিসাবে বিবেচনা করেন, আপনি সেই সময় আপনার যুক্তি চেষ্টা করার জন্য কোনও এনএসপোস্টওয়েনআইডল বিজ্ঞপ্তি দিয়ে খেলতে পারেন।


1
কেবল পরিষ্কার করতেই, আমি পর্দার সাথে ইন্টারঅ্যাকশন সম্পর্কে কথা বলছি। আমি প্রতিফলিত করতে প্রশ্ন আপডেট করব।
মাইক ম্যাকমাস্টার 21

1
তারপরে আপনি এমন কিছু বাস্তবায়ন করতে পারেন যেখানে যখন কোনও স্পর্শ ঘটে তখন আপনি একটি মান আপডেট করেন যা আপনি যাচাই করেছেন, বা অলস টাইমারকে আগুন জ্বালানোর জন্য সেট করেছেন (এবং পুনরায় সেটও করেছেন) তবে আপনাকে নিজেরাই এটি প্রয়োগ করা দরকার, কারণ ওয়াইজকয়ার্ক যেমন বলেছিলেন, যা নিষ্ক্রিয় থাকে তার মধ্যে পরিবর্তিত হয় বিভিন্ন অ্যাপস।
লুই গারবার্গ

1
আমি সর্বশেষ পর্দার স্পর্শ করার পরে সময় হিসাবে কঠোরভাবে "অলস" সংজ্ঞা দিচ্ছি। আমি পেয়েছি যে এটি নিজেই বাস্তবায়ন করা দরকার, আমি কেবল ভাবছিলাম যে "সেরা" উপায়টি কী হবে, বলুন, বাধা দেওয়া পর্দার ছোঁয়া হবে বা যদি কেউ এটি নির্ধারণের জন্য কোনও বিকল্প পদ্ধতি সম্পর্কে জানেন তবে।
মাইক ম্যাকমাস্টার

3

স্বতন্ত্র নিয়ন্ত্রকদের কিছু না করে প্রশস্তভাবে এই অ্যাপ্লিকেশনটি করার একটি উপায় রয়েছে। কেবল একটি অঙ্গভঙ্গি সনাক্তকারী যুক্ত করুন যা ছোঁয়া বাতিল করে না। এইভাবে, সমস্ত স্পর্শগুলি টাইমারটির জন্য ট্র্যাক করা হবে এবং অন্যান্য স্পর্শ এবং অঙ্গভঙ্গিগুলি মোটেও প্রভাবিত হয় না তাই অন্য কারও সম্পর্কে এটি জানতে হবে না।

fileprivate var timer ... //timer logic here

@objc public class CatchAllGesture : UIGestureRecognizer {
    override public func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        super.touchesBegan(touches, with: event)
    }
    override public func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
        //reset your timer here
        state = .failed
        super.touchesEnded(touches, with: event)
    }
    override public func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
        super.touchesMoved(touches, with: event)
    }
}

@objc extension YOURAPPAppDelegate {

    func addGesture () {
        let aGesture = CatchAllGesture(target: nil, action: nil)
        aGesture.cancelsTouchesInView = false
        self.window.addGestureRecognizer(aGesture)
    }
}

আপনার অ্যাপের প্রতিনিধিটির কাজ শেষ করার পদ্ধতিটি শেষ হয়েছে, কেবল অ্যাডস্টেস্টারে কল করুন এবং আপনি প্রস্তুত। সমস্ত স্পর্শগুলি অন্যের কার্যকারিতা রোধ না করে ক্যাচএলজিস্টারের পদ্ধতিগুলির মধ্য দিয়ে যাবে।


1
আমি এই পদ্ধতির মত, Xamarin সঙ্গে একটি অনুরূপ সমস্যার জন্য এটি ব্যবহৃত: stackoverflow.com/a/51727021/250164
উলফগ্যাং Schreurs

1
দুর্দান্ত কাজ করে, এটিকে দেখে মনে হয় যেমন AVPlayerViewController ( প্রাইভেট এপিআই রেফ ) তে ইউআই নিয়ন্ত্রণের দৃশ্যমানতা নিয়ন্ত্রণ করতে এই কৌশলটি ব্যবহার করা হয় । ওভাররাইডিং অ্যাপটি -sendEvent:ওভারকিল, এবং UITrackingRunLoopModeঅনেকগুলি ক্ষেত্রে পরিচালনা করে না।
রোমান বি

@RomanB। একদম সঠিক. যখন আপনি iOS সঙ্গে কাজ করেছি দীর্ঘ যথেষ্ট আপনি সবসময় "সঠিক ভাবে" ব্যবহার করতে জানেন এবং এই উদ্দেশ্যে যেমন একটি কাস্টম অঙ্গভঙ্গি বাস্তবায়ন সহজবোধ্য উপায় developer.apple.com/documentation/uikit/uigesturerecognizer/...
Jlam

রাষ্ট্রকে কীভাবে সেট করা যায়?
স্টোনডাউজ

আমি এই পদ্ধতির পছন্দ করি কিন্তু এটি চেষ্টা করার পরে কেবল ট্যাপগুলি ধরা হয়, স্পর্শগুলিতে প্যান, সোয়াইপ ইত্যাদির মতো অন্য কোনও অঙ্গভঙ্গি নয় যেখানে রিসেট যুক্তিটি যেতে হবে সেখানেই শেষ হয়। এটা কি উদ্দেশ্য ছিল?
স্টোনডাউজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.