ফেসবুকের নতুন আইওএস অ্যাপ্লিকেশনটির মতো একটি পার্সউইপ মেনু বিকাশের সেরা উপায় কী?


155

প্রতিটি আইফোন অ্যাপ্লিকেশনটিতে আরও তথ্য ক্রম হয়ে যাওয়ার ফলে সাইড-সোয়াইপ মেনুগুলি একটি সাধারণ ইন্টারফেস উপাদান হয়ে উঠছে বলে মনে হয়। ফেসবুক এটিকে তাদের সর্বশেষ সংস্করণে অন্তর্ভুক্ত করেছে এবং নতুন Gmail অ্যাপ্লিকেশনটিও এটি অন্তর্ভুক্ত করে বলে মনে হচ্ছে । আমি ভাবছিলাম যে এটির আরও সাধারণ ইন্টারফেস উপাদান হয়ে উঠার কারণে এরকম কিছু বিকাশের সবচেয়ে কার্যকরী উপায় নিয়ে কারও চিন্তাভাবনা আছে কিনা। এটি কীভাবে তৈরি করা যায় সে সম্পর্কে আমার নিজের নিজস্ব ধারণাগুলি থাকা সত্ত্বেও অন্যান্য লোকেরা কী ভাবছেন তা শুনতে আমি আগ্রহী।

ফেসবুক সোয়াইপ নেভিগেশন


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

5
আপনি কার ফেসবুক প্রোফাইলটি উঁকি দিয়েছেন, নিক ও'নিল? :-p
কনস্টান্টিনো জারোহাস


1
@ জোয়েডবার্গ আমি এই বিষয়ে আরও শুনতে আগ্রহী। ব্যক্তিগতভাবে, আমি সিডেনাভ পছন্দ করি! তবে আমি একজন বিকাশকারী, ডিজাইনার নই। এই ইউএক্সকে কী দরিদ্র করে তোলে?
রবার্ট কার্ল

3
এই তথাকথিত "হ্যামবার্গার মেনুগুলি" দিয়ে অ্যাপল কী কী সমস্যাগুলি চিহ্নিত করেছে সে সম্পর্কে জানতে দয়া করে কেউ স্বজ্ঞাত ব্যবহারকারীর অভিজ্ঞতাগুলি দেখুন
ভাইকিংগুন্ডো

উত্তর:


34

আমি সম্প্রতি এটি পেরিয়ে এসেছি, কোডটি আসলে দেখিনি বা নিয়ন্ত্রণটি পরীক্ষা করে দেখিনি, তবে দেখে মনে হচ্ছে এটি খুব শালীন সূচনার পয়েন্ট হতে পারে।

jtrevealsidebar

সম্পাদনা করুন: পাঠকের অন্যান্য উত্তরগুলিও একবার দেখে নেওয়া উচিত :)


ব্যবহারকারীকে স্লাইড করতে দেয় না
ক্যানিবয়

6
আপনি যদি সোয়াইপ কার্যকারিতা সন্ধান করেন। ভিউতে একটি অঙ্গভঙ্গি শনাক্তকারী প্রবেশ করান তারপরে অঙ্গভঙ্গি শনাক্তকারীর সাথে টগল বোতামটি প্রতিস্থাপন করুন।
সিজে টিউবেন

তবে আপনি যদি সোয়াইপ করতে চান এবং টগল করতে সক্ষম হন তবে?
jsetting32

এটি বন্ধ করা হয়েছে তাই আমি অন্যত্র চলে যাই।
মাইক ফ্লাইন

84

টম অ্যাড্রিয়েনসেন দ্বারা এটির জন্য একটি দুর্দান্ত গ্রন্থাগার রয়েছে: ইনফেরিস / ভিউডেক

এটি ব্যবহার করা খুব সহজ এবং এর একটি মোটামুটি বড় অনুসরণ রয়েছে।

সম্পাদনা করুন:

আরও কিছুটা হালকা ওজনের জন্য, দেখুন: মিউচুয়ালমোবাইল / এমএমড্রেভারকন্ট্রোলার

এতে ভিউডেকের সমস্ত বৈশিষ্ট্য নেই তবে এটি পরিবর্তন এবং প্রসারিত করা সহজ।


6
আমি সবাইকে এটি ব্যবহার করার পরামর্শ দিচ্ছি।
আলমাস আদিলবেক

3
সর্বোত্তম সমাধান: নমনীয় এবং সহজেই ব্যবহারযোগ্য
হটজার্ড

