फेसबुक के नए iOS ऐप में एक साइडस्वाइप मेनू को विकसित करने का सबसे अच्छा तरीका क्या है?


155

ऐसा प्रतीत होता है कि साइड-स्वाइप मेनू अधिक सामान्य इंटरफ़ेस तत्व बनते जा रहे हैं क्योंकि अधिक जानकारी प्रत्येक iPhone ऐप में चरमरा जाती है। फेसबुक ने इसे अपने नवीनतम संस्करण में शामिल किया है और नया जीमेल ऐप इसमें शामिल है । मैं सोच रहा था कि क्या किसी के पास इस तरह से विकसित करने के सबसे कुशल तरीके पर विचार हैं क्योंकि यह एक अधिक सामान्य इंटरफ़ेस तत्व बन रहा है। इसे बनाने के बारे में मेरे अपने विचार हैं, मैं यह सुनने के लिए उत्सुक हूं कि अन्य लोग क्या सोचते हैं।

फेसबुक स्वाइप नेविगेशन


मैंने देखा है, कि जब साइडस्वाइप मेनू सक्रिय होता है, तो आप स्वाइप आउट-व्यू भाग के साथ कुछ भी नहीं कर सकते हैं। मेरा विचार छवि में वर्तमान दृश्य को प्रस्तुत करना और इसके हिस्से को प्रदर्शित करना था, जब साइडस्वाइप सक्रिय हो जाता है
डेनिस

5
निक ओ'नील में आपने किसके फेसबुक प्रोफाइल को देखा? :
कांस्टेंटिनो त्सौराह्स


1
@Zoidberg मैं इस बारे में और अधिक सुनने के लिए इच्छुक हूं। व्यक्तिगत रूप से, मुझे सिदवां पसंद है! लेकिन मैं एक डेवलपर हूं, डिजाइनर नहीं। क्या इस UX गरीब बनाता है?
रॉबर्ट कार्ल

3
कृपया किसी को यह देखने के लिए डिजाइनिंग इंटुइक्टिव यूजर एक्सपीरियंस देखना चाहिए कि इस तथाकथित "हैमबर्गर मेनू" के साथ ऐप्पल ने किन मुद्दों की पहचान की है
vikingosegundo

जवाबों:


34

मैं हाल ही में इस पर आया था, वास्तव में कोड को नहीं देखता था या नियंत्रण का परीक्षण नहीं करता था, लेकिन ऐसा लगता है कि यह एक बहुत ही अच्छा शुरुआती बिंदु हो सकता है।

jtrevealsidebar

संपादित करें: पाठक को अन्य उत्तरों पर भी ध्यान देना चाहिए :)


उपयोगकर्ता को स्लाइड करने की अनुमति नहीं देता
cannyboy

6
यदि आप स्वाइप फंक्शनलिटी की तलाश में हैं। देखने के लिए एक जेस्चर पहचानकर्ता डालें और फिर जेस्चर पहचानकर्ता के साथ टॉगल बटन बदलें।
CJ Teuben

लेकिन क्या होगा अगर आप स्वाइप करना चाहते हैं और टॉगल कर सकते हैं?
jsetting32

यह बंद हो गया है इसलिए मैं कहीं और चला जाऊंगा।
माइक फ्लिन

84

टॉम एड्रिएनसेन द्वारा इसके लिए एक महान पुस्तकालय है: इनफेरिस / व्यूडेक

इसका उपयोग करना बहुत आसान है और इसका काफी बड़ा अनुसरण है।

संपादित करें:

कुछ और अधिक हल्के के लिए, बाहर की जाँच करें: म्युचुअल मोबाइल / MMDrawerController

इसमें ViewDeck की सभी विशेषताएं नहीं हैं, लेकिन इसे संशोधित करने और विस्तारित करने के लिए सरल है।


6
मैं हर किसी को इसका उपयोग करने की सलाह देता हूं।
अल्मास आदिलबेक

3
सबसे अच्छा समाधान: लचीला और उपयोग करने के लिए सरल
HotJard 10

