วิธีที่ดีที่สุดในการพัฒนาเมนูด้านข้างแบบเดียวกับในแอพ iOS ใหม่ของ Facebook คืออะไร


155

ดูเหมือนว่าเมนูด้านข้างจะกลายเป็นองค์ประกอบส่วนต่อประสานที่ใช้กันทั่วไปมากขึ้นเนื่องจากข้อมูลเพิ่มเติมได้รับการยัดเยียดในแต่ละแอพของ iPhone Facebook ได้รวมไว้ในรุ่นใหม่ล่าสุดของพวกเขาและแอป Gmail ใหม่จะปรากฏขึ้นที่จะรวมไว้เป็นอย่างดี ฉันสงสัยว่าถ้าใครมีความคิดเกี่ยวกับวิธีที่มีประสิทธิภาพมากที่สุดในการพัฒนาสิ่งนี้เพราะมันกลายเป็นองค์ประกอบส่วนต่อประสานที่ใช้กันทั่วไปมากขึ้น ในขณะที่ฉันมีความคิดของตัวเองเกี่ยวกับวิธีการสร้างสิ่งนี้ฉันอยากรู้อยากเห็นว่าคนอื่นคิดอย่างไร

เลื่อนการนำทาง Facebook


ฉันสังเกตเห็นว่าเมื่อเมนูด้านข้างถูกเปิดใช้งานคุณไม่สามารถทำอะไรกับการกวาดนิ้วออกบางส่วนของมุมมอง ความคิดของผมคือการทำให้มุมมองปัจจุบันในภาพและการแสดงบางส่วนของมันเมื่อคลำถูกเปิดใช้งาน
เดนิส

5
โปรไฟล์ Facebook ของคุณที่คุณมองใครคือ Nick O'Neill? :-p
Constantino Tsarouhas

1
เป็นไปได้ที่ซ้ำกันของSplitView แต่บน iPhone
JosephH

1
@ Zoidberg ฉันสนใจที่จะได้ยินเพิ่มเติมเกี่ยวกับเรื่องนี้ ส่วนตัวฉันชอบ sidenav! แต่ฉันเป็นนักพัฒนาไม่ใช่นักออกแบบ อะไรทำให้ UX นี้แย่
Robert Karl

3
ได้โปรดรับชมการออกแบบประสบการณ์ผู้ใช้ที่เข้าใจง่ายเพื่อเรียนรู้เกี่ยวกับปัญหาที่แอปเปิลระบุด้วย "เมนูแฮมเบอร์เกอร์" นี้
vikingosegundo

คำตอบ:


34

ฉันเพิ่งเจอสิ่งนี้ไม่ได้ดูรหัสหรือทดสอบการควบคุม แต่ดูเหมือนว่ามันอาจเป็นจุดเริ่มต้นที่ดีมาก

jtrevealsidebar

แก้ไข: ผู้อ่านควรดูคำตอบอื่น ๆ ด้วย :)


ไม่อนุญาตให้ผู้ใช้เลื่อน
cannyboy

6
หากคุณกำลังมองหาฟังก์ชั่นการปัดนิ้ว แทรกตัวรู้จำท่าทางลงในมุมมองจากนั้นแทนที่ปุ่มสลับด้วยตัวรู้จำท่าทาง
CJ Teuben

แต่ถ้าคุณต้องการปัดและสามารถสลับได้ล่ะ?
jsetting32

สิ่งนี้ถูกยกเลิกดังนั้นฉันจะย้ายไปที่อื่น
Mike Flynn

84

มีห้องสมุดที่ยอดเยี่ยมสำหรับสิ่งนี้โดย Tom Adriaenssen: Inferis / ViewDeck

มันใช้งานง่ายมากและมีขนาดใหญ่พอสมควร

แก้ไข:

สำหรับบางสิ่งที่มีน้ำหนักเบากว่าเล็กน้อยลองดู: mutualmobile / MMDrawerController

มันไม่ได้มีคุณสมบัติทั้งหมดของ ViewDeck แต่ง่ายต่อการแก้ไขและขยาย


6
ฉันแนะนำให้ทุกคนใช้สิ่งนี้
Almas Adilbek

