iOS 抽屜效果

抽屜效果思路:

三個(gè)View疊加,一個(gè)作為左View,一個(gè)作為右View,一個(gè)主View,在主View上添加拖動(dòng)手勢(shì),修改主View的frame以顯示左View和右View,設(shè)置分界值和左/右邊界值;根據(jù)響應(yīng)者鏈,將主View回收的tap手勢(shì),添加到self.view 上最合適

漸變色動(dòng)畫(huà).gif
//
//  ViewController.m
//  抽屜效果
//
//  Created by Captain on 2017/7/29.
//  Copyright ? 2017年 CaptainSir. All rights reserved.
//

#import "ViewController.h"

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

@interface ViewController ()

@property (nonatomic, weak) UIView * leftView;
@property (nonatomic, weak) UIView * rightView;
@property (nonatomic, weak) UIView * mainView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self addViews];
    [self setupViews];
}

- (void)addViews{
    // 左側(cè)View
    UIView * leftV = [[UIView alloc]init];
    leftV.backgroundColor = [UIColor greenColor];
    [self.view addSubview:leftV];
    
    // 右側(cè)view
    UIView * rightV = [[UIView alloc]init];
    rightV.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:rightV];
    
    // 主View
    UIView * mainV = [[UIView alloc]init];
    mainV.backgroundColor = [UIColor redColor];
    [self.view addSubview:mainV];
    
    leftV.frame = rightV.frame = mainV.frame = self.view.frame;
    self.leftView = leftV;
    self.rightView  = rightV;
    self.mainView = mainV;
}

- (void)setupViews{
    // 主View拖動(dòng)手勢(shì)
    UIPanGestureRecognizer * panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(mainViewPanAction:)];
    [self.mainView addGestureRecognizer:panGes];
    
    // 點(diǎn)擊self.view tap手勢(shì)回收mainView
    UITapGestureRecognizer * tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(mainViewRecoveryTapAction)];
    [self.view addGestureRecognizer:tapGes];
}

#define BoundaryValue      [UIScreen mainScreen].bounds.size.width * 0.5        // 位置分界值
#define TargetRight        [UIScreen mainScreen].bounds.size.width - 50        // 右側(cè)最遠(yuǎn)距離
#define TargetLeft         50                                                   // 左側(cè)最遠(yuǎn)距離

- (void)mainViewPanAction:(UIPanGestureRecognizer *) panGes{
    // 獲取手勢(shì)在self.mainView上的偏移量
    CGPoint point = [panGes translationInView:self.mainView];
    // 修改self.mainView的frame
    [self changeMainViewFrameWithOffsetX:point.x];
    // 復(fù)原手勢(shì)在self.mainView上的偏移量,防止疊加偏移
    [panGes setTranslation:CGPointZero inView:self.mainView];
    
    if (panGes.state == UIGestureRecognizerStateEnded) {
        // 設(shè)置邊界距離
        CGFloat margin = 0;
        if (self.mainView.frame.origin.x > BoundaryValue) {
            margin = TargetRight - self.mainView.frame.origin.x;
            
        }else if (CGRectGetMaxX(self.mainView.frame) < BoundaryValue) {
            margin = TargetLeft - CGRectGetMaxX(self.mainView.frame);
        }else {
            margin = -self.mainView.frame.origin.x;
        }
         [self changeMainViewFrameWithOffsetX: margin];
    }
}

#define MarginY     80
// 根據(jù)偏移量計(jì)算self.mainView的frame
- (void)changeMainViewFrameWithOffsetX:(CGFloat)offsetX{
    
    CGRect frame = self.mainView.frame;
    // X 值
    frame.origin = CGPointMake(frame.origin.x + offsetX, 0);
    
    // Y 值
    frame.origin.y = fabs((frame.origin.x / screenW) * MarginY);
    
    // H 值
    frame.size.height = screenH - (2 * frame.origin.y);
    

    self.mainView.frame = frame;
    
    if (self.mainView.frame.origin.x > 0) {
        self.rightView.hidden = YES;
    }else {
        self.rightView.hidden = NO;
    }
}

// 回收mainView的frame
- (void)mainViewRecoveryTapAction{
    self.mainView.frame = self.view.bounds;
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末若皱,一起剝皮案震驚了整個(gè)濱河市呢蔫,隨后出現(xiàn)的幾起案子呐芥,更是在濱河造成了極大的恐慌,老刑警劉巖夭问,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卦绣,居然都是意外死亡第喳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)校翔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弟跑,“玉大人,你說(shuō)我怎么就攤上這事展融〗讶希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵告希,是天一觀的道長(zhǎng)扑浸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)燕偶,這世上最難降的妖魔是什么喝噪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮指么,結(jié)果婚禮上酝惧,老公的妹妹穿的比我還像新娘。我一直安慰自己伯诬,他們只是感情好晚唇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著盗似,像睡著了一般哩陕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赫舒,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天悍及,我揣著相機(jī)與錄音,去河邊找鬼接癌。 笑死心赶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缺猛。 我是一名探鬼主播缨叫,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼椭符,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了弯汰?” 一聲冷哼從身側(cè)響起艰山,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咏闪,沒(méi)想到半個(gè)月后曙搬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸽嫂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年纵装,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片据某。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡橡娄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癣籽,到底是詐尸還是另有隱情挽唉,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布筷狼,位于F島的核電站瓶籽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏埂材。R本人自食惡果不足惜塑顺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俏险。 院中可真熱鬧严拒,春花似錦、人聲如沸竖独。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)莹痢。三九已至种蘸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間格二,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工竣蹦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顶猜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓痘括,卻偏偏與公主長(zhǎng)得像长窄,于是被迫代替她去往敵國(guó)和親滔吠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • 1.添加需要實(shí)現(xiàn)抽屜效果的三個(gè)視圖挠日,這里需要注意主視圖需要放在最后添加 2.實(shí)現(xiàn)左滑顯示左邊視圖疮绷,右滑出現(xiàn)右邊視圖...
    azhang_coder閱讀 1,065評(píng)論 0 3
  • 抽屜效果 MMDrawerController 使用說(shuō)明 這是一個(gè)抽屜導(dǎo)航控制器, 越來(lái)越多的應(yīng)用開(kāi)始使用抽屜效果...
    iOS_愛(ài)OS閱讀 2,145評(píng)論 8 13
  • 效果圖 平時(shí)開(kāi)發(fā)中經(jīng)常會(huì)用到抽屜效果,關(guān)于抽屜的實(shí)現(xiàn)有許多三方庫(kù)嚣潜,讀者可以根據(jù)需要選用冬骚,本節(jié)內(nèi)容主要簡(jiǎn)單的實(shí)現(xiàn)一個(gè)...
    Hardy_Hu閱讀 5,020評(píng)論 0 5
  • 我們?cè)谟肣Q時(shí)都會(huì)發(fā)現(xiàn),消息列表向左滑動(dòng)時(shí)懂算,左側(cè)的功能界面被顯示出來(lái)只冻,消息列表會(huì)拉到最右側(cè), 就像一個(gè)抽屜拉出來(lái)一...
    f94bd4cac294閱讀 2,499評(píng)論 1 20
  • 一個(gè)簡(jiǎn)單的抽屜效果,簡(jiǎn)單實(shí)用!整體思路:主要是在控制器的View上添加了兩個(gè)View,一個(gè)左側(cè)leftView和一...
    大冰噠噠呤閱讀 811評(píng)論 0 1