2
मैंने इसकी कोशिश की और उनके उदाहरण में बहुत सारे कीड़े पाए। कुछ तेज़ क्लिकों के बाद व्यूकंट्रोलर्स को गलत संदेश दिया जाता है
टॉरस्टोन B

13
हमने इसे कई ऐप्स के लिए उपयोग किया है, लेकिन इसे बनाए रखना और नई सुविधाओं को जोड़ना बहुत मुश्किल था। इसे बहुत ज्यादा लागू करने की कोशिश से भी नुकसान उठाना पड़ा है। हमने अपना खुद का नाम MMDrawerController लिखने का फैसला किया। लाइट-वेट, और केंद्रित: github.com/mutualmobile/MMDrawerController
kcharwood

1
MMDrawerController बहुत अच्छा पुस्तकालय है। इसके अलावा यह सार्वभौमिक एप्लिकेशन का समर्थन करता है। iPhone और आईपैड ऐप्स
एरहान डेमिरसी

48

मैंने इसके लिए एक लाइब्रेरी बनाई। इसे MFSideMenu कहा जाता है ।

अन्य बातों के अलावा इसमें iphone + ipad, पोर्ट्रेट + लैंडस्केप, बाईं या दाईं ओर मेनू, UITabBarController और पैन जेस्चर के लिए समर्थन शामिल है।


यह एक महान परियोजना है .. लेकिन इसका परिदृश्य परिदृश्य के लिए समर्थन नहीं है .. क्या आप हमें इसे परिदृश्य मोड में भी उपयोग करने का संकेत दे सकते हैं .. धन्यवाद
समीरा चतुरंगा

धन्यवाद @SameeraChathuranga अगर मुझे कुछ समय मिलता है तो मुझे लैंडस्केप सपोर्ट जोड़ने की उम्मीद है। एकमात्र हिस्सा जिसमें लैंडस्केप सपोर्ट नहीं है, वह है साइडमेनु व्यूकंट्रोलर ... मेरा मानना ​​है कि आपको यहां 2 उत्तर जैसा कुछ करना होगा: stackoverflow.com/questions/2508630/… । कांटा के लिए स्वतंत्र महसूस करें और रेपो में योगदान दें!
माइकल फ्रेडरिक

और मेरा सुझाव है कि इस प्रश्न का उत्तर है .. ऊपर वाला नहीं .. इसका बहुत जटिल .. यह संभालना बहुत आसान है :) यदि कोई चाहता है कि मैं कोड पोस्ट करूं, तो कैसे काम करूं? )
समीरा चतुरंगा

6
रुचि रखने वाले किसी भी व्यक्ति के लिए, मैंने सिर्फ लाइब्रेरी में लैंडस्केप सपोर्ट जोड़ा है।
माइकल फ्रेडरिक

1
@AlmasAdilbek, क्या आप बता सकते हैं कि आपके ऐप के किन हिस्सों में प्रदर्शन में कमी आई है? मुझे कोई आवश्यक अनुकूलन करने में खुशी होगी।
माइकल फ्रेडरिक

29

MMDrawerController देखें:

MMDrawerController

हमें एक लाइब्रेरी नहीं मिली जो हमें पसंद थी, इसलिए हमने सिर्फ अपना रोल किया।


10
बस यह कहना चाहता था कि यह यहाँ सूचीबद्ध सबसे अच्छा कार्यान्वयन है। इस थ्रेड के लिए नए लोग: MMDrawerController का उपयोग करें।
mxcl

दयालु शब्दों की सराहना करें!
kcharwood

मैं पिछले एक साल से ViewDeck का उपयोग कर रहा था लेकिन मैंने हाल ही में MMDrawerController पर स्विच किया और मैं हर किसी को इसका उपयोग करने की सलाह देता हूं। समग्र पुस्तकालयों में सर्वश्रेष्ठ कार्यान्वयन में से एक। धन्यवाद केविन :)
तारिक

इस MMDrawerController की जाँच की और कहना चाहता हूँ कि यह वास्तव में साइड मेनू के लिए सबसे अच्छा विकल्प है। की सराहना की! @Michael Frederick
Resty