2
আমি এটি চেষ্টা করে দেখেছি এবং তাদের উদাহরণগুলিতে প্রচুর বাগ খুঁজে পেয়েছি। কিছু দ্রুত ক্লিকের পরে ভিউকন্ট্রোলারদের বিভ্রান্ত করা হয়
টর্স্টেন বি

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

1
এমএমড্রাওয়ারকন্ট্রোলার খুব ভাল লাইব্রেরি। এছাড়াও এটি সর্বজনীন অ্যাপ সমর্থন করে support আইফোন এবং আইপ্যাড অ্যাপ্লিকেশন
এরহান ডেমিরসি

48

আমি এটির জন্য একটি গ্রন্থাগার তৈরি করেছি। একে এমএফএসাইডেমেনু বলা হয়

অন্যান্য জিনিসের মধ্যে এটিতে আইফোন + আইপ্যাড, প্রতিকৃতি + ল্যান্ডস্কেপ, বাম বা ডানদিকে মেনু, ইউআইটিববারকন্ট্রোলার এবং প্যানের অঙ্গভঙ্গিগুলির সমর্থন অন্তর্ভুক্ত রয়েছে।


এটি একটি দুর্দান্ত প্রকল্প .. তবে এটি ল্যান্ডস্কেপ মোডের জন্য সমর্থন করে না .. আপনিও ল্যান্ডস্কেপ মোডে এটি ব্যবহারের জন্য আমাদের একটি ইঙ্গিত দিতে পারেন .. ধন্যবাদ
সামিরা চতুরাঙ্গ

ধন্যবাদ @ সমিরাচথুরঙ্গা। আমি কিছুটা সময় পেলে ল্যান্ডস্কেপ সমর্থন যুক্ত করার আশাবাদী। শুধুমাত্র অংশ ভূদৃশ্য সমর্থন নেই SideMenuViewController হচ্ছে ... আমি বিশ্বাস করি আপনি 2nd উত্তর এখানে ভালো কিছু করতে হবে: stackoverflow.com/questions/2508630/... । কাঁটাচামচ নির্দ্বিধায় এবং রেপো অবদান!
মাইকেল ফ্রেডেরিক

এবং আমি এটি এই প্রশ্নের উত্তরটি প্রস্তাব করছি .. উপরেরটি নয় ... এটি খুব জটিল .. এটি পরিচালনা করা খুব সহজ :) যদি কেউ চান আমি কোডটি পোস্ট করতে পারি তবে কীভাবে ওরিয়েন্টেশন দিয়ে কাজ করব ..: )
সমিরা চতুরাঙ্গ

6
আগ্রহী যে কারও জন্য আমি কেবল লাইব্রেরিতে আড়াআড়ি সমর্থন যুক্ত করেছি।
মাইকেল ফ্রেডেরিক

1
@ আলমাস অ্যাডিলব্যাক, আপনি কী ব্যাখ্যা করতে পারবেন যে আপনার অ্যাপের কোন অংশগুলি পারফরম্যান্স হ্রাস পেয়েছে? আমি প্রয়োজনীয় অপ্টিমাইজেশন করতে খুশি হবে।
মাইকেল ফ্রেডেরিক

29

এমএমড্রেয়ারকন্ট্রোলার পরীক্ষা করে দেখুন:

MMDrawerController

আমাদের পছন্দ মতো একটি লাইব্রেরি আমরা খুঁজে পেলাম না, তাই আমরা কেবল আমাদের নিজস্ব রোলড।


10
কেবল এটি বলতে চেয়েছিলেন যে এটি এখানে তালিকাভুক্ত সেরা বাস্তবায়ন দ্বারা। এই থ্রেডে নতুন ব্যক্তিরা: এমএমড্রাওয়ারকন্ট্রোলার ব্যবহার করুন।
এমএক্সসিএল

সদয় কথায় প্রশংসা করুন!
কেচারউড

আমি গত এক বছর থেকে ভিউডেক ব্যবহার করছিলাম তবে আমি সম্প্রতি এমএমড্রাওয়ারকন্ট্রোলারটিতে স্যুইচ করেছি এবং আমি সবাইকে এটি ব্যবহার করার পরামর্শ দিচ্ছি। সামগ্রিক গ্রন্থাগারগুলির অন্যতম সেরা বাস্তবায়ন। ধন্যবাদ কেভিন :)
তারিক

এই এমএমড্রাওয়ারকন্ট্রোলারটি চেক করেছেন এবং বলতে চান যে এটি সাইড মেনুর জন্য সত্যিই সেরা বিকল্প। প্রশংসা!
মিচেল

