iOS开发不借助第三方控件实现侧边栏效果

最近在研究iOS程序的侧边栏,因为发现渐渐的iOS的程序也开始走侧边栏的风格了,QQ,今日头条,Path(Path算最早出现侧边栏的app了,所以也把侧边栏效果说成是Path效果),所以就研究了下。

然后发现Git Hub上有很多侧边栏的控件,这些控件效果也都挺玄的,但是我想找到不用第三方控件自己实现侧边栏呢?后来参照这篇blog,然后自己搞了下,算搞清楚了。下面详细介绍一下吧。

1.

首先我们需要在storyboard里面新建3个view controlle,这里也可以是navigation controller,但是我还是习惯直接用view controller就可以了,跳转都自己来实现。

2.

接下来需要新建3个类,

ContainerViewController是一个容器类的VC,作用是放置MainVC和SideVC,就好比TabbarViewController一样,它只是一个容器,真正调整页面的是在其他VC中。

3.

先不用管这3个ViewController如何实现,我们转到storyboard中,分别把设置3个ViewController的identifier,像这个样子

ContainerViewController可以不设置storyboard,但是mainVC和sideVC一定要设置好storyboard ID,然后你还可以自己编辑一下Main VC和sideVC,这样可以更清晰地看到侧边栏的效果。

最终的StoryBoard是这样的:

最上面是ContainerViewController,接下来从右到左分别是MainViewController和SideViewController。

4.

好了,接下来我们就开始coding把。我这里想要做的效果是滑屏或者点击mainVC左上角的按钮都可以打开侧边栏,然后当侧边栏显示的时候,滑屏或者点击右侧的mainVC,都能隐藏侧边栏。

我们一步一步来分析代码吧:

其实主要是ContainerViewController

ContainerViewController.h

//  这个相当于是容器的VC,里面存放主界面和侧边栏

#import <UIKit/UIKit.h>
#import "MainViewController.h"
#import "SideViewController.h"

@interface ContainerViewController : UIViewController<UIGestureRecognizerDelegate>{}

@property(nonatomic, strong) MainViewController *centerController;
@property(nonatomic, strong) SideViewController *leftController;

- (void)showSideView;
- (void)hideSideView;

@end

我们import了mainVC和sideVC,然后定义了两个property和两个method

ContainerViewController.m

//

#import "ContainerViewController.h"

@interface ContainerViewController ()

@end

@implementation ContainerViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    _centerController = (MainViewController *)[storyboard instantiateViewControllerWithIdentifier:@"MainViewController"];
    _centerController.fatherViewController = self;

    _leftController = (SideViewController *)[storyboard instantiateViewControllerWithIdentifier:@"LeftViewController"];

    [self.view addSubview:_centerController.view];
    [_centerController.view setTag:1];
    [_centerController.view setFrame:self.view.bounds];

    [self.view addSubview:_leftController.view];
    [_leftController.view setTag:2];
    [_leftController.view setFrame:self.view.bounds];

    [self.view bringSubviewToFront:_centerController.view];

    //add swipe gesture
    UISwipeGestureRecognizer *swipeGestureRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
    [swipeGestureRight setDirection:UISwipeGestureRecognizerDirectionRight];
    [_centerController.view addGestureRecognizer:swipeGestureRight];

    UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
    [swipeGestureLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
    [_centerController.view addGestureRecognizer:swipeGestureLeft];
}

-(void) swipeGesture:(UISwipeGestureRecognizer *)swipeGestureRecognizer {

    CALayer *layer = [_centerController.view layer];
    layer.shadowColor = [UIColor blackColor].CGColor;
    layer.shadowOffset = CGSizeMake(1, 1);
    layer.shadowOpacity = 1;
    layer.shadowRadius = 20.0;
    if (swipeGestureRecognizer.direction == UISwipeGestureRecognizerDirectionRight) {
        [self showSideView];
    }
    if (swipeGestureRecognizer.direction == UISwipeGestureRecognizerDirectionLeft) {
        [self hideSideView];
    }
}

// 显示侧边栏,单独写成一个函数,供mainVC点击头像时调用
- (void)showSideView{
    [_leftController.view setHidden:NO];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    if (_centerController.view.frame.origin.x == self.view.frame.origin.x || _centerController.view.frame.origin.x == -200) {
        [_centerController.view setFrame:CGRectMake(_centerController.view.frame.origin.x+200, _centerController.view.frame.origin.y, _centerController.view.frame.size.width, _centerController.view.frame.size.height)];
    }

    [UIView commitAnimations];
}

- (void)hideSideView{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    if ( _centerController.view.frame.origin.x == 200) {
        [_centerController.view setFrame:CGRectMake(_centerController.view.frame.origin.x-200, _centerController.view.frame.origin.y, _centerController.view.frame.size.width, _centerController.view.frame.size.height)];
    }
    [UIView commitAnimations];
    // 最后调用防止出现白底
    [_leftController.view setHidden:YES];
}

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

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

在viewDidload方法里面,我们从storyboard中获取到两个ViewController,注意我的sideviewcontroller起的名字是LeftViewController,也就是在storyboard ID里面要写成这个名字。

然后添加进去了滑屏手势,分别是向左滑和向右滑

接下里在滑屏的代理里面定义了滑屏的动作。这里为什么要把显示/隐藏sideview单独做成两个method呢?因为一会我们要实现在mainVC里面点击头像的时候能够调用ContainerVC里的这两个函数!

