QQ抽屜效果

效果圖

//定義屬性宏

#define LWKeyPath(objc, keyPath) @(((void)objc.keyPath, #keyPath))

#define screenW [UIScreen mainScreen].bounds.size.width

#define screenH [UIScreen mainScreen].bounds.size.height

#define MaxY100

#define targetR300

#define targetL -220


@interface ViewController()

@property(nonatomic,weak)UIView*mainV;

@property(nonatomic,weak)UIView*leftV;

@property(nonatomic,weak)UIView*rightV;

@end

@implementation ViewController

- (void)viewDidLoad {

[superviewDidLoad];

//添加控件

[selfsetUpAllViews];

//添加手勢

[selfsetGesture];

//添加點控手勢

[selfsetTapGesture];

//添加監(jiān)聽frame移動方向的kvo

// KVO作用:時刻監(jiān)聽某個對象的某個屬性的改變

// _main frame屬性的改變

// Observer:觀察者

// KeyPath:監(jiān)聽的屬性

[_mainVaddObserver:selfforKeyPath:LWKeyPath(_mainV,frame)options:NSKeyValueObservingOptionNewcontext:nil];

}

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

if(_mainV.frame.origin.x>0) {

_rightV.hidden=YES;

}elseif(_mainV.frame.origin.x<0){

_rightV.hidden=NO;

}

}

-(void)dealloc{

[_mainVremoveObserver:selfforKeyPath:LWKeyPath(_mainV,frame)];

}

//點控手勢

- (void)setTapGesture{

//新建點控手勢識別

UITapGestureRecognizer*tap = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(tap)];

[self.viewaddGestureRecognizer:tap];

}

//點控觸發(fā)事件

- (void)tap{

[UIViewanimateWithDuration:0.25animations:^{

_mainV.frame= [UIScreenmainScreen].bounds;

}];

}

//添加手勢