এটি কি iOS8 সমর্থন করে? ধন্যবাদ
ব্র্যাড থমাস

12

কী ধারণা আপনাকে আছে সেট self.navigationController.view ফ্রেমের অথবা সেন্টার । নেই দুই ঘটনা আপনি হ্যান্ডেল করতে হবে। (1) বারবাটন আইটেম টিপুন । (2) প্যান অঙ্গভঙ্গি swiping কারণে।

আপনি এর মতো ব্যাকগ্রাউন্ডে ভিউ কন্ট্রোলার প্রেরণ করতে পারেন:

[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);
            }];
        }
    }
}

নিখুঁত এবং খুব বেশি কোড ছাড়াই কাজ করে। আপনাকে কেবল সেই সীমাটি নির্দিষ্ট করতে হবে যেখানে ব্যবহারকারী আপনার দৃষ্টি যাতে প্যান করতে পারে
মোইসস ওলমেডো

@ জানোস স্যার দয়া করে আমাকে আরও দিন
এটির

আমি আপনার উপরের
কোডটির

স্যার এটি ঠিক কাজ করে আমি এই উপরের কোডটি কেবল ব্যবহার করি। কেবলমাত্র ব্যাকগ্রাউন্ড ভিউটি দেখায় না যে আমি এটি উত্সাহিত করেছি দয়া করে আমাকে ব্যাকগ্রাউন্ড ভিউটি দেখাতে সহায়তা করুন
রাগুল

@ জোনস এবং কোডের এই লাইনটি কোথায় ব্যবহার করবেন [সেল্ফ ভিউ সেন্ডসউবভিউটোব্যাক: মেন্যুভিউকন্ট্রোলআরভিউ];
রাগুল


11

ফেসবুকের বাস্তবায়নটি ইউআইএনএভিগেশনবারে একটি ইউআইপিএনগাস্টারআর সনাক্তকারীকে রাখে। এটি যেখানে প্রয়োজন সেখানে সোয়াইপগুলি ধরার অনুমতি দেয়।

এটি এক্স / জেডে স্পর্শের দিকটি সরাসরি স্বীকৃতি দেওয়ার পাশাপাশি তারা যে গতির সাথে সংঘটিত হয়েছিল তা স্বীকার করে things

এছাড়াও ইউআইভিউউজের সাথে এই জাতীয় টিঙ্কারিংয়ের (স্ক্রিনে একাধিকরকম স্পষ্টতই বিভিন্ন কাজগুলির সাথে একাধিকবার -> এইভাবে বিভিন্ন নিয়ামক) আইওএস-এর নতুন ভিউকন্ট্রোলার-ধারণ বৈশিষ্ট্যগুলি ব্যবহার করা উচিত (আমি অবশ্যই বলতে প্ররোচিত হই) should এটি ব্যতীত প্রতিটি বাস্তবায়ন কেবল খারাপ কারণ এটি অ্যাপল নয় এমনভাবে ভিউ হায়ারার্কির সাথে টিঙ্কার করে kers

একটি বিপরীতে: আপনি যদি ফেসবুকের যতটা সম্ভব পথের কাছাকাছিভাবে এটি সম্পন্ন করতে পারেন তা সম্পর্কে যদি আপনি সত্যিই আগ্রহী হন, তবে গিথুব পিকেরিভেলকন্ট্রোলারটিতে আমি যে প্রকল্পটি খুলেছি তা পরীক্ষা করে দেখুন


ইউআইভিউ-ভিত্তিক কাস্টম ইউআই পরিচালনার ক্ষেত্রে কোনও ভুল (বা এইচআইজি অ-সম্মতিযুক্ত) নেই। নিয়ন্ত্রকের কনটেন্টটি দেখুন দেরি হয়ে গেছে, সুতরাং প্রচুর পরিমাণে অন্যান্য পদ্ধতির ব্যবহার করা হয়েছে। সম্পর্কিত সম্পর্কিত নিবন্ধ: blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers
জ্যাকব জেনিংস

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

8

আইওএস অ্যাপ্লিকেশনগুলির জন্য ফেসবুক / পাথ স্টাইলের নেভিগেশন বাস্তবায়নের জন্য বিকাশকারীরা তৈরি করেছেন এমন অনেকগুলি বিভিন্ন লাইব্রেরি রয়েছে। আমি তাদের সকলের তালিকা করতে পারি তবে আপনি যেমন সেরাটি চেয়েছিলেন, এখানে আমার দুটি পছন্দ যা সাইড সোয়াইপ নেভিগেশন মেনুটি প্রয়োগ করতে আমি ব্যবহার করি:

