抽屜效果

抽屜效果

效果圖:

抽屜效果.gif

第一步:搭建界面

#define maxY 100
#define ZZScreenW [UIScreen mainScreen].bounds.size.width
#define ZZScreenH [UIScreen mainScreen].bounds.size.height
// MainV定位到右側(cè)的X值
#define ZZTargetR 225
// MainV定位到右側(cè)的X值
#define ZZTargetL -275

#import "ViewController.h"

@interface ViewController ()<UIGestureRecognizerDelegate>
// 左邊的view
@property (nonatomic, weak) UIView *leftV;

// 右邊的view
@property (nonatomic, weak) UIView *rightV;

// 中間的view
@property (nonatomic, weak) UIView *mainV;

@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // 搭建界面
    [self setUpView];
}

- (void)setUpView{
    // 添加左邊的View
    UIView *leftV = [[UIView alloc] initWithFrame:self.view.bounds];
    // 設(shè)置左邊view的背景色為藍(lán)色
    leftV.backgroundColor = [UIColor blueColor];
    [self.view addSubview:leftV];
    // 添加右邊的View
    UIView *rightV = [[UIView alloc] initWithFrame:self.view.bounds];
    // 設(shè)置右邊view的背景色為綠色
    rightV.backgroundColor = [UIColor greenColor];
    self.rightV = rightV;
    [self.view addSubview:rightV];
    // 添加中間的View(中間一個(gè)最后添加,顯示到最外面.)
    UIView *mainV = [[UIView alloc] initWithFrame:self.view.bounds];
    // 設(shè)置中間view的背景色為紅色
    mainV.backgroundColor = [UIColor redColor];
    self.mainV = mainV;
    [self.view addSubview:mainV];
}
@end

第二步.添加手勢(shì):

- (void)viewDidLoad {
    [super viewDidLoad];
    // 搭建界面
    [self setUpView];
    // 創(chuàng)建拖動(dòng)手勢(shì)
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    // 添加手勢(shì)
    [self.mainV addGestureRecognizer:pan];
}

 // 實(shí)現(xiàn)手勢(shì)方法:
// 當(dāng)手指拖動(dòng)時(shí)調(diào)用.
-(void)pan:(UIPanGestureRecognizer *)pan{
    // 獲取手指在屏幕上面的偏移量
    CGPoint transP = [pan translationInView:self.mainV];
    // 在這里為什么不用Transform,是因?yàn)槲覀円苿?dòng)時(shí),要改變的尺寸大小.用Transform只能改變它的位置.
    // self.mainV.transform  = CGAffineTransformTranslate(self.mainV.transform, transP.x, 0);

    // 計(jì)算mainV的Frame
    self.mainV.frame = [self frameWithOffsetX:transP.x];
    // 每次移動(dòng)時(shí)判斷當(dāng)前MainV的x值是大于0還是小于0.如果是大于0 , 顯示左邊,小于0 顯示右邊
    if (self.mainV.frame.origin.x > 0) {
        self.rightV.hidden = YES;
    }else if(self.mainV.frame.origin.x < 0){
        self.rightV.hidden = NO;
    }
    // 注意要做復(fù)位
    [pan setTranslation:CGPointZero inView:self.mainV];
}

// 根據(jù)偏移量計(jì)算mainV的frame.
- (CGRect)frameWithOffsetX:(CGFloat)offsetX{
    // 取出最原始的Frame
    CGRect frame = self.mainV.frame;
    frame.origin.x += offsetX;
    // 獲取屏幕的寬度

    // (計(jì)算Y值如果下圖:找最大值.當(dāng)Main.x拖動(dòng)最大的時(shí)候,Main.y值也最大.main.x最大為屏幕的寬度)
    // 設(shè)定一個(gè)最大Y值MaxY為100,正好.當(dāng)max.x為屏幕的寬度時(shí),最大Y等于100
    // 所以Y值等于 main.y = main.x * maxY / ScreenW;
    // 有可能frame.origin.x有可能是小于0,小于0的話, 得出的Y值就會(huì)小于0,小于0就會(huì)出現(xiàn), 紅色的View向上走.
    // 對(duì)結(jié)果取絕對(duì)值.
    frame.origin.y =  fabs(frame.origin.x * maxY / screenW);
    // 計(jì)算frame的高度(當(dāng)前Main的高度等于屏幕的高度減去兩倍的Y值.)
    frame.size.height = screenH - 2 * frame.origin.y;
    // 返回計(jì)算好的frame.
    return frame;
}
計(jì)算Y值.png
計(jì)算高度.png

