用三步带你写一个侧边栏视图轮子(二)

上一篇文章讲到如何给主视图做动画.接下来这篇文章会进行第二,第三步.

第二步

这一步 毫无疑问是要给侧边栏设置一个动画效果,使之与主视图的动效协调一致,并给我们这个轮子加上手势识别的功能.
修改presentSideMenu方法

//展示侧边栏
- (void)presentSideMenu{
    if (self.sideMenuVisible)  return;
    //分别设置两个容器类layer的锚点
    [self setAnChorPoint:CGPointMake(1.0, 0.5) forView:_mainViewContainer];
    [self setAnChorPoint:CGPointMake(0, 0.5) forView:_menuViewContainer];
    [self setAnChorPoint:CGPointMake(1.0, 0.5) forView:_mainVC.view];
    [UIView animateWithDuration:self.duration animations:^{
        CATransform3D mainScaleTransform = _mainViewContainer.layer.transform;
        mainScaleTransform = CATransform3DMakeScale(_mainVCScaleValue, _mainVCScaleValue, 1.0f);
        //设置mainViewContainer的缩放形变;
        _mainViewContainer.layer.transform = mainScaleTransform;
        CATransform3D mainTranslateTransform = _mainViewContainer.layer.transform;
        mainTranslateTransform = CATransform3DTranslate(mainTranslateTransform, 100, 0, 0);
        //设置mainViewContainer的平移形变;
        _mainViewContainer.layer.transform = mainTranslateTransform;
        
        //设置menuViewContainer的平移形变
        CATransform3D menuTranslateTransform = _menuViewContainer.layer.transform;
        menuTranslateTransform = CATransform3DTranslate(menuTranslateTransform, 30, 0, 0);
        _menuViewContainer.layer.transform = menuTranslateTransform;
    } completion:^(BOOL finished) {
        self.sideMenuVisible = YES;
    }];
}

为_menuViewContainer添加动画代码并且新建一个sideMenuVisible属性 用于记录侧边栏的显示与否.
接下来是添加手势:

    //viewDidLoad中添加如下代码
    //添加手势
    // 添加滑动的手势手势
    UIPanGestureRecognizer * panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(viewDidSlide:)];
    [_mainVC.view addGestureRecognizer:panGes];

手势实现:

#pragma mark Pan 手势识别
- (void)viewDidSlide:(UIScreenEdgePanGestureRecognizer *)pan{
    CGPoint location = [pan locationInView:self.view];
    if (pan.state == UIGestureRecognizerStateBegan) self.currentX = location.x; // 拿到当前的位置
        if (pan.state == UIGestureRecognizerStateEnded) { // 如果拖拽停止了
            CGPoint translantion = [pan translationInView:self.mainVC.view];
//ABS(translantion.x)/ABS(translantion.y) > 1表示水平方向滑动
            if(ABS(translantion.x)/ABS(translantion.y) > 1){
               //location.x<self.currentX :右滑
  if(self.sideMenuVisible&&location.x<self.currentX) {
                    [self hideSideMenu];
                }else 
//location.x>self.currentX :左滑
if(!self.sideMenuVisible&&location.x>self.currentX){
                    [self presentSideMenu];
                }
            }
        }
}

判断手势只有在水平方向和左右移动才进行显示侧边栏操作.代码修改后的效果:

给侧边栏设置动画和添加手势后

第三步

这一步其实是教朋友们如何使用我们这个�轮子 并且制作一个高冷 华丽的应用Demo.
创建SideMenuVC和MainVC类 这俩个类都是我们实际应用到的,看看我们的SB

主视图
侧边栏

怎样?看起来就很炫酷 对吧!
这个轮子的使用 你只需在appdelegate写上这些代码

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    UINavigationController *navVC = [[UINavigationController alloc]initWithRootViewController:[MainVC controller]];
    SideMenuVC *sideVC = [SideMenuVC controller];
    _slSideMenuVC = [[SLSideMenuVC alloc] initWithMainVC:navVC sideMenuVC:sideVC];
    self.window.rootViewController  = _slSideMenuVC;
    self.window.backgroundColor = [UIColor blackColor];
    [self.window makeKeyAndVisible];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    return YES;
}

初始化SLSideMenuVC的实例 传入主视图和侧边栏的实例.
兄弟们看好了:

碉堡了

希望这篇文章能帮到有需要的同学,这也是我写博客的初衷,希望能一直写下去.
github:点我 点我 我是小王子

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,744评论 4 61
  • 一直以来,我都不太理解为什么人们会“无聊”。对我来说,任何我没有尝试过的新领域,只要我有余力和能力,我都乐于去了解...
    味稀阅读 2,875评论 0 0
  • 童书馆,像来到了童话城堡,可以坐在小木马上读书,这种感觉棒棒哒。 360度,被书包围! 门口。门不大,里面很精彩~
    乌桐小镇LY阅读 2,801评论 0 1
  • 【注意事项】1、持恭敬心。修学的第一方便,尊敬师长,守护业道,方获法益。师父带领我们走出无明烦恼,莫视师之长短,莫...
    Chaichengxin阅读 3,754评论 0 0
  • uname 命令用于打印内核名称和版本、主机名等系统信息。 该命令的语法如下: 不使用任何选项时,uname 命令...
    赵者也阅读 4,635评论 0 0

友情链接更多精彩内容