3
ทางออกที่ดีที่สุด: ยืดหยุ่นและใช้งานง่าย
HotJard

2
ฉันลองและพบข้อบกพร่องมากมายในตัวอย่างของพวกเขา หลังจากคลิกอย่างรวดเร็วบางครั้งตัวควบคุมการดูจะไม่ถูกต้อง
Torsten B

13
เราใช้มันกับหลาย ๆ แอป แต่มันยากมากที่จะดูแลและเพิ่มคุณสมบัติใหม่ ๆ นอกจากนี้ยังได้รับความเดือดร้อนจากการพยายามใช้งานมากเกินไป เราตัดสินใจเขียน MMDrawerController ของเราเอง น้ำหนักเบาและมุ่งเน้น: github.com/mutualmobile/MMDrawerController
kcharwood

1
MMDrawerController เป็นห้องสมุดที่ดีมากนอกจากนี้ยังรองรับแอพสากล แอพสำหรับ iPhone และ iPad
Erhan Demirci

48

ฉันสร้างห้องสมุดสำหรับสิ่งนี้ มันถูกเรียกว่าMFSideMenu

เหนือสิ่งอื่นใดมันยังรองรับ iphone + ipad, แนวตั้ง + แนวนอน, เมนูทางด้านซ้ายหรือขวา, UITabBarController และการเลื่อนนิ้ว


มันเป็นโครงการที่ยอดเยี่ยม .. แต่มันก็ไม่รองรับโหมดแนวนอน .. ขอให้เราใช้คำแนะนำในโหมดแนวนอนด้วยได้ไหมขอบคุณ
Sameera Chathuranga

ขอบคุณ @SameeraChathuranga ฉันหวังว่าจะเพิ่มการสนับสนุนแนวนอนหากฉันมีเวลา เฉพาะส่วนที่ไม่ได้มีการสนับสนุนภูมิทัศน์เป็น SideMenuViewController ... ฉันเชื่อว่าคุณจะต้องทำสิ่งที่ต้องการคำตอบที่ 2 ที่นี่: stackoverflow.com/questions/2508630/... รู้สึกอิสระที่จะแยกและมีส่วนร่วมในการซื้อคืน!
Michael Frederick

และฉันขอแนะนำว่านี่คือคำตอบสำหรับคำถามนี้ .. ไม่ใช่ข้อใดข้อหนึ่งข้างต้น .. มันซับซ้อนเกินไป .. นี่เป็นเรื่องง่ายมากที่จะจัดการ :) ถ้ามีใครต้องการให้ฉันสามารถโพสต์โค้ดวิธีการทำงานกับ oriantation .. : )
Sameera Chathuranga

6
สำหรับผู้ที่สนใจฉันเพิ่งเพิ่มการสนับสนุนแนวนอนให้กับห้องสมุด
Michael Frederick

1
@AlmasAdilbek คุณสามารถอธิบายได้ว่าส่วนใดของแอปของคุณมีประสิทธิภาพลดลง? ฉันยินดีที่จะเพิ่มประสิทธิภาพที่จำเป็น
Michael Frederick

29

ตรวจสอบ MMDrawerController:

MMDrawerController

เราหาห้องสมุดที่เราชอบไม่ได้เราก็เลยกลิ้งหนังสือของเราเอง


10
แค่อยากจะบอกว่านี่คือการปฏิบัติที่ดีที่สุดที่นี่โดย BY FAR ผู้ใช้ใหม่ในหัวข้อนี้: ใช้ MMDrawerController
mxcl

ขอบคุณคำพูดที่ใจดี!
kcharwood

ฉันใช้ ViewDeck เมื่อหนึ่งปีที่ผ่านมา แต่เมื่อเร็ว ๆ นี้ฉันได้เปลี่ยนไปใช้ MMDrawerController และฉันแนะนำให้ทุกคนใช้สิ่งนี้ หนึ่งในการนำไปใช้ที่ดีที่สุดในห้องสมุดโดยรวม ขอบคุณเควิน :)
ทาริค

