zoukankan      html  css  js  c++  java
  • (素材源码)猫猫学IOS(二十六)UI之iOS抽屉效果小Demo

    猫猫分享,必须精品

    素材代码地址:http://download.csdn.net/detail/u013357243/8635679
    原创文章,欢迎转载。转载请注明:翟乃玉的博客
    地址:http://blog.csdn.net/u013357243?viewmode=contents

    先看效果

    这里写图片描述

    源码

    NYDrawViewController.h

    
    //
    //  NYDrawViewController.h
    //  06-抽屉效果
    //
    //  Created by apple on 14-9-1.
    //  Copyright (c) 2014年 itcast. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface NYDrawViewController : UIViewController
    
    
    @property (nonatomic, weak, readonly) UIView *mainView;
    @property (nonatomic, weak, readonly) UIView *leftView;
    @property (nonatomic, weak, readonly) UIView *rightView;
    
    @end
    
    

    NYDrawViewController.m

    //
    //  NYDrawViewController.m
    //  06-抽屉效果
    //
    //  Created by apple on 14-9-1.
    //  Copyright (c) 2014年 itcast. All rights reserved.
    //
    
    #import "NYDrawViewController.h"
    
    @interface NYDrawViewController ()
    
    
    @property (nonatomic, assign) BOOL isDraging;
    @end
    
    @implementation NYDrawViewController
    
    
    - (void)viewDidLoad
    {
        // UIViewController
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
        // 1.添加子控件
        [self addChildView];
    #warning 第三步 观察_mainView的frame改变
        // 2.监听
        /**
         *  给_mainView添加一个观察者
         *
         *  KeyPath:监听frame这个属性
         *
         *  options:监听新值的改变
         */
        [_mainView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
    
    }
    
    // 当_mainView的frame属性改变的时候就会调用
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        NSLog(@"%@", NSStringFromCGRect(_mainView.frame));
    
        if (_mainView.frame.origin.x < 0) { // 往左移动
            // 显示右边
            _rightView.hidden = NO;
            // 隐藏左边
            _leftView.hidden = YES;
        }else if (_mainView.frame.origin.x > 0){ // 往右移动
            // 显示左边
            _rightView.hidden = YES;
            // 隐藏右边
            _leftView.hidden = NO;
    
        }
    }
    
    #warning 第一步
    - (void)addChildView
    {
        // left
        UIView *leftView = [[UIView alloc] initWithFrame:self.view.bounds];
        leftView.backgroundColor = [UIColor greenColor];
        [self.view addSubview:leftView];
        _leftView = leftView;
    
        // right
        UIView *rightView = [[UIView alloc] initWithFrame:self.view.bounds];
        rightView.backgroundColor = [UIColor blueColor];
        [self.view addSubview:rightView];
        _rightView = rightView;
    
        // mainView
        UIView *mainView = [[UIView alloc] initWithFrame:self.view.bounds];
        mainView.backgroundColor = [UIColor redColor];
        [self.view addSubview:mainView];
        _mainView = mainView;
    }
    
    #warning 第二步
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // 获取UITouch对象
        UITouch *touch = [touches anyObject];
    
        // 获取当前点
        CGPoint currentPoint = [touch locationInView:self.view];
    
        // 获取上一个点
        CGPoint prePoint = [touch previousLocationInView:self.view];
    
        // x轴偏移量:当手指移动一点的时候,x偏移多少
        CGFloat offsetX = currentPoint.x - prePoint.x;
    
        // 设置当前主视图的frame
        _mainView.frame = [self getCurrentFrameWithOffsetX:offsetX];
    
    
        _isDraging = YES;
    }
    #warning 第四步
    #define NYMaxY 60
    // 当手指偏移一点,根据X轴的偏移量算出当前主视图的frame
    - (CGRect)getCurrentFrameWithOffsetX:(CGFloat)offsetX
    {
        CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
        CGFloat screenH = [UIScreen mainScreen].bounds.size.height;
    
        // 获取y轴偏移量,手指每移动一点,y轴偏移多少
        CGFloat offsetY = offsetX * NYMaxY / screenW;
    
        CGFloat scale = (screenH - 2 * offsetY) / screenH;
    
        if (_mainView.frame.origin.x < 0) { // 往左边滑动
            scale = (screenH + 2 * offsetY) / screenH;
        }
    
        // 获取之前的frame
        CGRect frame = _mainView.frame;
        frame.origin.x += offsetX;
        frame.size.height = frame.size.height *scale;
        frame.size.width = frame.size.width *scale;
        frame.origin.y = (screenH - frame.size.height) * 0.5;
    
        return frame;
    }
    
    #define NYRTarget 250
    #define NYLTarget -220
    /*
     _mainView.frame.origin.x > screenW * 0.5 定位到右边
      CGRectGetMaxX(_mainView.frame) < screenW * 0.5 定位到左边 -220
    
     */
    // 定位
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
    
        // 复位
        if (_isDraging == NO && _mainView.frame.origin.x != 0) {
            [UIView animateWithDuration:0.25 animations:^{
    
                _mainView.frame = self.view.bounds;
            }];
        }
    
    
        CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
    
        CGFloat target = 0;
        if (_mainView.frame.origin.x > screenW * 0.5) { // 定位到右边
            target = NYRTarget;
        }else if (CGRectGetMaxX(_mainView.frame) < screenW * 0.5) { // 定位到左边
            target = NYLTarget;
        }
    
        [UIView animateWithDuration:0.25 animations:^{
    
            if (target) { // 在需要定位左边或者右边
    
                // 获取x轴偏移量
                CGFloat offsetX = target - _mainView.frame.origin.x;
    
                // 设置当前主视图的frame
                _mainView.frame = [self getCurrentFrameWithOffsetX:offsetX];
    
            }else{ // 还原
                _mainView.frame = self.view.bounds;
            }
        }];
    
        _isDraging = NO;
    
    }
    
    
    @end
    

    ps:新建iOS交流学习群:304570962 可以加猫猫QQ:1764541256 或则微信znycat 让我们一起努力学习吧。
    翟乃玉的博客
    地址:http://blog.csdn.net/u013357243?viewmode=contents

  • 相关阅读:
    barnes-hut算法 && Fast Multipole Methods算法
    最大独立集问题-maximal independent set problem
    kernighan lin算法
    浅析Struts2中的OGNL和ValueStack
    Python框架之Django学习笔记(十四)
    C++抓网页/获取网页内容
    SpiderMonkey-让你的C++程序支持JavaScript脚本
    关于职位的解释---转CSDN的文章
    优雅的css写法
    linux
  • 原文地址:https://www.cnblogs.com/znycat/p/4521026.html
Copyright © 2011-2022 走看看