जब कोई आईफोन हिलाता है तो मुझे कैसे पता चलेगा?


340

मैं प्रतिक्रिया देना चाहता हूं जब कोई आईफोन हिलाता है। मैं विशेष रूप से परवाह नहीं है कि वे इसे कैसे हिलाते हैं, बस यह कि इसे एक दूसरे विभाजन के लिए सख्ती से लहराया गया था। क्या किसी को पता है कि यह पता लगाने के लिए कैसे?

जवाबों:


292

3.0 में, अब एक आसान तरीका है - नई गति घटनाओं में हुक।

मुख्य चाल यह है कि आपको कुछ UIView (UIViewController नहीं) की आवश्यकता है जो आप हिला इवेंट संदेशों को प्राप्त करने के लिए FirstResponder के रूप में चाहते हैं। यहाँ वह कोड है जिसे आप किसी भी UIView में उपयोग कर सकते हैं शेक इवेंट पाने के लिए:

@implementation ShakingView

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if ( event.subtype == UIEventSubtypeMotionShake )
    {
        // Put in code here to handle shake
    }

    if ( [super respondsToSelector:@selector(motionEnded:withEvent:)] )
        [super motionEnded:motion withEvent:event];
}

- (BOOL)canBecomeFirstResponder
{ return YES; }

@end

आप आसानी से किसी भी यूआईवीवाईवाई (यहां तक ​​कि सिस्टम के विचारों) को एक दृश्य में बदल सकते हैं जो केवल इन विधियों के साथ दृश्य को उप-वर्ग करके हिला घटना को प्राप्त कर सकते हैं (और फिर आईबी में आधार प्रकार के बजाय इस नए प्रकार का चयन कर सकते हैं, या आवंटन करते समय इसका उपयोग कर सकते हैं) राय)।

व्यू कंट्रोलर में, आप पहले उत्तरदाता बनने के लिए इस दृश्य को सेट करना चाहते हैं:

- (void) viewWillAppear:(BOOL)animated
{
    [shakeView becomeFirstResponder];
    [super viewWillAppear:animated];
}
- (void) viewWillDisappear:(BOOL)animated
{
    [shakeView resignFirstResponder];
    [super viewWillDisappear:animated];
}

यह मत भूलो कि यदि आपके पास अन्य दृश्य हैं जो उपयोगकर्ता क्रियाओं (जैसे एक खोज बार या पाठ प्रविष्टि क्षेत्र) से पहली प्रतिक्रिया हो जाते हैं, तो आपको दूसरे दृश्य के इस्तीफा देने पर पहले मिलाए जाने वाले उत्तरदाता की स्थिति को भी पुनर्स्थापित करने की आवश्यकता होगी!

यदि आप ApplicationSupportsShakeToEdit को NO पर सेट करते हैं तो भी यह विधि काम करती है।


5
यह मेरे लिए काफी काम नहीं आया: मुझे viewDidAppearइसके बजाय अपने नियंत्रक को ओवरराइड करने की आवश्यकता थी viewWillAppear। मुझे यकीन नहीं है क्यों; शायद इससे पहले कि यह हिला घटनाओं को प्राप्त करने के लिए जो कुछ भी करता है उसे देखने के लिए दृश्य को देखने की आवश्यकता है?
क्रिस्टोफर जॉनसन

1
यह आसान है लेकिन बेहतर नहीं है। यदि आप एक लंबे, निरंतर शेक का पता लगाना चाहते हैं तो यह दृष्टिकोण उपयोगी नहीं है क्योंकि आईफोन motionEndedवास्तव में शेक बंद होने से पहले फायर करना पसंद करता है । इसलिए इस दृष्टिकोण का उपयोग करने से आपको एक लंबे समय के बजाय छोटे झटकों की एक निराश श्रृंखला मिलती है। अन्य उत्तर इस मामले में बहुत बेहतर काम करता है।
अरोठ

3
@ केंडल - UIViewControllers UIResponder को कार्यान्वित करते हैं और प्रत्युत्तर श्रृंखला में होते हैं। सबसे ऊपरी UIWindow भी है। developer.apple.com/library/ios/DOCUMENTATION/EventHandling/…
डग डबल

