Какой лучший способ разработать боковое меню, как в новом iOS-приложении Facebook? - PullRequest
155 голосов
/ 03 ноября 2011

Похоже, что боковые меню становятся все более распространенным элементом интерфейса, так как больше информации попадает в каждое приложение для iPhone.Facebook включил его в свою последнюю версию, и новое приложение Gmail также включает его .Мне было интересно, есть ли у кого-нибудь мысли о наиболее эффективном способе разработки чего-то подобного, так как это становится более распространенным элементом интерфейса.Хотя у меня есть свои мысли о том, как это построить, мне любопытно услышать, что думают другие люди.

Facebook swipe navigation

Ответы [ 18 ]

4 голосов
/ 23 июля 2013

Этот вопрос довольно популярен, но все сводилось к тому, что мне легко его импортировать и использовать ... Вот что я использую ... SWRevealController .

Я удивлен, что люди упускают это ... Это действительно БОЛЬШОЕ !!! и прост в использовании. Разработчик даже включает несколько примеров проектов, которые позволяют увидеть, как использовать его в различных сценариях.

3 голосов
/ 12 февраля 2015

Отличное руководство по разработке собственной слайд-аут-навигации в Swift и Objective-C.

Objective-C

Swift

2 голосов
/ 03 ноября 2011

И Gmail, и Facebook активно используют веб-представления, поэтому сложно сказать, что является нативным кодом и что представляет собой HTML. Однако, глядя на интерфейс, похоже, что они поместили UITableView с шириной, более узкой, чем ширина экрана (320pt), под UIView, который содержит контент, который они хотят отобразить. Выбор разных строк табличного представления, вероятно, заменяет подпредставление представления содержимого.

По крайней мере, так я подойду к проблеме. Трудно диктовать, что это должно быть. Просто прыгайте прямо и начинайте экспериментировать!

1 голос
/ 23 ноября 2011

Попробуйте добавить свое меню (которое вы проводите, чтобы добраться до) под основным видом.Начните подписку на сенсорные события в представлении.

Реализация touchesMoved: и проверьте, является ли первый gesture вертикальным (при необходимости выполните прокрутку основного вида) или горизонтальным (здесь вы хотитепоказать меню).Если он горизонтальный, начинайте вызывать другой метод, - (void)scrollAwayMainView:(NSUInteger)pixels, всякий раз, когда вызывается touchesMoved:, вычисляя количество пикселей от начальной точки, которой должен быть основной вид, и передавая это число в метод.В реализации этих методов запустите следующий код:

[mainView scrollRectToVisible:CGRectMake:(pixels, 
                                          mainView.origin.y, 
                                          mainView.size.width, 
                                          mainView.size.height];
1 голос
/ 13 октября 2013

это точно клон боковой панели facebook: Библиотека GHSidebarNav

очень прост в использовании. инструкция в

1 голос
/ 23 марта 2012

Если вы хотите, я сделал это репо на github GSSlideMenu Это позволяет вам создать меню в стиле Facebook, НО с "обратным" веб-представлением (как правило, все обнаруженные мной репозитории имеют табличный вид каквид «назад»).

1 голос
/ 21 ноября 2011

представление справа может быть внутри подкласса 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];
0 голосов
/ 05 мая 2016

Проверьте мое решение для этого вопроса:

Как создать пользовательское слайд-меню без сторонней библиотеки .?

Один единственный класс, который вам нужен только для создания подкласса и заполнения контентом.

Вот класс. Для получения более подробной информации см. Ссылку выше.

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...