ตรวจสอบ MMDrawerController นี้และต้องการบอกว่ามันเป็นตัวเลือกที่ดีที่สุดสำหรับเมนูด้านข้าง ชื่นชม! ใหญ่ขอบคุณ
@Michael

สิ่งนี้รองรับ iOS8 หรือไม่? ขอบคุณ
Brad Thomas

12

คิดที่สำคัญที่คุณต้องกำหนดกรอบ self.navigationController.view หรือศูนย์ มีสองเหตุการณ์ที่คุณต้องจัดการ (1) barButtonItem กด (2) การแพนด้วยท่าทางเนื่องจากการปัด

คุณสามารถส่งตัวควบคุมมุมมองไปที่พื้นหลังดังนี้:

[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

@ Janos ท่านกรุณาช่วยฉันขาดนี้อีกหลายวัน
Ragul

ผมได้สร้างด้านข้างออกเมนูด้วยความช่วยเหลือของโค้ดข้างต้นของคุณเมื่อเลื่อนออกกลับแสดงให้เห็นด้านข้างเพียงสีเข้มไม่ได้เป็นมุมมองความช่วยเหลือกรุณาฉัน
Ragul

เซอร์ใช้งานได้ดีฉันใช้โค้ดด้านบนนี้เท่านั้น สิ่งเดียวที่เป็นมุมมองพื้นหลังไม่ได้แสดงให้เห็นว่าฉันได้ยกมันขึ้นมาโปรดช่วยฉันในการแสดงมุมมองพื้นหลัง
Ragul

@ Jánosและสถานที่ที่จะใช้รหัสบรรทัดนี้ [self.view sendSubviewToBack: menuViewController.view];
Ragul


11

การใช้งานของ Facebook วาง UIPanGestureRecognizer บน UINavigationBar จึงอนุญาตให้จับ swipes ตามที่ต้องการ

ที่ช่วยให้ทำสิ่งต่าง ๆ เช่นจดจำทิศทางการสัมผัสใน x / z โดยตรงรวมถึงความเร็วที่เกิดขึ้นด้วย

เช่นเดียวกับการซ่อมด้วย UIViews (มากกว่าหนึ่งบนหน้าจอในเวลาที่มีงานที่แตกต่างอย่างเห็นได้ชัด -> ตัวควบคุมที่แตกต่างกันดังนั้น> ควรควบคุม (ฉันอยากจะบอกว่าต้อง) ใช้คุณลักษณะ ViewController-Containment iOS ใหม่ การติดตั้งทุกครั้งที่ไม่มีสิ่งนั้นจะไม่ดีอย่างที่คิดเพราะลำดับชั้นของมุมมองในแบบที่ Apple ไม่ได้ตั้งใจ

เมื่อวันที่ sidenote: ถ้าคุณจริงๆอยากรู้อยากเห็นเกี่ยวกับวิธีการที่จะสามารถทำได้ใกล้เคียงกับวิธีการของ Facebook ที่เป็นไปได้ให้ตรวจสอบโครงการที่ผมเปิดมาบน Github PKRevealController


ไม่มีอะไรผิดปกติ (หรือ HIG ไม่สอดคล้อง) กับการจัดการ UI แบบกำหนดเองที่ใช้ UIView การ จำกัด การดูคอนโทรลเลอร์นั้นช้าเกินไปดังนั้นจึงมีการใช้วิธีการอื่นมากมาย บทความที่เกี่ยวข้อง: blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers
Jacob Jennings

1
การพัฒนาที่สำคัญไม่ได้กำหนดเป้าหมายเวอร์ชันขั้นต่ำของ iOS 5 เป็นเวลานานเนื่องจากผู้ใช้จำนวนมากจะไม่อัปเกรดเป็นเวลานาน ในขณะที่พวกเขาหลายคน 'แฮ็ค' ตามที่คุณพูดแน่นอนสามารถทำได้อย่างถูกต้อง การอยู่ภายในกรอบเป็นการเดิมพันที่ปลอดภัย แต่บางครั้ง UI ที่ไม่ซ้ำใครและกำหนดเองนั้นต้องการมากกว่า
Jacob Jennings

8

มีไลบรารีที่แตกต่างกันหลายสิบไลบรารีที่นักพัฒนาสร้างขึ้นเพื่อใช้การนำทางสไตล์ Facebook / Path สำหรับแอพ iOS ฉันสามารถแสดงรายการทั้งหมด แต่ตามที่คุณขอให้ดีที่สุดนี่คือสองทางเลือกของฉันที่ฉันใช้ในการใช้งานเมนูการนำทางด้านข้าง:

1) ECSlidingViewController มันง่ายมากที่จะใช้และใช้กระดานเรื่องราวด้วย ฉันไม่ได้มีปัญหาในการใช้งานและไม่ได้รับข้อผิดพลาดหรืออะไรทำนองนั้น ลิงก์ที่ฉันให้ไว้มีคำอธิบายทั้งหมดเพื่อใช้งาน

2) SWRevealViewController ห้องสมุดนี้ใช้งานง่ายและคุณสามารถค้นหาบทช่วยสอนที่นี่ซึ่งแสดงวิธีใช้งานพร้อมคำอธิบายทั้งหมดพร้อมรูปภาพ คุณสามารถติดตามการสอนและขอขอบคุณในภายหลัง