क्या यह iOS8 का समर्थन करता है? धन्यवाद
ब्रैड थॉमस

12

कुंजी विचार आप के लिए है कि सेट self.navigationController.view के फ्रेम या केंद्र । नहीं है दो घटना आप को संभालने के लिए है। (1) barButtonItem प्रेस । (२) स्वाइप के कारण पैन जेस्चर

आप इस तरह पृष्ठभूमि के लिए दृश्य नियंत्रक भेज सकते हैं:

[self.view sendSubviewToBack:menuViewController.view];

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(buttonPressed:)];
    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
    [self.navigationController.view addGestureRecognizer:panGestureRecognizer];
    self.navigationItem.leftBarButtonItem = barButtonItem;
}

- (void)buttonPressed:(id)sender {

    CGRect destination = self.navigationController.view.frame;

    if (destination.origin.x > 0) {
        destination.origin.x = 0;
    } else {
        destination.origin.x = 320;
    }

    [UIView animateWithDuration:0.25 animations:^{
        self.navigationController.view.frame = destination;
    }];
}

- (void)handlePan:(UIPanGestureRecognizer *)recognizer
{
    static CGPoint originalCenter;

    if (recognizer.state == UIGestureRecognizerStateBegan)
    {
        originalCenter = recognizer.view.center;

    } else if (recognizer.state == UIGestureRecognizerStateChanged)
    {
        CGPoint translation = [recognizer translationInView:self.view];

        recognizer.view.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y);
    }
    else if (recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateCancelled || recognizer.state == UIGestureRecognizerStateFailed)
    {
        if (recognizer.view.frame.origin.x < 160) {
            [UIView animateWithDuration:0.25 animations:^{
                recognizer.view.center = CGPointMake(384, 487.5);
            }];
        } else {
            [UIView animateWithDuration:0.25 animations:^{
                recognizer.view.center = CGPointMake(384 + 320, 487.5);
            }];
        }
    }
}

एकदम सही और बहुत अधिक कोड के बिना काम करता है। आपको केवल उन सीमाओं को निर्दिष्ट करने की आवश्यकता है जहां उपयोगकर्ता आपके विचार को देख सकता है
Moisés Olmedo

@ जानोस सर कृपया अधिक दिनों तक इसमें मेरी मदद करें
रागुल

मैंने आपके उपरोक्त कोड की मदद से साइड आउट मेनू बनाया है, जब पीछे की तरफ स्लाइडआउट केवल गहरे रंग को दिखाता है न कि कृपया कृपया मेरी मदद करें
रगुल

सर यह ठीक काम करता है मैं इस उपरोक्त कोड का उपयोग करता हूं। केवल एक चीज यह है कि पृष्ठभूमि को देखने से पता चलता है कि मैंने इसे अपडाउन कर दिया है कृपया पृष्ठभूमि दृश्य दिखाने में मेरी मदद करें
रागुल

@ János और कोड की इस लाइन का उपयोग करने के लिए [self.view sendSubviewToBack: menuViewController.view];
रागुल


11

फेसबुक का कार्यान्वयन UIPANGestureRecognizer को UINavigationBar पर रखता है। इस प्रकार जहां जरूरत है वहां स्वाइप को पकड़ने की अनुमति है।

यह उन चीजों को करने की अनुमति देता है, जैसे कि x / z में स्पर्श दिशा को सीधे पहचानने के साथ-साथ उनके द्वारा होने वाली गति।

इसके अलावा इस तरह के टिंचर यूआईवाईवाई के साथ हैं (एक समय में स्क्रीन पर एक से अधिक स्पष्ट रूप से अलग-अलग कार्यों के साथ -> इस प्रकार अलग-अलग नियंत्रक) (मुझे यह कहने के लिए मोहक होना चाहिए) iOS नए ViewController- कंटेनर सुविधाओं का उपयोग करें। इसके बिना हर कार्यान्वयन बस बुरा है क्योंकि यह एप्पल द्वारा इरादा नहीं है एक तरह से दृश्य पदानुक्रम के साथ छेड़छाड़ करता है।

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