第三步:當(dāng)手指松開時(shí)做到自動(dòng)定位.

// 當(dāng)手指拖動(dòng)時(shí)調(diào)用.
-(void)pan:(UIPanGestureRecognizer *)pan{
    // 獲取手指在屏幕上面的偏移量
    CGPoint transP = [pan translationInView:self.mainV];

    // 計(jì)算mainV的Frame
    self.mainV.frame = [self frameWithOffsetX:transP.x];
    // 每次移動(dòng)時(shí)判斷當(dāng)前MainV的x值是大于0還是小于0.如果是大于0 , 顯示左邊,小于0 顯示右邊
    if (self.mainV.frame.origin.x > 0) {
        self.rightV.hidden = YES;
    }else if(self.mainV.frame.origin.x < 0){
        self.rightV.hidden = NO;
    }
    // 判斷手指的狀態(tài)
    if(pan.state == UIGestureRecognizerStateEnded){
        // 當(dāng)手指松開時(shí)進(jìn)入執(zhí)行
        // 記錄最終判斷結(jié)果后.定位的值.
        CGFloat target = 0;
        // 當(dāng)手指松開,要判斷MainV的x值是否大于屏幕的一半.如果大于屏幕一半時(shí), 自動(dòng)定位到右邊一個(gè)位置.
        if (self.mainV.frame.origin.x > screenW * 0.5) {
            target = targetR;
        }else if(CGRectGetMaxX(self.mainV.frame) < screenW * 0.5){
            // 當(dāng)手指松開,要判斷MainV的最大的X值是否小于屏幕的一半.如果小于屏幕的一半時(shí), 自動(dòng)定位到左邊的位置.
            target = targetL;
        }
        // 最終定位的x值 - 當(dāng)前的main.x的值.求出偏移量.使其定位
        CGFloat offsetX = target - self.mainV.frame.origin.x;
        // 根據(jù)偏移量設(shè)置mainV的frame值
        CGRect frame = [self frameWithOffsetX:offsetX];
        [UIView animateWithDuration:0.25 animations:^{
             // 伴隨動(dòng)畫設(shè)置frame
            self.mainV.frame = frame;
        }];
    }
    // 注意要做復(fù)位
    [pan setTranslation:CGPointZero inView:self.mainV];
}
求出偏移量.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俄删,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畴椰,老刑警劉巖臊诊,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異斜脂,居然都是意外死亡抓艳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門帚戳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壶硅,“玉大人,你說我怎么就攤上這事销斟÷罚” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵蚂踊,是天一觀的道長约谈。 經(jīng)常有香客問我,道長犁钟,這世上最難降的妖魔是什么棱诱? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮涝动,結(jié)果婚禮上迈勋,老公的妹妹穿的比我還像新娘。我一直安慰自己醋粟,他們只是感情好靡菇,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著米愿,像睡著了一般厦凤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上育苟,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天较鼓,我揣著相機(jī)與錄音,去河邊找鬼违柏。 笑死博烂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漱竖。 我是一名探鬼主播禽篱,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼闲孤!你這毒婦竟也來了谆级?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤讼积,失蹤者是張志新(化名)和其女友劉穎肥照,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勤众,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舆绎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了们颜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吕朵。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窥突,靈堂內(nèi)的尸體忽然破棺而出努溃,到底是詐尸還是另有隱情,我是刑警寧澤阻问,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布梧税,位于F島的核電站,受9級(jí)特大地震影響称近,放射性物質(zhì)發(fā)生泄漏第队。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一刨秆、第九天 我趴在偏房一處隱蔽的房頂上張望凳谦。 院中可真熱鬧,春花似錦衡未、人聲如沸尸执。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剔交。三九已至,卻和暖如春改衩,著一層夾襖步出監(jiān)牢的瞬間岖常,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工葫督, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竭鞍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓橄镜,卻偏偏與公主長得像偎快,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洽胶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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