接下来看看MainVC如何实现吧

MainViewController.h

#import <UIKit/UIKit.h>

@class ContainerViewController;

@interface MainViewController : UIViewController

- (IBAction)showSideView:(id)sender;
@property (nonatomic, strong) ContainerViewController* fatherViewController;

@end

注意这里用@class来引入ContainerVC,不在头文件里面#import是为了防止循环引用。

然后我们定义一个property,fatherViewController,它是一个ContainerViewController的实例。

showSideView的IBAction是头像那个button的点击动作。

MainViewController.m

#import "MainViewController.h"
#import "ContainerViewController.h"

@interface MainViewController ()

@end

@implementation MainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

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

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

- (IBAction)showSideView:(id)sender {
    [self.fatherViewController showSideView];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [self.fatherViewController hideSideView];
}
@end

这样在mainViewController的点击头像button的动作就能调用fatherViewController,也就是ContainerViewController里面的showSideView动作了。

touchesBegan是当点击mainViewController的时候,隐藏侧边栏的。

以为SideViewController都是在storyboard里面拖入控件完成的,所以不需要写什么代码。

当然,这里仅仅是左侧的侧边栏,想要看两侧的侧边栏方法,查阅这里

时间: 2024-12-30 11:27:36

iOS开发不借助第三方控件实现侧边栏效果的相关文章

iOS开发UI篇—UITableview控件基本使

iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> @interface NJHero : NSObject /** * 头像 */ @property (nonatomic, copy) NSString *icon; /** * 名称 */ @property (nonatomic, copy) NSString *name; /** * 描述 */ @

iOS开发UI篇—UITableview控件使用小结

iOS开发UI篇—UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; 2.告诉每组一共有多少行 方法:- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSIntege

iOS开发UI篇—UIPickerView控件简单介绍

iOS开发UI篇—UIPickerView控件简单介绍 一.UIPickerView 控件 1.简单介绍: 2.示例代码 TXViewController.m文件 1 // Created by 鑫 on 14-10-15. 2 3 // Copyright (c) 2014年 梁镋鑫. All rights reserved. 4 5 // 6 7 8 9 #import "TXViewController.h" 10 11 12 13 @interface TXViewContro

【转】 iOS开发UI篇—UIScrollView控件实现图片轮播

原文:http://www.cnblogs.com/wendingding/p/3763527.html iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播            二.实现代码 storyboard中布局 代码: 1 #import "YYViewController.h" 2 3 @interface YYViewController () <UIScrollViewDelegate> 4 @property (w

牛腩新闻发布系统———如何在开发中使用第三方控件

开发的项目多了以后,很多时候系统自带控件根本不能满足我们的需要,所以有时候就需要我们使用第三方控件来让我们的系统更加Perfect! 下面 ,我记录一下牛腩是如何添加第三方控件的 比如我们要使用 FreeTextBox控件 第一步:先把第三方控件(某个DLL或者其他文件)下载下来 第二步:然后添加对该文件的引用(右击自己的启动项目-添加–引用) 第三步:看到VS左边的工具箱了吗,在空白处右击选择 选择项 第四步:然后会看到如下界面,在单击 浏览,找到自己要添加的第三方控件,确定. 第五步:依次单

iOS开发UI篇—UITableview控件简单介绍

一.基本介绍 在众多移动应?用中,能看到各式各样的表格数据 . 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView,UITableView继承自UIScrollView,因此支持垂直滚动,?且性能极佳 . UITableview有分组和不分组两种样式,可以在storyboard或者是用代码设置. 二.数据展示 UITableView需要?一个数据源(dataSource)来显示数据UITableView会向数据源查询一共有多少行数据以及每?行显示什么数据等 没有设置数据源

实现WinForm窗体的美化(借助第三方控件)

在winform项目中,其实皮肤就是一个第三方的控件,名字是IrisSkin4.dll只要添加到你的工具箱里就可以和其它控件一样使用了 一.添加控件IrisSkin4.dll.方法: 先把IrisSkin4.dll文件添加到当前项目引用(解决方案资源管理器->当前项目->引用->右键->添加引用,找到IrisSkin4.dll文件.....).IrisSkin4.dll文件最好放在当前项目bin\Debug文件中. 1.右键"工具箱"→"添加选项卡&q

iOS开发基础----OC/UI控件

1. 前缀-> 只是代码组合之后,用来区分谁写的代码 2. 工具包frameworks 总共4个工具包,前3个是经常用的,最后一个是测试用的. 3. iphone 6 的SDK 是建立在 ios 8.0以上的 4.ios的界面虽然发生了改变,但还是从main.m中执行的,只是main.m没有放在导航区,而是放在Supporting Files 分组中.注意不是文件夹,是分组. main.m里有这个 return UIApplicationMain(argc, argv, nil, NSStrin

iOS开发UI篇—UIScrollView控件实现图片缩放功能

一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对其内容进行缩放处理.也就是说,要完成缩放功能的话,只需要将需要缩放的内容添加到UIScrollView中 2.缩放原理 当用户在UIScrollView身上使用捏合手势时,UIScrollView会给代理发送一条消息,询问代理究竟要缩放自己内部的哪一个子控件(哪一块内容) 当用户在UIScrollView身上使用捏合手势时,UIScrollView会调用代理的v