• 使用pan手势实现抽屉效果


    #import "ViewController.h"

    @interface ViewController ()

    @property (nonatomic, weak) UIView *mainV;

    @property (nonatomic, weak) UIView *leftV;

    @property (nonatomic, weak) UIView *rightV;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

    [super viewDidLoad];

    // 添加子控件

    [self setUpChildView];

    // 添加Pan手势

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];

    [self.view addGestureRecognizer:pan];

    // 利用KVO时刻监听mainV的frame属性

    // Observer:观察者 谁想监听

    // KeyPath:监听的属性

    // options:监听新值的改变

    [_mainV addObserver:self forKeyPath:keyPath(_mainV, frame) options:NSKeyValueObservingOptionNew context:nil];

    }

    // 只要监听的属性一改变,就会调用观察者的这个方法,通知你有新值

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

    {

    NSLog(@"%@",NSStringFromCGRect(_mainV.frame));

    if (_mainV.frame.origin.x > 0) { // 往右边移动,隐藏蓝色的view

    _rightV.hidden = YES;

    }else if (_mainV.frame.origin.x < 0){ // 往左边移动,显示蓝色的view

    _rightV.hidden = NO;

    }

    }

    // 在对象销毁的时候,一定要注意移除观察者

    - (void)dealloc

    {

    // 移除观察者

    [_mainV removeObserver:self forKeyPath:@"frame"];

    }

    #pragma mark - pan的方法

    - (void)pan:(UIPanGestureRecognizer *)pan

    {

    // 获取手势的移动的位置

    CGPoint transP = [pan translationInView:self.view];

    // 获取X轴的偏移量

    CGFloat offsetX = transP.x;

    // 修改mainV的Frame

    _mainV.frame = [self frameWithOffsetX:offsetX];

    // 复位

    [pan setTranslation:CGPointZero inView:self.view];

    }

    #pragma mark - 根据offsetX计算mainV的Frame

    - (CGRect)frameWithOffsetX:(CGFloat)offsetX

    {

    CGRect frame = _mainV.frame;

    frame.origin.x += offsetX;

    return frame;

    }

    #pragma mark - 添加子控件

    - (void)setUpChildView

    {

    // left

    UIView *leftV = [[UIView alloc] initWithFrame:self.view.bounds];

    leftV.backgroundColor = [UIColor greenColor];

    [self.view addSubview:leftV];

    _leftV = leftV;

    // right

    UIView *rightV = [[UIView alloc] initWithFrame:self.view.bounds];

    rightV.backgroundColor = [UIColor blueColor];

    [self.view addSubview:rightV];

    _rightV = rightV;

    // main

    UIView *mainV = [[UIView alloc] initWithFrame:self.view.bounds];

    mainV.backgroundColor = [UIColor redColor];

    [self.view addSubview:mainV];

    _mainV = mainV;

    }

  • 相关阅读:
    算法题:N皇后-2
    算法题:串联所有单词的子串
    算法题:二叉树的垂序遍历
    算法题:只出现一次的数字 三
    算法题:等价多米诺骨牌对的数量
    算法:判定字符是否唯一
    算法题:字符串相乘
    算法题:字符串的排列
    算法题:单词规律
    算法题:连通网络的操作次数
  • 原文地址:https://www.cnblogs.com/CJH5209/p/6027101.html
Copyright © 2020-2023  润新知