1、容器視圖實現(xiàn)的側(cè)滑示例圖效果如下所示:

容器視圖側(cè)滑效果.gif
2、代碼部分如下所示:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,weak) IBOutlet UIView *containerView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setUpUI];
}
// 當(dāng)用戶觸摸屏幕的時候開始給容器視圖添加手勢
-(void)setUpUI{
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[_containerView addGestureRecognizer:pan];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
[_containerView addGestureRecognizer:tap];
}
// 添加點按手勢
-(void)tap:(UITapGestureRecognizer *)sender{
[UIView animateWithDuration:0.25 animations:^{
_containerView.transform = CGAffineTransformIdentity;
}];
}
// 添加的拖拽手勢
-(void)pan:(UIPanGestureRecognizer *)sender{
//1、獲取拖拽手勢獲取偏移量
CGPoint translate = [sender translationInView:_containerView];
// 2、重置 為什么要重置 因為每一次的偏移都是從屏幕最左邊為起始位置
[sender setTranslation:CGPointZero inView:_containerView];
switch (sender.state) {
case UIGestureRecognizerStateBegan:
case UIGestureRecognizerStateChanged:
{
// 這樣做的好處就是 translate.x 和 _containerView.frame.origin.x
CGFloat destX = translate.x + _containerView.frame.origin.x;
// 限制容器視圖向左移動
if (destX < 0) {
return;
}
// 設(shè)置容器視圖的水平偏移量 每一次的偏移量都是基于上一次的偏移
_containerView.transform = CGAffineTransformTranslate(_containerView.transform,translate.x, 0);
}
break;
case UIGestureRecognizerStateEnded:
{
// 手勢結(jié)束 判斷偏移量距離屏幕中心的位置
CGFloat centerX = [UIScreen mainScreen].bounds.size.width * 0.5;
CGFloat containerX = _containerView.frame.origin.x;
CGFloat destination = centerX + 40;
if (centerX < containerX ) {
[UIView animateWithDuration:0.25 animations:^{
_containerView.transform = CGAffineTransformMakeTranslation(destination, 0);
}];
break;
}
#warning - 這里用到的是switch的穿透效果
}
case UIGestureRecognizerStateFailed:
case UIGestureRecognizerStateCancelled:
{
[UIView animateWithDuration:0.25 animations:^{
// 回到原始位置
_containerView.transform = CGAffineTransformIdentity;
}];
}
break;
default:
break;
}
}
@end
3、說一下實現(xiàn)的思路
3.1、使用側(cè)滑手勢來拿到容器視圖的偏移,然后實現(xiàn)容器視圖的偏移。
根據(jù)側(cè)滑手勢的狀態(tài)分別對容器視圖的側(cè)滑情況進行設(shè)置。側(cè)滑效果把屏幕寬度的1/2的位置作為分界線。側(cè)滑超過屏幕1/2的位置時候,那么就保持這種抽屜的打開效果,如果沒有超過屏幕跨度1/2的時候,就以動畫的效果關(guān)閉抽屜的效果。同時,不允許容器視圖向左側(cè)滑動。接下來就判斷側(cè)滑手勢的狀態(tài),讓容器視圖到達指定的位置。
3.2、在點擊容器視圖的時候,容器視圖回到原始位置,鋪滿整個屏幕。使用的是點擊手勢(UITApGestureRecognizer手勢)。創(chuàng)建手勢對象,添加到要作用的容器視圖上。在點擊手勢的方法選擇器中,執(zhí)行容器視圖的transform方法,來實現(xiàn)容器視圖的平移效果。同時為了保證平移時不顯得那么生硬,就把平移放在UIView動畫中來執(zhí)行。