2013-12-19 6 views
1

EDITED:Дисплей вид анимации в ViewController

я создал слайд в меню для моего зрения, и она работает, как я хотел, это был оригинальный путеводитель, который я использовал.

http://www.youtube.com/watch?v=79ZQDzzOHLk

Моя цель состояла в том, чтобы получить это запрограммировано один раз в классе и заставить его работать на любом контроллере представления, что я решил назвать его.

Благодаря @ harsh.prasad и некоторые дополнительные исследования, мне удалось заставить это работать до такой степени, что он работает так, как я хочу, отдельно от привязки кнопок к нему.

Итак, чтобы обновить этот вопрос в надежде, он может помочь кому-то другому.

Это то, что я сделал:

Я создал класс UIView и назвал его MenuOne.

MenuOne.h

#import <UIKit/UIKit.h> 

@interface TFMenuOne : UIView { 
    // Pop Up Menu 

    IBOutlet UIScrollView *scrollView; 
    IBOutlet UIButton *openMenu; 
    int draw1; 
    IBOutlet UIButton *backButton; 
} 

// Pop Up Menu 
- (IBAction)openMenu_clicked:(id)sender; 

// Reset draw1 to 0 
- (void) resetView: (id) sender; 

@property (retain, nonatomic) IBOutlet UIScrollView *scrollView; 

@end 

MenuOne.m

#import "TFMenuOne.h" 

@implementation TFMenuOne 
@synthesize scrollView; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 

     draw1 = 0; 

     scrollView = [[UIScrollView alloc] init]; 
     [scrollView setBackgroundColor:[UIColor whiteColor]]; 
     [scrollView setFrame:CGRectMake(0, 315, 568, 5)]; 
     [scrollView setContentSize:CGSizeMake(568, 5)]; 


     backButton = [[UIButton alloc] init]; 
     [backButton setBackgroundColor:[UIColor greenColor]]; 
     backButton.frame = CGRectMake(224, 350, 120, 30); 

     openMenu = [[UIButton alloc] init]; 
     [openMenu setBackgroundImage:[UIImage imageNamed:@"[email protected]"] 
          forState:UIControlStateNormal]; 
     openMenu.adjustsImageWhenHighlighted = NO; 
     [openMenu addTarget:self 
        action:@selector(openMenu_clicked:) 
      forControlEvents:UIControlEventTouchUpInside]; 
     openMenu.frame = CGRectMake(256, 269, 64, 46); 


     [self addSubview:scrollView]; 
     [self addSubview:backButton]; 
     [self addSubview:openMenu]; 

    } 
    return self; 
} 

// Allow for touch even through transparent View class 
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    for (UIView *view in self.subviews) { 
     if (!view.hidden && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event]) 
      return YES; 
    } 
    return NO; 
} 

- (void) resetView: (id) sender { 
    draw1 = 1; 
    [self openMenu_clicked:sender]; 
} 

- (IBAction)openMenu_clicked:(id)sender { 
    if (draw1 == 0) { 

     draw1 = 1; 

     [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
      scrollView.frame = CGRectMake(0, 260, 568, 60); 
     } completion:^(BOOL finished) { 

     }]; 

     [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
      openMenu.frame = CGRectMake(256, 214, 64, 46); 
     } completion:^(BOOL finished) { 

     }]; 

     [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
      backButton.frame = CGRectMake(224, 275, 120, 30); 
     } completion:^(BOOL finished) { 

     }]; 


    } else { 

     draw1 = 0; 

     [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
      scrollView.frame = CGRectMake(0, 315, 568, 5); 
     } completion:^(BOOL finished) { 

     }]; 

     [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
      openMenu.frame = CGRectMake(256, 269, 64, 46); 
     } completion:^(BOOL finished) { 

     }]; 

     [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
      backButton.frame = CGRectMake(224, 350, 120, 30); 
     } completion:^(BOOL finished) { 

     }]; 

    } 
} 


/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
// Drawing code 
} 
*/ 

@end 

