在ViewController中显示动画视图

时间:2013-12-19 08:14:11

标签: ios objective-c view dry 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:@"menu-button-@2.png"]
                            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

3 个答案:

答案 0 :(得分:1)

我希望您可以使用tabsController,如果您想要这种功能,否则在菜单视图中创建一个幻灯片类,然后您可以根据需要在所有视图中使用它。不需要重写相同的代码。

修改: 假设您已经创建了一个类CustomMenuView,它基本上创建了菜单视图。所以现在您可以在以下方式使用它的每个视图控制器中使用它:

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

这将使用自定义菜单设置视图,然后您可以处理此菜单中的操作。

答案 1 :(得分:0)

1)这是一个用于创建菜单的旧教程 - http://www.raywenderlich.com/32054/how-to-create-a-slide-out-navigation-like-facebook-and-path/projectlayout

2)更好的方法是使用容器视图创建Drawer菜单。您可以从WWDC视频中了解有关容器视图的更多信息。

3)或者如果你自己懒得去,试试这个库http://cocoacontrols.com/platforms/ios/controls/jtrevealsidebar

P.S。不,你没有重复代码。

答案 2 :(得分:0)

你可以试试这个,

首先查看原点x = 0 y = 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];