1) ইসিএসলাইডিংভিউ কনট্রোলার স্টোরিবোর্ডগুলি এটি প্রয়োগ এবং ব্যবহার করাও খুব সহজ। আমি এটি বাস্তবায়নে কোনও সমস্যা পাইনি বা ত্রুটি বা এর মতো কিছুও পাইনি। আমি যে লিঙ্কটি দিয়েছি তা ব্যবহার করার জন্য সমস্ত ব্যাখ্যা রয়েছে।

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


1
SWRevealViewController সবচেয়ে সহজ, এটি ব্যবহার করা কোনও বাগ ভাল কাজ করে না
विशाल ধর্মঙ্কর

7

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

সাইড-মেনু যুক্ত করা কেবলমাত্র [স্ক্রিংগো এজেন্ট স্টার্টসেশন ...] কল করে এবং সমস্ত কনফিগারেশন সাইটে করা যায়।



4

এই প্রশ্নটি বেশ জনপ্রিয় তবে এটি সবই আমার জন্য সহজ আমদানি এবং ব্যবহারের জন্য নেমে এসেছিল ... আমি যা ব্যবহার করি তা এখানে ... এসডাব্লু রিভেলকন্ট্রোলার

আমি অবাক লোকেরা এটাকে মিস করে ... সত্যিই এটি দুর্দান্ত! এবং ব্যবহার করা সহজ। বিকাশকারী এমনকি কয়েকটি উদাহরণ প্রকল্প অন্তর্ভুক্ত করে যা আপনাকে এটি বিভিন্ন পরিস্থিতিতে কীভাবে ব্যবহার করতে হয় তা দেখার অনুমতি দেয়।


3

কীভাবে আপনার নিজের স্লাইড-আউট নেভিগেশনটি সুইফ্ট এবং অবজেক্টিভ-সি তে বিকাশ করার জন্য একটি দুর্দান্ত গাইড।

উদ্দেশ্য গ

দ্রুতগতি


2

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

কমপক্ষে, আমি কীভাবে সমস্যাটির কাছে যাব। এটি কী হওয়া উচিত তা নির্ধারণ করা শক্ত। শুধু ডানদিকে লাফিয়ে পরীক্ষা শুরু করুন!


আরে কেউ আমাকে কীভাবে ফেসবুক টাইপ সোয়াইপ ভিউ এবং অ্যান্ড্রয়েডের মেনু প্যানেল তৈরি করবেন তা বলতে পারেন
নীরভ শাহ

1

আপনি যদি চান তবে আমি গিথুব জিএসএসলাইডমেনুতে এই রেপোটি করেছি এটি আপনাকে "পিছনে" ওয়েবউইউ দিয়ে একটি ফেসবুক-স্টাইল মেনু তৈরি করতে দেয় (সাধারণত যে সমস্ত রেপো আমি খুঁজে পেয়েছি তাতে "পিছনে" দৃশ্য হিসাবে একটি টেবিল ভিউ রয়েছে)।



1

ডান দিকের দৃশ্যটি ইউআইএসক্রোলভিউয়ের একটি সাবক্লাসের ভিতরে থাকতে পারে। এই সাবক্লাসে আপনি - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)eventব্যবহারকারীকে সংক্ষিপ্তসারটি স্পর্শ করলেই আপনি হ্যাঁ ফিরিয়ে দিতে ওভাররাইড করতে পারেন। এইভাবে আপনি আপনার স্বচ্ছ ইউআইএসক্রোলভিউটিকে অন্য যে কোনও দৃশ্যের উপরে রাখতে পারেন এবং সাবভিউয়ের বাইরে ঘটে যাওয়া কোনও স্পর্শ ইভেন্টের মধ্য দিয়ে যেতে পারেন; এবং আপনি বিনামূল্যে স্ক্রোল স্টাফ পেতে।

উদাহরণ স্বরূপ:

- (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:ডাকা হবে তখন পিক্সেলের সংখ্যার সূচনা বিন্দু থেকে দূরে মূল ভিউটি হওয়া উচিত এবং সেই সংখ্যাটি পদ্ধতিতে পাস করা passing এই পদ্ধতিগুলির বাস্তবায়নে, নিম্নলিখিত কোডটি চালান:

[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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.