После многих проб и ошибок, чтобы получить этот класс UIView, чтобы появиться на нескольких ViewControllers я называю мнение, как это в файле m контроллера вида. Препятствиями, с которыми я столкнулся, было то, что меню откроется, но когда я покинул контроллер вида, чтобы перейти к другому контроллеру представления, меню будет находиться в состоянии, в котором он находился, когда я уйду, он не будет возвращаться обратно в закрытое состояние. Ниже приведено приведенное ниже код, что опять-таки спасибо @ harsh.prasad. Мне также удалось получить меню для анимации в

@interface TFMapViewController() 
{ 
    TFMenuOne *menuView; 
} 

@end 

@implementation TFMapViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
     [menuView resetView:nil]; 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    menuView = [[TFMenuOne alloc] initWithFrame:CGRectMake(0, 51, 568, 320)]; 
    [self.view addSubview:menuView]; 

} 

- (void) viewDidAppear:(BOOL)animated 
{ 

    [UIView animateWithDuration:0.5 delay:0.5 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     menuView.frame = CGRectMake(0, 0, 568, 320); 
    } completion:^(BOOL finished) { 

    }]; 

} 


- (void) viewDidDisappear:(BOOL)animated 
{ 
    [menuView resetView:nil]; 
    [UIView animateWithDuration:0.0 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     menuView.frame = CGRectMake(0, 51, 568, 320); 
    } completion:^(BOOL finished) { 

    }]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

// Allows for Exit button to work 
- (IBAction)returned:(UIStoryboardSegue *)segue { 

} 


@end 
+0

Вы должны обязательно посмотреть [MFSideMenu] (https://github.com/mikefrederick/MFSideMenu) –

+0

Спасибо Janak, но это не то, что я ищу. Я просмотрел меню слайдов, но это дает другой эффект тому, что я хочу - я хочу, чтобы мое меню появлялось над контроллером представления, а не сзади, и я хочу иметь возможность добавлять в него кнопки и изображения, а не только текст меню. Я уже достиг того, чего хочу, но хотел бы знать, есть ли эффективный способ не повторять один и тот же код на каждом контроллере. Спасибо, в любом случае. –

ответ

1

Я вы хотите, вы можете использовать tabsController, если такого рода функции вы хотите, в противном случае создать класс слайд ввиду меню, а затем вы можете использовать его во всех ваших взглядов, как вам нравится. Ни один и тот же фрагмент кода не должен быть переписан.

EDIT: Предположим, что вы создали класс CustomMenuView, который в основном создает ваше представление в меню.Итак, теперь вы можете использовать это в каждом контроллере представления вы хотите использовать его в следующим образом:

CustomMenuView *menuView = [CustomMenuView alloc] initWithFrame:CGRectMake(0, 200, 320, 100); 
menuView.<properties you want to pass> = <set properties here>; 
[self.view addSubView:menuView]; 

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

+0

Так что, если я создаю класс для этого меню, я также создаю для него контроллер вида, и если да, то как я потом назову его каждому контроллеру просмотра, я хочу, чтобы он появился? –

+0

Достаточно класс UIView вашего меню. Просто обработайте представление в функции initWithFrame. Я думаю, что это может легко решить вашу проблему. –

+0

Хорошо, любая идея о том, как я буду это кодировать? Я создал класс сейчас, и он сидит там, но понятия не имеет, как закодировать его в каждом контроллере представления, чтобы заставить его работать. Все идеи? –

0

1) Вот старый учебник для создания меню -. http://www.raywenderlich.com/32054/how-to-create-a-slide-out-navigation-like-facebook-and-path/projectlayout

2) Лучший способ для создания меню Ящик с видом контейнера. Вы можете больше узнать о просмотрах контейнеров из видео WWDC.

3) Или, если вы ленитесь г это сами, попробуйте эту библиотеку http://cocoacontrols.com/platforms/ios/controls/jtrevealsidebar

P.S. Нет, вы не должны повторять код.

0

Вы можете попробовать это,

Сначала сделайте вид на исходной точке х = 0 у = 480 (для iphone4), а затем запустить этот код.

CGRect theFrame = self.viewMenuShare.frame; 
theFrame.origin = CGPointMake(0, 480); 
self.viewMenuShare.frame = theFrame; 
theFrame.origin = CGPointMake(0,480 - 187); 
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.3f]; 
self.viewMenuShare.frame = theFrame; 
[UIView commitAnimations]; 
Смежные вопросы