1
[super respondsToSelector:आप जो चाहते हैं वह नहीं करेंगे, क्योंकि यह कॉल करने के बराबर है [self respondsToSelector:जो वापस आ जाएगा YES। आपको क्या चाहिए [[ShakingView superclass] instancesRespondToSelector:
वादिम येलागिन

2
उपयोग करने के बजाय: if (event.subtype == UIEventSubtypeMotionShake) आप उपयोग कर सकते हैं: if (गति == UIEventSubtypeMotionShake)
हाशिम अख्तर

179

मेरे Diceshaker आवेदन से:

// Ensures the shake is strong enough on at least two axes before declaring it a shake.
// "Strong enough" means "greater than a client-supplied threshold" in G's.
static BOOL L0AccelerationIsShaking(UIAcceleration* last, UIAcceleration* current, double threshold) {
    double
        deltaX = fabs(last.x - current.x),
        deltaY = fabs(last.y - current.y),
        deltaZ = fabs(last.z - current.z);

    return
        (deltaX > threshold && deltaY > threshold) ||
        (deltaX > threshold && deltaZ > threshold) ||
        (deltaY > threshold && deltaZ > threshold);
}

@interface L0AppDelegate : NSObject <UIApplicationDelegate> {
    BOOL histeresisExcited;
    UIAcceleration* lastAcceleration;
}

@property(retain) UIAcceleration* lastAcceleration;

@end

@implementation L0AppDelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    [UIAccelerometer sharedAccelerometer].delegate = self;
}

- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

    if (self.lastAcceleration) {
        if (!histeresisExcited && L0AccelerationIsShaking(self.lastAcceleration, acceleration, 0.7)) {
            histeresisExcited = YES;

            /* SHAKE DETECTED. DO HERE WHAT YOU WANT. */

        } else if (histeresisExcited && !L0AccelerationIsShaking(self.lastAcceleration, acceleration, 0.2)) {
            histeresisExcited = NO;
        }
    }

    self.lastAcceleration = acceleration;
}

// and proper @synthesize and -dealloc boilerplate code

@end

जब तक उपयोगकर्ता शेक को रोकता नहीं है हेटरसिस कई बार ट्रिगर करने से शेक इवेंट को रोकता है।


7
नोट I ने 3.0 के लिए एक आसान तरीका प्रस्तुत करते हुए नीचे एक उत्तर जोड़ा है।
केंडल हेल्मसटेटर गेलनर

2
यदि वे इसे किसी विशेष अक्ष पर ठीक से हिला रहे हैं तो क्या होता है?
jprete

5
सबसे अच्छा जवाब, क्योंकि शेक की शुरुआत और अंत का पता लगाने के मामले में iOS 3.0 motionBeganऔर motionEndedइवेंट बहुत सटीक या सटीक नहीं हैं। यह दृष्टिकोण आपको जितना चाहे उतना सटीक होने की अनुमति देता है।
आरोह

2
UIAccelerometerDelegate एक्सेलेरोमीटर: didAccelerate: को iOS5 में चित्रित किया गया है।
यंतो झी

यह अन्य जवाब बेहतर और त्वरित कार्यान्वयन है stackoverflow.com/a/2405692/396133
Abramodj

154

मैंने अंत में इस पूर्ववत / फिर से प्रबंधक ट्यूटोरियल से कोड उदाहरणों का उपयोग करके काम किया ।
यह वही है जो आपको करने की आवश्यकता है:

  • सेट applicationSupportsShakeToEdit एप्लिकेशन की प्रतिनिधि में संपत्ति:
  • 
        - (void)applicationDidFinishLaunching:(UIApplication *)application {
    
            application.applicationSupportsShakeToEdit = YES;
    
            [window addSubview:viewController.view];
            [window makeKeyAndVisible];
    }
    

  • Add / Override canBecomeFirstResponder , viewDidAppear: और viewWillDisappear: अपने व्यू कंट्रोलर में तरीके:
  • 
    -(BOOL)canBecomeFirstResponder {
        return YES;
    }
    
    -(void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        [self becomeFirstResponder];
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [self resignFirstResponder];
        [super viewWillDisappear:animated];
    }
    

  • अपने व्यू कंट्रोलर में मोशन विधि जोड़ें :
  • 
    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
    {
        if (motion == UIEventSubtypeMotionShake)
        {
            // your code
        }
    }
    

    एरन टैल्मर समाधान में जोड़ने के लिए: नए प्रोजेक्ट चॉसर में इस तरह के एप्लिकेशन को चुनने के मामले में आपको व्यूकंट्रोलर के बजाय एक नेविगेशन कॉन्ट्रैक्टर का उपयोग करना चाहिए।
    रोब

    मैंने इसका उपयोग करने की कोशिश की, लेकिन कभी-कभी हेवीशेक या लाइट शेक ने इसे बंद कर दिया
    vinothp

    डिफ़ॉल्ट मान के रूप में चरण 1 अब बेमानी applicationSupportsShakeToEditहै YES
    डॉनविग्न

    1
    के [self resignFirstResponder];आगे फोन क्यों [super viewWillDisappear:animated];? यह अजीब लगता है।
    जेरेडह

    94

    सबसे पहले, केंडल का 10 जुलाई का उत्तर हाजिर है।

    अब ... मैं ऐसा ही कुछ करना चाहता था (आईफोन ओएस 3.0+ में), केवल मेरे मामले में मैं इसे ऐप-वाइड करना चाहता था ताकि मैं ऐप के विभिन्न हिस्सों को हिला सकूं जब मैं शेक हुआ। यहाँ है कि मैं क्या कर समाप्त हो गया।

    सबसे पहले, मैंने UIWindow को उपवर्गित किया । यह आसान मटर है। एक इंटरफ़ेस के साथ एक नई क्लास फ़ाइल बनाएँ, जैसे MotionWindow : UIWindow(अपनी खुद की लेने के लिए बेझिझक, नैच)। इस तरह एक विधि जोड़ें:

    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
        if (event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"DeviceShaken" object:self];
        }
    }
    

    @"DeviceShaken"अपनी पसंद के नोटिफिकेशन नाम में बदलें । फ़ाइल सहेजें।

    अब, यदि आप एक MainWindow.xib (स्टॉक Xcode टेम्प्लेट सामान) का उपयोग करते हैं, तो वहां जाएं और UIWindow से MotionWindow या जो भी आप इसे कहते हैं , अपने विंडो ऑब्जेक्ट की कक्षा को बदलें । Xib को सहेजें। यदि आप UIWindow प्रोग्रामेटिक रूप से सेट करते हैं, तो इसके बजाय अपने नए विंडो क्लास का उपयोग करें।

    अब आपका ऐप विशिष्ट UIWindow वर्ग का उपयोग कर रहा है । जहाँ भी आपको शेक के बारे में बताया जाना है, उनके लिए साइन अप करें! ऐशे ही:

    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(deviceShaken) name:@"DeviceShaken" object:nil];
    

    एक पर्यवेक्षक के रूप में खुद को दूर करने के लिए:

    [[NSNotificationCenter defaultCenter] removeObserver:self];

    मैंने अपना व्यू व्यूविलेयर में रखा : और व्यूविलाडिसैपियर: जहां व्यू कंट्रोलर चिंतित हैं। सुनिश्चित करें कि शेक इवेंट में आपकी प्रतिक्रिया जानती है कि यह "पहले से प्रगति पर है" या नहीं। अन्यथा, यदि डिवाइस उत्तराधिकार में दो बार हिलाया जाता है, तो आपके पास एक लेल ट्रैफिक जाम होगा। इस तरह से आप अन्य सूचनाओं को अनदेखा कर सकते हैं जब तक कि आप वास्तव में मूल अधिसूचना का जवाब नहीं देते।

    इसके अलावा: आप से दूर संकेत के लिए चुन सकते motionBegan बनाम motionEnded । यह आप पर निर्भर करता है। मेरे मामले में, उपकरण को आराम करने के बाद हमेशा प्रभाव की आवश्यकता होती है (बनाम जब वह हिलना शुरू होता है), इसलिए मैं गतिरोध का उपयोग करता हूं । दोनों का प्रयास करें और देखें कि कौन सा अधिक समझ में आता है ... या दोनों का पता लगाने / सूचित करने के लिए!

    एक और (जिज्ञासु?) यहाँ अवलोकन: सूचना इस कोड में पहले प्रत्युत्तर प्रबंधन का कोई संकेत नहीं है। मैंने अब तक केवल टेबल व्यू कंट्रोलर्स के साथ यह कोशिश की है और सब कुछ एक साथ काफी अच्छी तरह से काम करता है! मैं हालांकि अन्य परिदृश्यों के लिए वाउच नहीं कर सकता।

    केंडल, एट। अल - क्या कोई बोल सकता है कि UIWindow उपवर्गों के लिए ऐसा क्यों हो सकता है ? क्या यह इसलिए है क्योंकि खिड़की खाद्य श्रृंखला के शीर्ष पर है?


    1
    इतना अजीब है। यह के रूप में काम करता है। उम्मीद है कि यह "खुद के बावजूद काम करने" का मामला नहीं है! कृपया मुझे बताएं कि आपको अपने परीक्षण में क्या पता है।
    जो डी 'एंड्रिया

    मैं इसे एक नियमित रूप से UIView को उप-वर्ग करना पसंद करता हूं, खासकर जब से आपको केवल एक स्थान पर मौजूद रहने की आवश्यकता होती है, इसलिए एक खिड़की उप-वर्ग में डालना एक प्राकृतिक फिट लगता है।
    झबरा मेंढक

    धन्यवाद jdandrea, मैं अपनी विधि का उपयोग करें, लेकिन कई बार मिलाते हुए !!! मैं सिर्फ यह चाहता हूं कि उपयोगकर्ता एक बार हिला सकें (एक दृश्य पर जो वहां हिल रहा है) ...! मैं इसे कैसे संभाल सकता हूं? मैं इस तरह से sth को लागू करता हूं। मैं अपने कोड smht को इस तरह से कार्यान्वित करता हूँ: i-phone.ir/forums/uploadedpictures/… ---- लेकिन समस्या यह है कि एप्लिकेशन को एप्लिकेशन के जीवन के लिए केवल 1 बार हिलाता है ! न केवल देखें
    मोमी

    1
    Momeks: यदि आपको डिवाइस के आराम (पोस्ट-शेक) पर होने के लिए अधिसूचना की आवश्यकता होती है, तो गति के बजाय गति का उपयोग करें। उसे ऐसा करना ही चाहिए!
    जो डी'एंड्रिया

    1
    @ जो डी'आंड्रिया - यह काम करता है-क्योंकि UIWindow उत्तरदाता श्रृंखला में है। यदि कुछ उच्चतर श्रृंखलाओं ने अवरोधन किया और इन घटनाओं का उपभोग किया, तो यह उन्हें प्राप्त नहीं होगा । developer.apple.com/library/ios/DOCUMENTATION/EventHandling/…
    डग डबल

    34

    मैं इस पोस्ट पर आया था एक "मिलाते हुए" कार्यान्वयन की तलाश में। सहस्राब्दी के जवाब ने मेरे लिए अच्छा काम किया, हालाँकि मैं ऐसी चीज़ की तलाश कर रहा था जिसे ट्रिगर करने के लिए थोड़ा और "हिलाने की क्रिया" की आवश्यकता हो। मैंने बूलियन मूल्य को एक इंटेक शेकाउंट के साथ बदल दिया है। मैंने ऑब्जेक्टिव-सी में L0AccelerationIsShaking () विधि को भी लागू किया। आप हिला करने के लिए जोड़ा ammount tweaking द्वारा आवश्यक मिलाते के ammount tweak कर सकते हैं। मुझे यकीन नहीं है कि मुझे अभी तक इष्टतम मूल्य मिल गए हैं, लेकिन ऐसा लगता है कि यह अभी तक अच्छी तरह से काम कर रहा है। उम्मीद है कि यह किसी की मदद करता है:

    - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
        if (self.lastAcceleration) {
            if ([self AccelerationIsShakingLast:self.lastAcceleration current:acceleration threshold:0.7] && shakeCount >= 9) {
                //Shaking here, DO stuff.
                shakeCount = 0;
            } else if ([self AccelerationIsShakingLast:self.lastAcceleration current:acceleration threshold:0.7]) {
                shakeCount = shakeCount + 5;
            }else if (![self AccelerationIsShakingLast:self.lastAcceleration current:acceleration threshold:0.2]) {
                if (shakeCount > 0) {
                    shakeCount--;
                }
            }
        }
        self.lastAcceleration = acceleration;
    }
    
    - (BOOL) AccelerationIsShakingLast:(UIAcceleration *)last current:(UIAcceleration *)current threshold:(double)threshold {
        double
        deltaX = fabs(last.x - current.x),
        deltaY = fabs(last.y - current.y),
        deltaZ = fabs(last.z - current.z);
    
        return
        (deltaX > threshold && deltaY > threshold) ||
        (deltaX > threshold && deltaZ > threshold) ||
        (deltaY > threshold && deltaZ > threshold);
    }
    

    पुनश्च: मैंने 1/15 सेकंड के अंतराल को अपडेट अंतराल निर्धारित किया है।

    [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 15)];

    मैं पैनोरमा की तरह डिवाइस के आंदोलन का पता कैसे लगा सकता हूं?
    user2526811

    यदि iPhone को केवल X दिशा में ले जाया जाए तो शेक की पहचान कैसे करें? मैं हिला नहीं पता लगाने के लिए अगर वाई या जेड दिशा में चाहते हैं।
    मंथन

    12

    आपको एक्सेलेरोमीटर के माध्यम से एक्सेलेरोमीटर की जांच करने की आवश्यकता है: didAccelerate: विधि जो UIAccelerometerDelegate प्रोटोकॉल का हिस्सा है और जांचें कि क्या मान किसी हिला के लिए आवश्यक आंदोलन की मात्रा के लिए एक सीमा से अधिक है।

    एक्सेलेरोमीटर में सभ्य नमूना कोड है: didAccelerate: GLPaint उदाहरण में AppController.m के निचले भाग में सही विधि जो iPhone डेवलपर साइट पर उपलब्ध है।


    12

    IOS 8.3 (शायद पहले) में स्विफ्ट के साथ, यह आपके व्यू कंट्रोलर में motionBeganया motionEndedविधियों को ओवरराइड करने जितना आसान है :

    class ViewController: UIViewController {
        override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent) {
            println("started shaking!")
        }
    
        override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent) {
            println("ended shaking!")
        }
    }

    क्या तुमने कोशिश की? मुझे लगता है कि यह काम करने के लिए जब एप्लिकेशन पृष्ठभूमि में है तो अतिरिक्त लेगवर्क का एक सा ले जाएगा।
    nhgrif

    नहीं .. जल्द ही .. लेकिन अगर आपने iPhone 6s पर गौर किया है तो इसमें "पिक टू वेक स्क्रीन" फीचर है, जहां डिवाइस को पिक करने पर स्क्रीन कुछ समय के लिए चमकती है। मुझे इस व्यवहार को पकड़ने की आवश्यकता है
    nr5

    9

    यह मूल प्रतिनिधि कोड है जिसकी आपको आवश्यकता है:

    #define kAccelerationThreshold      2.2
    
    #pragma mark -
    #pragma mark UIAccelerometerDelegate Methods
        - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
        {   
            if (fabsf(acceleration.x) > kAccelerationThreshold || fabsf(acceleration.y) > kAccelerationThreshold || fabsf(acceleration.z) > kAccelerationThreshold) 
                [self myShakeMethodGoesHere];   
        }

    इंटरफ़ेस में उपयुक्त कोड में भी सेट करें। अर्थात:

    @interface MyViewController: UIViewController <UIPickerViewDelegate, UIPickerViewDataSource, UIAccelerometerDelegate>


    मैं पैनोरमा की तरह डिवाइस के आंदोलन का पता कैसे लगा सकता हूं?
    user2526811

    यदि iPhone को केवल X दिशा में ले जाया जाए तो शेक की पहचान कैसे करें? मैं हिला नहीं पता लगाने के लिए अगर वाई या जेड दिशा में चाहते हैं।
    मंथन


    7

    ViewController.m फ़ाइल में निम्नलिखित तरीके जोड़ें, इसके ठीक से काम कर रहा है

        -(BOOL) canBecomeFirstResponder
        {
             /* Here, We want our view (not viewcontroller) as first responder 
             to receive shake event message  */
    
             return YES;
        }
    
        -(void) motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
        {
                if(event.subtype==UIEventSubtypeMotionShake)
                {
                        // Code at shake event
    
                        UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Motion" message:@"Phone Vibrate"delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
                        [alert show];
                        [alert release];
    
                        [self.view setBackgroundColor:[UIColor redColor]];
                 }
        }
        - (void)viewDidAppear:(BOOL)animated
        {
                 [super viewDidAppear:animated];
                 [self becomeFirstResponder];  // View as first responder 
         }

    5

    एक टिप्पणी के बजाय एक उत्तर के रूप में इसे पोस्ट करने के लिए क्षमा करें, लेकिन जैसा कि आप देख सकते हैं कि मैं ढेर अतिप्रवाह के लिए नया हूं और इसलिए मैं अभी तक टिप्पणी पोस्ट करने के लिए पर्याप्त सम्मानित नहीं हूं!

    वैसे भी जब मैं दृश्य पदानुक्रम का हिस्सा होता हूं, तो पहले उत्तरदाता की स्थिति निर्धारित करने के बारे में मैं दूसरा @cire करता हूं। इसलिए आपके विचार नियंत्रक viewDidLoadविधि में पहला उत्तरदाता स्थिति सेट करना उदाहरण के लिए काम नहीं करेगा। और यदि आप अनिश्चित हैं कि क्या यह काम कर रहा [view becomeFirstResponder]है तो आपको एक बूलियन देता है जिसे आप परीक्षण कर सकते हैं।

    एक अन्य बिंदु: यदि आप अनावश्यक रूप से एक UIView उपवर्ग बनाना नहीं चाहते हैं तो आप शेक ईवेंट को कैप्चर करने के लिए एक व्यू कंट्रोलर का उपयोग कर सकते हैं। मुझे पता है कि यह उतनी तकलीफदेह नहीं है लेकिन फिर भी विकल्प मौजूद है। कोड स्निपेट को स्थानांतरित करें, जो केंडल ने UIView उपवर्ग में आपके नियंत्रक में डाल दिया और UIView उपवर्ग के बजाय संदेश becomeFirstResponderऔर resignFirstResponderसंदेश भेजें self


    यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें।
    एलेक्स सलाउउ

    @ साशा सलौयौ मैंने स्पष्ट रूप से पहले वाक्य में कहा था कि मुझे उस समय एक टिप्पणी पोस्ट करने के लिए पर्याप्त प्रतिष्ठा नहीं थी
    न्यूटज

    माफ़ करना। यह 5-यो उत्तर के लिए समीक्षा कतार में आने के लिए यहाँ संभव है))
    एलेक्स सलाउउ

    5

    सबसे पहले, मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन यह अभी भी प्रासंगिक है, और मैंने पाया कि दो सबसे अधिक वोट किए गए उत्तरों ने जितनी जल्दी हो सके शेक का पता नहीं लगाया । यह इस तरह से करना चाहिये:

    1. लक्ष्य के निर्माण चरणों में अपनी परियोजना से CoreMotion लिंक करें: CoreMotion
    2. आपके ViewController में:

      - (BOOL)canBecomeFirstResponder {
          return YES;
      }
      
      - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
      {
          if (motion == UIEventSubtypeMotionShake) {
              // Shake detected.
          }
      }

    4

    सबसे आसान समाधान अपने आवेदन के लिए एक नई रूट विंडो प्राप्त करना है:

    @implementation OMGWindow : UIWindow
    
    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
        if (event.type == UIEventTypeMotion && motion == UIEventSubtypeMotionShake) {
            // via notification or something   
        }
    }
    @end

    फिर आपके आवेदन प्रतिनिधि में:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        self.window = [[OMGWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        //…
    }

    यदि आप एक स्टोरीबोर्ड का उपयोग कर रहे हैं, तो यह मुश्किल हो सकता है, मुझे पता नहीं है कि आपको कोड को आवेदन प्रतिनिधि की आवश्यकता होगी।


    और हाँ, आप अपने बेस क्लास को Xcode 5.@implementation
    mxcl

    यह काम करता है, मैं इसे कई ऐप में उपयोग करता हूं। तो यकीन नहीं होता कि इसे क्यों वोट दिया गया है।
    mxcl

    एक जादू की तरह काम किया। यदि आप सोच रहे हैं, तो आप विंडो क्लास को इस तरह से ओवरराइड कर सकते हैं: stackoverflow.com/a/10580083/709975
    Edu

    क्या यह काम तब होगा जब ऐप पृष्ठभूमि में होगा? अगर पृष्ठभूमि में पता लगाने के लिए कोई अन्य विचार नहीं है तो कैसे?
    nr5

    यदि आपके पास एक पृष्ठभूमि-मोड सेट है, तो यह संभवतः काम करेगा।
    15x18

    1

    बस इसे करने के लिए इन तीन तरीकों का उपयोग करें

    - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{

    विवरण के लिए आप वहां पर एक पूरा उदाहरण कोड देख सकते हैं


    1

    बहुत पहले जवाब के आधार पर एक स्विफ्टेज़ संस्करण!

    override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) {
        if ( event?.subtype == .motionShake )
        {
            print("stop shaking me!")
        }
    }

    -1

    इस एप्लिकेशन को सक्षम करने के लिए, मैंने UIWindow पर एक श्रेणी बनाई:

    @implementation UIWindow (Utils)
    
    - (BOOL)canBecomeFirstResponder
    {
        return YES;
    }
    
    - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
    {
        if (motion == UIEventSubtypeMotionShake) {
            // Do whatever you want here...
        }
    }
    
    @end
    हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
    Licensed under cc by-sa 3.0 with attribution required.