iOS簡單抽屜效果的實(shí)現(xiàn)方法
本文實(shí)例為大家分享了iOS實(shí)現(xiàn)簡單抽屜效果的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)思路及步驟:
1、首先準(zhǔn)備要滑動的view
#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; }
2、監(jiān)聽觸摸事件,記錄橫軸方向的偏移量,有了偏移量就可以通過偏移量改動視圖的位置
#warning 第二布 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { ? ? // 獲取UITouch對象 ? ? UITouch *touch = [touches anyObject]; ? ?? ? ? // 獲取當(dāng)前點(diǎn) ? ? CGPoint currentPoint = [touch locationInView:self.view]; ? ?? ? ? // 獲取上一個(gè)點(diǎn) ? ? CGPoint prePoint = [touch previousLocationInView:self.view]; ? ?? ? ? // x軸偏移量:當(dāng)手指移動一點(diǎn)的時(shí)候,x偏移多少 ? ? CGFloat offsetX = currentPoint.x - prePoint.x; ? ?? ? ? // 設(shè)置當(dāng)前主視圖的frame ? ? _mainView.frame = [self getCurrentFrameWithOffsetX:offsetX]; ? ?? ? ?? ? ? _isDraging = YES; } ? 如何實(shí)時(shí)監(jiān)聽一個(gè)對象的屬性(只能監(jiān)聽對象,不能監(jiān)聽結(jié)構(gòu)體)?kvo ? // 1.監(jiān)聽 ?2 ,實(shí)現(xiàn):observeValueForKeyPath 方法 ? /** ? ? ?* ?給_mainView添加一個(gè)觀察者 ? ? ?* ? ? ?* ?KeyPath:監(jiān)聽frame這個(gè)屬性 ? ? ?* ? ? ?* ?options:監(jiān)聽新值的改變 ? ? ?*/ ? ? [_mainView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; //實(shí)時(shí)監(jiān)聽mainview的frame ? ? // 當(dāng)_mainView的frame屬性改變的時(shí)候就會調(diào)用 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { ? ? NSLog(@"%@", NSStringFromCGRect(_mainView.frame));//當(dāng)前的frame ? ?? ? ? if (_mainView.frame.origin.x < 0) { // 主界面的x<0,往左移動 ? ? ? ? // 顯示右邊 ? ? ? ? _rightView.hidden = NO; ? ? ? ? // 隱藏左邊 ? ? ? ? _leftView.hidden = YES; ? ? }else if (_mainView.frame.origin.x > 0){ // 往右移動 ? ? ? ? // 顯示左邊 ? ? ? ? _rightView.hidden = YES; ? ? ? ? // 隱藏右邊 ? ? ? ? _leftView.hidden = NO; ? ? ? ?? ? ? } }?
當(dāng)x軸偏移的時(shí)候,如何縮放高度?
當(dāng)x偏移時(shí),y軸縮小為: x的偏移量/
#define HMMaxY 60 // 當(dāng)手指偏移一點(diǎn),根據(jù)X軸的偏移量算出當(dāng)前主視圖的frame - (CGRect)getCurrentFrameWithOffsetX:(CGFloat)offsetX { ? ? CGFloat screenW = [UIScreen mainScreen].bounds.size.width; ? ? CGFloat screenH = [UIScreen mainScreen].bounds.size.height; ? ?? ? ? // 獲取y軸偏移量,手指每移動一點(diǎn),y軸偏移多少 ? ? CGFloat offsetY = offsetX * HMMaxY / screenW;//HMMaxY 縮放的最大Y? ? ?? ? ? 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 HMRTarget 250 #define HMLTarget -220 /* ?_mainView.frame.origin.x > screenW * 0.5 定位到右邊 ? CGRectGetMaxX(_mainView.frame) < screenW * 0.5 定位到左邊 -220 ? ?*/ // 定位 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { ? ?? ? ? // 復(fù)位 ? ? 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 = HMRTarget; ? ? }else if (CGRectGetMaxX(_mainView.frame) < screenW * 0.5) { // 定位到左邊 ? ? ? ? target = HMLTarget; ? ? } ? ?? ? ? [UIView animateWithDuration:0.25 animations:^{ ? ? ? ?? ? ? ? ? if (target) { // 在需要定位左邊或者右邊 ? ? ? ? ? ?? ? ? ? ? ? ? // 獲取x軸偏移量 ? ? ? ? ? ? CGFloat offsetX = target - _mainView.frame.origin.x; ? ? ? ? ? ?? ? ? ? ? ? ? // 設(shè)置當(dāng)前主視圖的frame ? ? ? ? ? ? _mainView.frame = [self getCurrentFrameWithOffsetX:offsetX]; ? ? ? ? ? ?? ? ? ? ? }else{ // 還原 ? ? ? ? ? ? _mainView.frame = self.view.bounds; ? ? ? ? } ? ? }]; ? ?? ? ? _isDraging = NO; ? ?? }
全:
@interface HMDrawViewController () ? ? @property (nonatomic, assign) BOOL isDraging; @end ? @implementation HMDrawViewController ? ? - (void)viewDidLoad { ? ? // UIViewController ? ? [super viewDidLoad]; ? ? // Do any additional setup after loading the view. ? ? ? ? // 1.添加子控件 ? ? [self addChildView]; #warning 第三步 觀察_mainView的frame改變 ? ? // 2.監(jiān)聽 ? ? /** ? ? ?* ?給_mainView添加一個(gè)觀察者 ? ? ?* ? ? ?* ?KeyPath:監(jiān)聽frame這個(gè)屬性 ? ? ?* ? ? ?* ?options:監(jiān)聽新值的改變 ? ? ?*/ ? ? [_mainView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; ? ? } ? // 當(dāng)_mainView的frame屬性改變的時(shí)候就會調(diào)用 - (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]; ? ?? ? ? // 獲取當(dāng)前點(diǎn) ? ? CGPoint currentPoint = [touch locationInView:self.view]; ? ?? ? ? // 獲取上一個(gè)點(diǎn) ? ? CGPoint prePoint = [touch previousLocationInView:self.view]; ? ?? ? ? // x軸偏移量:當(dāng)手指移動一點(diǎn)的時(shí)候,x偏移多少 ? ? CGFloat offsetX = currentPoint.x - prePoint.x; ? ?? ? ? // 設(shè)置當(dāng)前主視圖的frame ? ? _mainView.frame = [self getCurrentFrameWithOffsetX:offsetX]; ? ?? ? ?? ? ? _isDraging = YES; } #warning 第四步 #define HMMaxY 60 // 當(dāng)手指偏移一點(diǎn),根據(jù)X軸的偏移量算出當(dāng)前主視圖的frame - (CGRect)getCurrentFrameWithOffsetX:(CGFloat)offsetX { ? ? CGFloat screenW = [UIScreen mainScreen].bounds.size.width; ? ? CGFloat screenH = [UIScreen mainScreen].bounds.size.height; ? ?? ? ? // 獲取y軸偏移量,手指每移動一點(diǎn),y軸偏移多少 ? ? CGFloat offsetY = offsetX * HMMaxY / 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 HMRTarget 250 #define HMLTarget -220 /* ?_mainView.frame.origin.x > screenW * 0.5 定位到右邊 ? CGRectGetMaxX(_mainView.frame) < screenW * 0.5 定位到左邊 -220 ? ?*/ // 定位 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { ? ?? ? ? // 復(fù)位 ? ? 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 = HMRTarget; ? ? }else if (CGRectGetMaxX(_mainView.frame) < screenW * 0.5) { // 定位到左邊 ? ? ? ? target = HMLTarget; ? ? } ? ?? ? ? [UIView animateWithDuration:0.25 animations:^{ ? ? ? ?? ? ? ? ? if (target) { // 在需要定位左邊或者右邊 ? ? ? ? ? ?? ? ? ? ? ? ? // 獲取x軸偏移量 ? ? ? ? ? ? CGFloat offsetX = target - _mainView.frame.origin.x; ? ? ? ? ? ?? ? ? ? ? ? ? // 設(shè)置當(dāng)前主視圖的frame ? ? ? ? ? ? _mainView.frame = [self getCurrentFrameWithOffsetX:offsetX]; ? ? ? ? ? ?? ? ? ? ? }else{ // 還原 ? ? ? ? ? ? _mainView.frame = self.view.bounds; ? ? ? ? } ? ? }]; ? ?? ? ? _isDraging = NO; ? ?? }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS - UIButton(UIEdgeInsets)/設(shè)置button上的文字和圖片上下垂直居中對齊
這篇文章主要介紹了iOS - UIButton(UIEdgeInsets)/設(shè)置button上的文字和圖片上下垂直居中對齊的相關(guān)資料,需要的朋友可以參考下2015-09-09iOS獲取當(dāng)前網(wǎng)絡(luò)環(huán)境的實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄猧OS獲取當(dāng)前網(wǎng)絡(luò)環(huán)境的實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04

iOS復(fù)數(shù)cell下優(yōu)雅的代碼結(jié)構(gòu)詳解

iOS應(yīng)用開發(fā)中使UITextField實(shí)現(xiàn)placeholder屬性的方法

iOS開發(fā)學(xué)習(xí)TableView展現(xiàn)一個(gè)list實(shí)例