iOS Kingdom — 滑動選單
左滑選單是我們在開發 App 應用時常用的一種展示選單方式,下面我們來看下我們這次要實現的目標。。。
.實現原理
先在你的檢視的左邊加上一個 subView ,然後再在你的檢視上加上左滑手勢,當你的選單向左移動時,你檢視上的所有子 view 都跟著動起來。
.實現準備
1、先建立一個 UIView 的分類 UIView+Menu.h
2、實現一個為 View 新增選單的方法
- (void)addMenu:(UIView *)view;
3、建立一些例項變數來儲存我們須要的值
UIView *menu; // 選單檢視
BOOL isShow; // 選單是否已出現
BOOL isAnimation; // 動畫是否完成
CGPoint beginPoint; // 記錄第一個觸屏點
CGPoint changePoint; // 記錄滑動到的點
CGRect initMenuRect; // 選單檢視的初始值
SwipeLocation swipeLocation;//滑動方向
4、滑動方向
typedef enum {
SwipeInit,
SwipeLeft,
SwipeRight,
SwipeUp,
SwipeDown
}SwipeLocation;
.實現
- (void)addMenu:(UIView *)view{
menu = view;
// 將選單放在 view 的左邊
menu.x = -menu.width;
self.layer.masksToBounds = YES;
[self addSubview:menu];
initMenuRect = menu.frame;
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[self addGestureRecognizer:pan];
}
新增 pan: 方法來實現滑動
- (void)pan:(UIPanGestureRecognizer *)gesture{
CGPoint point = [gesture translationInView:self];
// 滑動百分比
CGFloat precent = point.x/self.width;
switch (gesture.state) {
case UIGestureRecognizerStateBegan: {
swipeLocation = SwipeInit;
beginPoint = point;
break;
}
case UIGestureRecognizerStateChanged: {
// 記錄滑動點
changePoint = point;
// 判斷滑動方向
[self judgeDirection];
if (menu.x < - menu.width || menu.x > 0) {
// 選單已收起不能再左滑,已出現不能再右滑
return;
}
for (UIView *view in [self subviews]) {
if (isShow) {
// hide
if (precent > 0) {
return;
}
if (menu.x > -menu.width) {
view.x += menu.width*precent - menu.x;
}
}else {
// show
if (precent < 0){
return;
}
if (menu.x < 0) {
view.x += (menu.width*precent - (menu.x - initMenuRect.origin.x));
}
}
}
break;
}
default:{
// 滑動的百分比大於 0.3 時自動收起或顯示選單
if (fabs(precent) > 0.3) {
if (isShow) {
if (swipeLocation == SwipeLeft) {
isShow = YES;
[self hideMenuDuration:0.2];
}else {
[self leftAnimationDuration:0.2];
}
}else {
if (swipeLocation == SwipeRight) {
[self leftAnimationDuration:0.2];
}else {
isShow = YES;
[self hideMenuDuration:0.2];
}
}else {
if (isShow) {
[self leftAnimationDuration:0.2];
}else {
isShow = YES;
[self hideMenuDuration:0.2];
}
}
break;
}
}
判斷滑動方向
/**
* 判斷滑動手勢
*/
- (void)judgeDirection{
if (showLocation == Left || showLocation == Right) {
if (changePoint.x - beginPoint.x > 0) {
swipeLocation = SwipeRight;
}else {
swipeLocation = SwipeLeft;
}
}else {
if (changePoint.y - beginPoint.y > 0) {
swipeLocation = SwipeDown;
}else {
swipeLocation = SwipeUp;
}
}
}
選單從左邊出現動畫
- (void)leftAnimationDuration:(NSTimeInterval)duration{
isAnimation = YES;
[UIView animateWithDuration:duration
delay:0
options:UIViewAnimationOptionCurveEaseIn
animations:^{
for (UIView *subView in [self subviews]) {
subView.x += (0 - menu.x);
}
} completion:^(BOOL finished) {
isShow = finished;
isAnimation = !finished;
}];
}
隱藏動畫
- (void)hideMenuDuration:(NSTimeInterval)duration{
if (!isShow || isAnimation) {
return;
}
isAnimation = YES;
for (UIView *view in [self subviews]) {
[UIView animateWithDuration:duration
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
view.x -= (menu.x - initMenuRect.origin.x);
} completion:^(BOOL finished) {
isShow = !finished;
isAnimation = !finished;
}];
}
}
相關文章
- iOS 一個滑動選擇控制元件iOS控制元件
- iOS開發UI篇--一個側滑選單SlidingMenuiOSUI
- CollectionView 單個選項卡的滑動View
- (十)如果實現滑動展示選單效果
- 透明層滑動跟隨導航選單
- css3實現側邊滑動選單CSSS3
- 函式節流實現滑動下拉選單函式
- 用Vue擼一個『A-Z字母滑動檢索選單』Vue
- iOS 實現UINavigation全屏滑動返回(二)iOSUINavigation
- iOS UISlider數值與滑塊聯動iOSUIIDE
- 原生Android 側滑選單實踐(部分)Android
- iOS開發之解決MMDrawerController側滑選單與中心檢視手勢衝突iOSController
- iOS 如何絲滑的側滑返回iOS
- 【Flutter 專題】130 圖解 DraggableScrollableSheet 可手勢滑動的選單欄Flutter圖解
- Flutter | 超簡單仿微信QQ側滑選單元件Flutter元件
- 聊天平臺原始碼,簡單使用 禁止滑動和設定滑動方向原始碼
- 讓web擁有原生手機側滑選單那種順滑外掛Web
- 用ListView簡單實現滑動列表View
- 利用DrawerLayout實現側滑選單學習總結
- [MAUI]模仿iOS多工切換卡片滑動的互動實現UIiOS
- 我選單為什麼跟著滑動了?!!—— 固定定位為什麼會失效?
- iOS 多選刪除(附tableViewTips及單選刪除)iOSView
- Vue無限滑動周選擇日期的元件Vue元件
- 成品直播原始碼,點選滑動切換效果原始碼
- vant小程式SwipeCell 完美解決滑動單元格右滑無樣式
- 手遊UI互動動作設計研究:點選、滑動與拖拽UI
- JavaScript左右滑動切換的選項卡詳解JavaScript
- jquery 實現滑動條的簡單驗證jQuery
- uniapp---app滑動翻頁(上滑、下滑、左滑、右滑)APP
- iOS 自定義雙向滑塊SlideriOSIDE
- Android 設定TextView滑動滾動條和滑動效果AndroidTextView
- 對滑動視窗單調性的一點思考
- 微信小程式-能左右滑動的訂單列表微信小程式
- 移動端左滑右滑元件元件
- 仿淘寶tabBar點選及滑動時logo和火箭?切換動畫tabBarGo動畫
- Flutter 仿iOS側滑返回案例實現FlutteriOS
- html裡列表滑動刪除的實現如此簡單HTML
- 使用 ActionScript 實現簡單滑動驗證碼識別
- thinkcmf+layui 改為滑動響應,單擊跳轉UI