UIView- आधारित कस्टम UI को प्रबंधित करने में कुछ भी गलत (या HIG गैर-अनुपालन) नहीं है। देखें नियंत्रक नियंत्रण बहुत देर से आया, इसलिए बहुत सारे अन्य तरीकों का उपयोग किया गया है। एक संबंधित लेख: blog.carbonfive.com/2011/03/09/abuse-uiviewcontrollers
याकूब जेनिंग्स 20

1
लंबे समय तक प्रमुख विकास iOS 5 के न्यूनतम संस्करण को लक्षित नहीं करेंगे, क्योंकि बड़ी संख्या में उपयोगकर्ता बहुत लंबे समय तक अपग्रेड नहीं करेंगे। जबकि उनमें से कई 'हैक्स' हैं जैसा कि आप कहते हैं, यह निश्चित रूप से सही ढंग से किया जा सकता है। चौखटे के भीतर रहना निश्चित रूप से एक सुरक्षित शर्त है, लेकिन कभी-कभी एक अद्वितीय और कस्टम UI को अधिक की आवश्यकता होती है।
याकूब जेनिंग्स

8

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

1) ECSlidingViewController स्टोरीबोर्ड को भी लागू करना और उपयोग करना बहुत आसान है। मेरे पास इसे लागू करने में कोई समस्या नहीं है और न ही कोई त्रुटि या ऐसा कुछ भी प्राप्त हुआ है। मेरे द्वारा दी गई लिंक का उपयोग करने के लिए बहुत सारी व्याख्या है।

2) SWRevealViewController इस पुस्तकालय का उपयोग करना आसान है और आप यहां एक ट्यूटोरियल पा सकते हैं , जो दिखाता है कि छवियों के साथ-साथ सभी विवरणों के साथ इसे कैसे लागू किया जाए। आप बस ट्यूटोरियल का अनुसरण कर सकते हैं और बाद में मुझे धन्यवाद दे सकते हैं।


1
SWRevealViewController सबसे सरल एक है, इसका इस्तेमाल कोई बग अच्छा काम नहीं करता है
visharan dharankar

7

एक अन्य विकल्प स्क्रिंगो का उपयोग करना है । यह आपको youtube / facebook ऐप्स की तरह एक साइड-मेनू देता है, और सभी तरह के बिल्ट-इन फीचर्स भी देता है, जिसे आप जोड़ना चुन सकते हैं (जैसे चैट, दोस्तों को आमंत्रित करना, आदि ...)

साइड-मेन्यू को जोड़ना [स्क्रींगऑनएज स्टार्ट सेशन ...] कहकर और सभी कॉन्फ़िगरेशन साइट पर किया जा सकता है।



4

यह सवाल काफी लोकप्रिय है, लेकिन यह सब मेरे लिए आसान आयात और उपयोग करने के लिए नीचे आया था ... यहाँ मैं क्या उपयोग करता हूं ... SWRevealController

मुझे आश्चर्य है कि लोग इसे याद करते हैं ... यह वास्तव में महान है !!! और प्रयोग करने में आसान। डेवलपर में कुछ उदाहरण परियोजनाएं भी शामिल हैं जो आपको यह देखने की अनुमति देती हैं कि विभिन्न परिदृश्यों में इसका उपयोग कैसे किया जाए।


3

स्विफ्ट और ऑब्जेक्टिव-सी में अपने स्वयं के स्लाइड-आउट-नेविगेशन को कैसे विकसित किया जाए, इसका एक उत्कृष्ट मार्गदर्शक।

उद्देश्य सी

तीव्र


2

जीमेल और फेसबुक दोनों वेब व्यू का भारी उपयोग करते हैं, इसलिए यह कहना मुश्किल है कि मूल कोड क्या है और HTML क्या है। हालाँकि, इंटरफ़ेस को देखने पर, ऐसा लगता है कि उन्होंने UIVableView को स्क्रीन की चौड़ाई (320pt) से कम चौड़ाई के साथ रखा है, जिसमें एक UIView है, जिसमें वह सामग्री है जिसे वे प्रदर्शित करना चाहते हैं। अलग-अलग टेबलव्यू पंक्तियों का चयन करने से संभवतः सामग्री दृश्य का एक सबव्यू समाप्त हो जाता है।

