導(dǎo)讀
左右側(cè)滑是App開發(fā)中非常常見的功能,目前大部分App都有實(shí)現(xiàn)這個(gè)功能.
為提高開發(fā)效率,筆者對(duì)左右側(cè)滑功能進(jìn)行了封裝.代碼簡(jiǎn)潔,思路清晰易懂,外界只需調(diào)用兩個(gè)接口,即可實(shí)現(xiàn)左右側(cè)滑功能!!!
源碼鏈接https://github.com/HelloYeah/HYSideViewController
簡(jiǎn)單介紹一下這個(gè)側(cè)滑的使用
1-> 側(cè)滑并設(shè)置側(cè)滑動(dòng)畫時(shí)間
/** 側(cè)滑并設(shè)置側(cè)滑動(dòng)畫時(shí)間 */
- (void)sideAnimateDuration:(NSTimeInterval)duration SideDirection:(HYSideDirection)sideDirectionType;
2-> 設(shè)置側(cè)滑控制器,可只實(shí)現(xiàn)一側(cè),也可以都實(shí)現(xiàn)
/** 設(shè)置左側(cè)的控制器 */
- (void)setLeftSideVC:(UIViewController *)leftSideVC;
/** 設(shè)置右側(cè)的控制器 */
- (void)setRightSideVC:(UIViewController *)rightSideVC;
效果圖
-
集成一側(cè)側(cè)滑
1.gif -
同時(shí)集成左右側(cè)滑
2.gif
實(shí)現(xiàn)思路及主要代碼詳解
思路簡(jiǎn)述
把將要側(cè)滑出來(lái)的View添加到[UIApplication sharedApplication].keyWindow上,并用一個(gè)控制器來(lái)對(duì)這個(gè)View進(jìn)行管理.如果是向右滑動(dòng),則添加到左側(cè).向右滑動(dòng)時(shí),將keyWindow上的所有子控件進(jìn)行向右平移.我們想要的側(cè)滑效果即可出來(lái)了.
主要代碼
1.外界通過(guò)調(diào)用setter方法,添加側(cè)滑控制器
- (void)setLeftSideVC:(UIViewController *)leftSideVC{
_leftSideVC = leftSideVC;
[[UIApplication sharedApplication].keyWindow addSubview:self.leftSideView];
CGRect rect = self.leftSideView.bounds;
CGFloat sideWidth = self.leftSideView.bounds.size.width;
sideWidth = rect.size.width;
self.leftSideView.frame = CGRectMake(- rect.size.width, 0, rect.size.width, [UIScreen mainScreen].bounds.size.height);
}
- (void)setRightSideVC:(UIViewController *)rightSideVC{
_rightSideVC = rightSideVC;
[[UIApplication sharedApplication].keyWindow addSubview:self.rightSideView];
CGRect rect = self.rightSideView.bounds;
CGFloat sideWidth = self.rightSideView.bounds.size.width;
sideWidth = rect.size.width;
self.rightSideView.frame = CGRectMake([UIScreen mainScreen].bounds.size.width , 0 , rect.size.width, [UIScreen mainScreen].bounds.size.height);
}
2.外界調(diào)用側(cè)滑接口,側(cè)滑并設(shè)置側(cè)滑動(dòng)畫時(shí)間.并相應(yīng)的調(diào)整狀態(tài)欄樣式.
- (void)sideAnimateDuration:(NSTimeInterval)duration SideDirection:(HYSideDirection)sideDirectionType{
//修改狀態(tài)欄樣式
if([UIApplication sharedApplication].statusBarStyle == UIStatusBarStyleDefault){
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
}else{
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
}
if (self.isSide) {
self.isSide = NO;
[UIView animateWithDuration:duration animations:^{
for (UIView * view in [UIApplication sharedApplication].keyWindow.subviews) {
view.transform = CGAffineTransformIdentity;
}
}completion:^(BOOL finished) {
[self hiddenSideView];
}];
return;
}
self.isSide = YES;
if (sideDirectionType == HYSideDirectionLeft){
self.rightSideView.hidden = NO;
}else{
self.leftSideView.hidden = NO;
}
CGFloat _sideWidth = (sideDirectionType == HYSideDirectionRight) ? self.leftSideView.frame.size.width : - self.rightSideView.frame.size.width;
[UIView animateWithDuration:duration animations:^{
[self sideDistance:_sideWidth];
}];
}
3.核心的代碼是滑動(dòng)手勢(shì)的回調(diào)方法,滑動(dòng)時(shí),根據(jù)滑動(dòng)方向,滑動(dòng)距離兩個(gè)條件做相應(yīng)的事件處理.滑動(dòng)停止時(shí),同樣根據(jù)滑動(dòng)方向,滑動(dòng)距離兩個(gè)條件,來(lái)判斷是否需要將View側(cè)滑出來(lái).
-
手勢(shì)滑動(dòng)時(shí),根據(jù)滑動(dòng)方向,滑動(dòng)距離兩個(gè)條件做相應(yīng)的事件處理
手勢(shì)滑動(dòng).png -
手勢(shì)停止時(shí),根據(jù)滑動(dòng)方向,滑動(dòng)距離兩個(gè)條件,來(lái)判斷是否需要將View側(cè)滑出來(lái),還是恢復(fù)原狀
手勢(shì)停止.png