1
SWRevealViewController เป็นหนึ่งในที่ง่ายใช้มันไม่มีข้อบกพร่องการทำงานที่ดี
vishal dharankar

7

อีกตัวเลือกหนึ่งคือการใช้Scringo มันให้เมนูด้านข้างเช่นเดียวกับใน youtube / facebook apps และยังมีคุณสมบัติในตัวในเมนูที่คุณสามารถเลือกที่จะเพิ่ม (เช่นแชทชวนเพื่อน ฯลฯ )

การเพิ่มเมนูด้านข้างเป็นเพียงแค่เรียก [ScringoAgent startSession ... ] และการกำหนดค่าทั้งหมดสามารถทำได้บนเว็บไซต์



4

คำถามนี้เป็นที่นิยมมาก แต่ทั้งหมดลงมาเพื่อง่ายต่อการนำเข้าและการใช้งานสำหรับฉัน ... นี่คือสิ่งที่ผมใช้ ... SWRevealController

ฉันประหลาดใจที่ผู้คนคิดถึงมัน ... มันยอดเยี่ยมจริงๆ !!! และใช้งานง่าย นักพัฒนายังมีตัวอย่างโครงการที่ให้คุณดูวิธีใช้ในสถานการณ์ต่าง ๆ



2

ทั้ง Gmail และ Facebook ใช้ประโยชน์จากมุมมองเว็บอย่างหนักดังนั้นจึงยากที่จะบอกว่าโค้ดเนทีฟและ HTML ที่แสดงผลเป็นอย่างไร อย่างไรก็ตามเมื่อดูที่อินเทอร์เฟซดูเหมือนว่าวาง UITableView ด้วยความกว้างที่แคบกว่าความกว้างของหน้าจอ (320pt) ใต้ UIView ที่มีเนื้อหาที่ต้องการแสดง การเลือกแถวมุมมองตารางที่แตกต่างกันอาจสลับมุมมองย่อยของมุมมองเนื้อหา

อย่างน้อยนั่นเป็นวิธีที่ฉันจะแก้ไขปัญหา มันยากที่จะกำหนดว่าควรจะเป็นอะไร เพียงกระโดดเข้าไปและเริ่มทำการทดลอง!


เฮ้ใครสามารถบอกวิธีการสร้างมุมมองรูด Facebook ชนิดและแผงเมนูใน Android
Neerav Shah

1

ถ้าคุณต้องการฉันทำ repo นี้ใน github GSSlideMenu มันอนุญาตให้คุณสร้างเมนูสไตล์ Facebook แต่ด้วย webView "back" (โดยทั่วไป repos ทั้งหมดที่ฉันพบมี tableView เป็นมุมมอง "back")



1

มุมมองด้านขวาอาจอยู่ในคลาสย่อยของ UIScrollView ในคลาสย่อยนี้คุณสามารถแทนที่- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)eventเพื่อคืนค่า YES เฉพาะเมื่อผู้ใช้สัมผัสมุมมองย่อย วิธีนี้คุณสามารถวาง 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.