iOS頁面抽屜效果的構思和實現

目前市場上很多APP都有抽屜效果的界面,界面大同小異,一下是我個人分析和實現的抽屜效果,我是以代碼加注釋的方式分析抽屜效果界面的搭建和效果的實現的.

實現效果圖:



第一步:搭建界面



- (void)viewDidLoad {

[superviewDidLoad];

//搭建界面

[selfsetUpView];

}

- (void)setUpView{

//添加左邊的View

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

//左邊藍色

leftV.backgroundColor= [UIColorblueColor];

[self.viewaddSubview:leftV];

添加右邊的View

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

//右邊縁色

rightV.backgroundColor= [UIColorgreenColor];

self.rightV= rightV;

[self.viewaddSubview:rightV];

//添加中間的View(中間一個最后添加,顯示到最外面.)

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

//中間紅色

mainV.backgroundColor= [UIColorredColor];

self.mainV= mainV;

[self.viewaddSubview:mainV];

}


//第二步.添加手勢.能夠讓中間的紅色View左右移動,要在控制器View加載完成時就要添加View



- (void)viewDidLoad {

[superviewDidLoad];

//搭建界面

[selfsetUpView];

//拖動手勢

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

//添加手勢

[self.mainVaddGestureRecognizer:pan];

}

//實現手勢方法:

//當手指拖動時調用.

-(void)pan:(UIPanGestureRecognizer*)pan{

//獲取手指在屏幕上面的偏移量

CGPointtransP = [pantranslationInView:self.mainV];

//在這里為什么不用Transform,是因為我們移動時,要改變的尺寸大小.用Transform只能改變它的位置.

self.mainV.transform? = CGAffineTransformTranslate(self.mainV.transform, transP.x, 0);

//計算mainV的Frame

//單獨抽出一個方法來計算mainV的frame.因為要計算它的Y值和高度.代碼會很多.所以單獨抽出一個方法

self.mainV.frame= [selfframeWithOffsetX:transP.x];

//每次移動時判斷當前MainV的x值是大于0還是小于0.如果是大于0 ,顯示左邊,小于0顯示右邊

if(self.mainV.frame.origin.x>0) {

self.rightV.hidden=YES;

}elseif(self.mainV.frame.origin.x<0){

self.rightV.hidden=NO;

}

//注意要做復位

[pansetTranslation:CGPointZeroinView:self.mainV];

}

//最大Y值為100

#define maxY100

//根據偏移量計算mainV的frame.

- (CGRect)frameWithOffsetX:(CGFloat)offsetX{

//取出最原始的Frame

CGRectframe =self.mainV.frame;

frame.origin.x+= offsetX;

//獲取屏幕的寬度

//(計算Y值如果下圖:找最大值.當Main.x拖動最大的時候,Main.y值也最大.main.x最大為屏幕的寬度)

//設定一個最大Y值MaxY為100,正好.當max.x為屏幕的寬度時,最大Y等于100

//所以Y值等于 main.y = main.x * maxY / ScreenW;

100 = 375 * 100 / 375;)

//有可能frame.origin.x有可能是小于0,小于0的話,得出的Y值就會小于0,小于0就會出現,紅色的View向上走.

//對結果取絕對值.

frame.origin.y=fabs(frame.origin.x*maxY/screenW);

//計算frame的高度

//(當前Main的高度等于屏幕的高度減去兩倍的Y值.)

frame.size.height=screenH-2* frame.origin.y;

//返回計算好的frame.

returnframe;

}

//第三步:當手指松開時做到自動定位.

MainV定位到右側的X值

#define targetR275

MainV定位到右側的X值

#define targetL -275

//當手指拖動時調用.

-(void)pan:(UIPanGestureRecognizer*)pan{

//獲取手指在屏幕上面的偏移量

CGPointtransP = [pantranslationInView:self.mainV];

//在這里為什么不用Transform,是因為我們移動時,要改變的尺寸大小.用Transform只能改變它的位置.

self.mainV.transform? = CGAffineTransformTranslate(self.mainV.transform, transP.x, 0);

//計算mainV的Frame

//單獨抽出一個方法來計算mainV的frame.因為要計算它的Y值和高度.代碼會很多.所以單獨抽出一個方法

self.mainV.frame= [selfframeWithOffsetX:transP.x];

//每次移動時判斷當前MainV的x值是大于0還是小于0.如果是大于0 ,顯示左邊,小于0顯示右邊

if(self.mainV.frame.origin.x>0) {

self.rightV.hidden=YES;

}elseif(self.mainV.frame.origin.x<0){

self.rightV.hidden=NO;

}

//判斷手指的狀態

if(pan.state==UIGestureRecognizerStateEnded){

//當手指松開時進入執行

//記錄最終判斷結果后.定位的值.

CGFloattarget =0;

//當手指松開,要判斷MainV的x值是否大于屏幕的一半.如果大于屏幕一半時,自動定位到右邊一個位置.

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

target =targetR;

}elseif(CGRectGetMaxX(self.mainV.frame)

//當手指松開,要判斷MainV的最大的X值是否小于屏幕的一半.如果小于屏幕的一半時,自動定位到左邊的位置.

target =targetL;

}

最終定位的x值 - 當前的main.x的值. 求出便宜量.使其定位

CGFloatoffsetX = target -self.mainV.frame.origin.x;


//根據便宜量設置mainV的frame值

CGRectframe = [selfframeWithOffsetX:offsetX];

[UIViewanimateWithDuration:0.25animations:^{

//伴隨動畫設置frame

self.mainV.frame= frame;

}];

}

//注意要做復位

[pansetTranslation:CGPointZeroinView:self.mainV];

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容