- (void)setGesture{

//拖拽手勢

UIPanGestureRecognizer*pan = [[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(panGestureRecognizer:)];

//添加到控件上

[_mainVaddGestureRecognizer:pan];

}

//觸發(fā)拖拽事件

- (void)panGestureRecognizer: (UIPanGestureRecognizer*)panGR{

//獲取手勢的偏移量

CGPointtransP = [panGRtranslationInView:_mainV];

//獲取x軸的偏移量,相對于上一次

CGFloatoffsetX = transP.x;

//平移

//? ? _mainV.transform = CGAffineTransformTranslate(_mainV.transform, offsetX, 0);

//? ? //要想實現(xiàn)相對上個位置的移動,就要實現(xiàn)復位

//? ? //復位

//? ? [panGR setTranslation:CGPointZero inView:_mainV];

//使用frame同時實現(xiàn)壓縮

_mainV.frame= [selfframeWithOffsetX:offsetX];

//手勢操作時,實現(xiàn)相對效果,就要復位

[panGRsetTranslation:CGPointZeroinView:_mainV];

//如果拖拽手勢結(jié)束

if(panGR.state==UIGestureRecognizerStateEnded) {

CGFloattarget =0;

//判斷當前的frame

if(_mainV.frame.origin.x>screenW*0.5) {

//右移一半以上

target =targetR;

}elseif(CGRectGetMaxX(_mainV.frame)

//左移一半以上

target =targetL;

}

//獲得x的偏移量

offsetX = target -_mainV.frame.origin.x;

//動畫跳轉(zhuǎn)新的frame

[UIViewanimateWithDuration:0.25animations:^{

_mainV.frame= [selfframeWithOffsetX:offsetX];

}];

}

}

- (CGRect)frameWithOffsetX: (CGFloat)offsetX{

//獲取當前main的frame

CGRectframe =_mainV.frame;

//計算當前的x,y,w,h

CGFloatx = frame.origin.x+ offsetX;

//去x的絕對值,排除掉左移,y值變大的效果

CGFloattem_x =fabs(x);

//獲取最新的y等比例縮放

CGFloaty = tem_x/screenW*MaxY;

//獲取最新的高度

CGFloath =screenH-2* y;

//獲取最新的縮放值

CGFloatscale = h/screenH;

//獲取最新的寬度

CGFloatw =screenW* scale;

returnCGRectMake(x, y, w, h);

}

//添加控件

- (void)setUpAllViews{

//紅色

UIView*v1 = [[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds];

v1.backgroundColor= [UIColorredColor];

[self.viewaddSubview:v1];

_leftV= v1;

//藍色

UIView*v2 = [[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds];

v2.backgroundColor= [UIColorblueColor];

[self.viewaddSubview:v2];

_rightV= v2;

//黃色

UIView*v3 = [[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds];

v3.backgroundColor= [UIColoryellowColor];

[self.viewaddSubview:v3];

_mainV= v3;

}

- (void)didReceiveMemoryWarning {

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末踏烙,一起剝皮案震驚了整個濱河市先嬉,隨后出現(xiàn)的幾起案子顷牌,更是在濱河造成了極大的恐慌橄霉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舀透,死亡現(xiàn)場離奇詭異轧飞,居然都是意外死亡,警方通過查閱死者的電腦和手機毅厚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門塞颁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吸耿,你說我怎么就攤上這事祠锣。” “怎么了咽安?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵伴网,是天一觀的道長。 經(jīng)常有香客問我妆棒,道長澡腾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任糕珊,我火速辦了婚禮动分,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘红选。我一直安慰自己澜公,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布喇肋。 她就那樣靜靜地躺著坟乾,像睡著了一般迹辐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上甚侣,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天右核,我揣著相機與錄音,去河邊找鬼渺绒。 笑死贺喝,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的宗兼。 我是一名探鬼主播躏鱼,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼殷绍!你這毒婦竟也來了染苛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤主到,失蹤者是張志新(化名)和其女友劉穎茶行,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體登钥,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡畔师,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牧牢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片看锉。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖塔鳍,靈堂內(nèi)的尸體忽然破棺而出伯铣,到底是詐尸還是另有隱情,我是刑警寧澤轮纫,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布腔寡,位于F島的核電站,受9級特大地震影響掌唾,放射性物質(zhì)發(fā)生泄漏放前。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一郑兴、第九天 我趴在偏房一處隱蔽的房頂上張望犀斋。 院中可真熱鬧,春花似錦情连、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虫几。三九已至,卻和暖如春挽拔,著一層夾襖步出監(jiān)牢的瞬間辆脸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工螃诅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啡氢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓术裸,卻偏偏與公主長得像倘是,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袭艺,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 仿QQ抽屜效果 效果展示: -QQ效果描述:QQ中的效果是側(cè)滑的效果搀崭,當導航控制器從左側(cè)畫開的時候,左側(cè)的視圖也跟...
    BlueEagleBoy閱讀 1,509評論 3 6
  • 抽屜效果幾乎在每一個APP中都能遇到猾编。那么最為一個iOS開發(fā)人員怎么好意思不懂其中的原理呢瘤睹。如果你愿意花上3分鐘來...
    十三_Black閱讀 1,812評論 2 6
  • 其實網(wǎng)上類似的實現(xiàn)已經(jīng)很多了,原理也并不難答倡,只是網(wǎng)上各種demo運行下來轰传,多少都有一些問題。折騰了半天瘪撇,決定自己實...
    Horrarndoo閱讀 1,577評論 0 1
  • 首先看一下使用方式,其中ZWDrawerViewController 是封裝的抽屜效果視圖控制器设江,tabbarVC...
    ZhengYaWei閱讀 442評論 0 13
  • 自己寫的簡單抽屜效果锦茁,大概原理都是一樣的,直接放代碼叉存。 #import"DrawViewController.h"...
    BEYOND黃閱讀 404評論 0 3