कम से कम, इस तरह से मैं इस समस्या से संपर्क करूँगा। यह तय करना कठिन है कि यह क्या होना चाहिए। बस सही में कूदें और प्रयोग करना शुरू करें!


हे, क्या कोई मुझे बता सकता है कि फेसबुक टाइप स्वाइप व्यू और एंड्रॉइड में मेनू पैनल कैसे बनाया
जाए

1

यदि आप चाहते हैं कि मैंने इस रेपो को github GSSlideMenu पर किया तो यह आपको "बैक" वेबव्यू के साथ एक फेसबुक-स्टाइल मेनू BUT बनाने की अनुमति देता है (आम तौर पर मेरे द्वारा पाया गया सभी रिपोज "बैक" व्यू के रूप में एक टेबल व्यू है)।



1

दाईं ओर का दृश्य UIScrollView के एक उपवर्ग के अंदर हो सकता है। इस उपवर्ग में आप - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)eventकेवल यस को वापस करने के लिए ओवरराइड कर सकते हैं यदि उपयोगकर्ता उपविभाजक को छूता है। इस तरह से आप अपने पारदर्शी UIScrollView को किसी भी अन्य दृश्य पर रख सकते हैं और किसी भी स्पर्श घटना से गुजर सकते हैं जो सबव्यू के बाहर होता है; और आपको मुफ्त में स्क्रॉल सामान मिलेगा।

उदाहरण के लिए:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
    CGPoint location=[self convertPoint:point toView:subview];
    return (location.x > 0 && 
            location.x < subview.frame.size.width && 
            location.y > 0 && 
            location.y < subview.frame.size.height);
}

या:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
    return [subview pointInside:
             [self convertPoint:point toView:subview] withEvent:event];

1

मुख्य दृश्य के नीचे अपना मेनू जोड़ने की कोशिश करें (जिसे आप प्राप्त करने के लिए स्वाइप करें)। दृश्य में घटनाओं को छूने के लिए सदस्यता लेना शुरू करें।

लागू करें touchesMoved:, और यह देखने के लिए जांचें कि क्या पहले gestureलंबवत है (मुख्य दृश्य स्क्रॉल करें, यदि आवश्यक हो), या क्षैतिज (यहां आप मेनू दिखाना चाहते हैं)। यदि यह क्षैतिज है, तो दूसरी विधि को लागू करना शुरू करें - (void)scrollAwayMainView:(NSUInteger)pixels, जब भी touchesMoved:कहा जाता है, प्रारंभ बिंदु से दूर पिक्सल की संख्या की गणना मुख्य दृश्य होना चाहिए, और उस संख्या को विधि में पास करना चाहिए। उस तरीके के कार्यान्वयन में, निम्न कोड चलाएँ:

[mainView scrollRectToVisible:CGRectMake:(pixels, 
                                          mainView.origin.y, 
                                          mainView.size.width, 
                                          mainView.size.height];

0

इस प्रश्न के लिए मेरा समाधान देखें:

तीसरी पार्टी लाइब्रेरी के बिना कस्टम स्लाइड मेनू कैसे बनाएं।?

एक एकल वर्ग जिसे आपको केवल सामग्री के साथ उप-वर्ग और भरने की आवश्यकता है।

यहाँ वर्ग है। अधिक जानकारी के लिए, उपरोक्त लिंक देखें।

#import <UIKit/UIKit.h>

@interface IS_SlideMenu_View : UIView <UIGestureRecognizerDelegate>
{
    UIView* transparentBgView;
    BOOL hidden;
    int lastOrientation;
}

@property (strong, nonatomic) UIView *menuContainerV;

+ (id)sharedInstance;

- (BOOL)isShown;
- (void)hideSlideMenu;
- (void)showSlideMenu;

@end


#import "IS_SlideMenu_View.h"

@implementation IS_SlideMenu_View

+ (id)sharedInstance
{
    static id _sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[[self class] alloc] init];
    });

    return _sharedInstance;
}

