抽屜效果

思路:跟控制器(rootVc)添加子控制器(下面三個)的view在跟控制器的 view 上面。(注意三個子控制器的 view 添加到 rootVc 的 view 上面的順序不同,側滑出現抽屜的效果也不一樣),給 middleVc 的 view 添加一個滑動的手勢,計算手勢的偏移,修改三個 view 的 frame,在middleVc 的 view 上面添加一個蒙版,添加點擊事件,回到中間的 view。

主要代碼:(添加子控制器的就不寫了)


1.#pragma mark ------>> 給視圖控制器上的? View 添加平移 手勢 以及 遮擋的 MaskView 加點擊手勢 <<------

```

- (void)addOurGestureRecognizer

{

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panContainViewAction:)]; // 右滑動時候? 出來菜單

pan.delegate = self;

[_containerVC.view addGestureRecognizer:pan];

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHiddenMenuAction:)]; // 要是菜單在? 點擊 MaskView 隱藏菜單

[_middleView addGestureRecognizer:tap];

}

```

#pragma mark ------>> 滑動視圖控制器的 View 的時候觸發(fā)方法 <<------

- (void)panContainViewAction:(UIPanGestureRecognizer *)pan

{

// 偏移量

CGPoint offSet = [pan translationInView:_containerVC.view];

// 平移進行時候

if (pan.state == UIGestureRecognizerStateBegan || pan.state == UIGestureRecognizerStateChanged)

{

if (offSet.x > 0)//向右滑動

{

if (self.frame.origin.x == 0)

{

return;

}

CGFloat tempX = self.frame.origin.x + offSet.x;// 算出更新的 x

if (tempX <= 0 )

{// 小于 0 就隨著拖動移動就好

self.frame = CGRectMake(tempX, 0, kScreenWidth, kScreenHeight);

}else

{// 都出來之后 就讓它完全展示就好? 別滑到太靠右地方

self.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);

}

}else

{// 向左滑動

CGFloat tempX = self.frame.origin.x + offSet.x;// 算出更新的 x

self.frame = CGRectMake(tempX, 0, kScreenWidth, kScreenHeight);

}

}else

{// 在這里判斷要 顯示還是隱藏

if (self.frame.origin.x >= - MENU_WIDTH * 0.5)

{

[self inputOfSightMenuView];

}else

{

[self outOfSightMenuView];

}

}

// 清除偏移量

[pan setTranslation:(CGPointZero) inView:_containerVC.view];

//self.maskView.frame = CGRectMake(CGRectGetMaxX(self.frame), 0, kScreenWidth, kScreenHeight);

}

// 點擊遮擋? 收起菜單

- (void)tapHiddenMenuAction:(UITapGestureRecognizer *)tap

{

[self outOfSightMenuView];

}

#pragma mark ------>> MenuView 視圖 移出 或者 移進 視線? <<------

// 放到視線之外

- (void)outOfSightMenuView

{

[UIView animateWithDuration:0.2 animations:^{

self.frame = CGRectMake(- kScreenWidth, 0, kScreenWidth, kScreenHeight);

self.isMenuViewHidden = YES;

self.maskView.hidden = YES;

}];

}

// 放到視線之內

- (void)inputOfSightMenuView

{

[UIView animateWithDuration:0.2 animations:^{

self.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);

} completion:^(BOOL finished) {

self.maskView.hidden = NO;

self.maskView.alpha = 0.6;(自己定)

}];

}

#pragma mark ------>> KVO 監(jiān)控 菜單View 的位置變化 <<------

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

{

if ([keyPath isEqualToString:@"frame"])

{

CGRect newFrame = [change[@"new"] CGRectValue];

CGFloat newFrameX = newFrame.origin.x;

// 判斷是否需要改變 遮擋的透明度

if (newFrameX != - MENU_WIDTH)

{

_maskView.hidden = NO;// 出現遮擋

// 改變遮擋的透明度

_maskView.alpha = (newFrameX + kScreenWidth) / kScreenWidth * 0.8;

}else

{

_maskView.hidden = YES;

}

}

}

#pragma mark ------>> 手勢沖突時候 調用的手勢代理 <<------

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

{

if ([otherGestureRecognizer.view isKindOfClass:[UITableView class]]) {

return NO;

}

return YES;

}

```

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 一.RESideMenu 現在大多App的主框架都是UITabBarController加若干導航控制器或者是帶有...
    laitys閱讀 868評論 0 4
  • 1)雙向抽屜視圖 2)抽屜動畫 3)雙向抽屜視圖帶縮放效果 4)抽屜視圖動畫縮放 #import "ApDrawe...
    衹氏閱讀 1,960評論 0 0
  • 目前市場上很多APP都有抽屜效果的界面,界面大同小異,一下是我個人分析和實現的抽屜效果,我是以代碼加注釋的方式分析...
    coderwx閱讀 791評論 0 0
  • //定義屬性宏 #define LWKeyPath(objc, keyPath) @(((void)objc.ke...
    年輕在于折騰閱讀 1,942評論 0 3
  • #import "SSYViewController.h" #define ScreenW [UIScreen m...
    iOSkiller閱讀 384評論 0 0

友情鏈接更多精彩內容