- (instancetype)initWithFrame:(CGRect)frame
{
    frame = [[[UIApplication sharedApplication] delegate] window].frame;
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];

        transparentBgView = [[UIView alloc] initWithFrame:frame];
        [transparentBgView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.6]];
        [transparentBgView setAlpha:0];
        transparentBgView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRecognized:)];
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRecognized:)];
        [transparentBgView addGestureRecognizer:tap];
        [transparentBgView addGestureRecognizer:pan];

        [self addSubview:transparentBgView];

        frame.size.width = 280;
        self.menuContainerV = [[UIView alloc] initWithFrame:frame];
        CALayer *l = self.menuContainerV.layer;
        l.shadowColor = [UIColor blackColor].CGColor;
        l.shadowOffset = CGSizeMake(10, 0);
        l.shadowOpacity = 1;
        l.masksToBounds = NO;
        l.shadowRadius = 10;
        self.menuContainerV.autoresizingMask = UIViewAutoresizingFlexibleHeight;

        [self addSubview: self.menuContainerV];
        hidden = YES;
    }

    //----- SETUP DEVICE ORIENTATION CHANGE NOTIFICATION -----
    UIDevice *device = [UIDevice currentDevice];
    [device beginGeneratingDeviceOrientationNotifications];
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:device];

    lastOrientation = [[UIDevice currentDevice] orientation];

    return self;
}

//********** ORIENTATION CHANGED **********
- (void)orientationChanged:(NSNotification *)note
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];    
    if(orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight){
        NSLog(@"%ld",orientation);
        if(!hidden && lastOrientation != orientation){
            [self hideSlideMenu];
            hidden = YES;
            lastOrientation = orientation;
        }
    }
}

- (void)showSlideMenu {
    UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
    self.frame = CGRectMake(0, 0, window.frame.size.width, window.frame.size.height);

    [self.menuContainerV setTransform:CGAffineTransformMakeTranslation(-window.frame.size.width, 0)];

    [window addSubview:self];
//    [[UIApplication sharedApplication] setStatusBarHidden:YES];

    [UIView animateWithDuration:0.5 animations:^{
        [self.menuContainerV setTransform:CGAffineTransformIdentity];
        [transparentBgView setAlpha:1];
    } completion:^(BOOL finished) {
        NSLog(@"Show complete!");
        hidden = NO;
    }];
}

- (void)gestureRecognized:(UIGestureRecognizer *)recognizer
{
    if ([recognizer isKindOfClass:[UITapGestureRecognizer class]]) {
        [self hideSlideMenu];
    } else if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        static CGFloat startX;
        if (recognizer.state == UIGestureRecognizerStateBegan) {
            startX = [recognizer locationInView:self.window].x;
        } else
        if (recognizer.state == UIGestureRecognizerStateChanged) {
            CGFloat touchLocX = [recognizer locationInView:self.window].x;
            if (touchLocX < startX) {
                [self.menuContainerV setTransform:CGAffineTransformMakeTranslation(touchLocX - startX, 0)];
            }
        } else
        if (recognizer.state == UIGestureRecognizerStateEnded) {
            [self hideSlideMenu];
        }
    }
}

- (void)hideSlideMenu
{
    UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
    window.backgroundColor = [UIColor clearColor];
    [UIView animateWithDuration:0.5 animations:^{
        [self.menuContainerV setTransform:CGAffineTransformMakeTranslation(-self.window.frame.size.width, 0)];
        [transparentBgView setAlpha:0];
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
        [self.menuContainerV setTransform:CGAffineTransformIdentity];

//        [[UIApplication sharedApplication] setStatusBarHidden:NO];
        hidden = YES;
        NSLog(@"Hide complete!");
    }];
}

- (BOOL)isShown
{
    return !hidden;
}

@end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.