網站首頁 編程語言 正文
本文實例為大家分享了iOS實現可拖動的浮動菜單的具體代碼,供大家參考,具體內容如下
實現一個可拖動的浮動菜單,效果如下:
這個設置圖標是可以全屏拖動的,點擊一下,可以出現一排設置按鈕,可以用來進行功能的開關切換。
廢話不多說了,上代碼:
//
// ?DragMenuView.h
//
// ?Created by Scott on 15-7-27.
// ?Copyright (c) 2015年 yshen. All rights reserved.
//
?
#import <UIKit/UIKit.h>
?
@interface DragMenuView : UIView
{
? ? UIButton ? ?*m_selectBtn;
? ? UIView ? ? ?*m_contentView;
}
?
-(id)initDragMenuView;
@end
很簡單的頭文件,就兩個變量,一個初始化函數。
m_selectBtn是一個按鈕控件,這個控件用來顯示上圖中那個螺絲刀和扳手的圖片,它可以被任意拖動,只要點擊它,就可以打開其他設置按鈕。
m_contentView
initDragMenuView這個函數是這個類唯一的一個自有函數,它用來創建這個浮動菜單,并初始化浮動菜單。
下面是實現文件:
//
// ?DragMenuView.m
// ?
//
// ?Created by Scott on 15-7-27.
// ?Copyright (c) 2015年 yshen. All rights reserved.
//
?
#import <QuartzCore/QuartzCore.h>
#import "DragMenuView.h"
?
?
#define MAX_WIDTH ? ? ? ? ? 48
#define MAX_HEIGHT ? ? ? ? ?48
#define SPLIT_SPACE ? ? ? ? 5
#define SETTING_COUNT ? ? ? 1
?
@implementation DragMenuView
@synthesize bRotation;
?
- (id)initDragMenuView {
? ? CGRect mainRect = [[UIScreen mainScreen] bounds];
? ? self = [super initWithFrame:CGRectMake(mainRect.size.width - MAX_WIDTH, /*mainRect.size.height / 2 - MAX_HEIGHT / 2*/50, MAX_WIDTH, MAX_HEIGHT)];
? ? if (self)
? ? {
? ? ? ? // Initialization code
? ? ? ? self.backgroundColor = [UIColor clearColor];
? ? ? ??
? ? ? ? m_selectBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, MAX_WIDTH, MAX_HEIGHT)];
? ? ? ? [m_selectBtn setBackgroundImage:[UIImage imageNamed:@"select.png"] forState:UIControlStateNormal];
? ? ? ? [m_selectBtn addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
? ? ? ? [self insertSubview:m_selectBtn atIndex:9500];
? ? ? ??
? ? ? ? m_contentView = [[UIView alloc] initWithFrame:CGRectMake(MAX_WIDTH + SPLIT_SPACE, 0, MAX_WIDTH * SETTING_COUNT, MAX_HEIGHT)];
? ? ? ? m_contentView.userInteractionEnabled = YES;
? ? ? ? m_contentView.hidden = YES;
? ? ? ? //m_contentView.backgroundColor = [UIColor grayColor];
? ? ? ??
? ? ? ? UIButton *setting = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, MAX_WIDTH, MAX_HEIGHT)];
? ? ? ? [setting setEnabled:NO];
? ? ? ? [setting setSelected:NO];
? ? ? ? [setting setBackgroundImage:[UIImage imageNamed:@"mic.png"] forState:UIControlStateNormal];
? ? ? ? [setting addTarget:self action:@selector(clickVoice:) forControlEvents:UIControlEventTouchUpInside];
? ? ? ? [m_contentView addSubview:setting];
/*
? ? ? ? setting = [[UIButton alloc] initWithFrame:CGRectMake(MAX_HEIGHT, 0, MAX_HEIGHT, MAX_HEIGHT)];
? ? ? ? [setting setBackgroundImage:[UIImage imageNamed:@"mic.png"] forState:UIControlStateNormal];
? ? ? ? [setting addTarget:self action:@selector(clickAudio:) forControlEvents:UIControlEventTouchUpInside];
? ? ? ? [m_contentView addSubview:setting];
? ? ? ??
? ? ? ? setting = [[UIButton alloc] initWithFrame:CGRectMake(MAX_HEIGHT * 2, 0, MAX_HEIGHT, MAX_HEIGHT)];
? ? ? ? [setting setBackgroundImage:[UIImage imageNamed:@"mic.png"] forState:UIControlStateNormal];
? ? ? ? [setting addTarget:self action:@selector(clickAudio:) forControlEvents:UIControlEventTouchUpInside];
? ? ? ? [m_contentView addSubview:setting];
? ? ? ??
? ? ? ? setting = [[UIButton alloc] initWithFrame:CGRectMake(MAX_HEIGHT * 3, 0, MAX_HEIGHT, MAX_HEIGHT)];
? ? ? ? [setting setBackgroundImage:[UIImage imageNamed:@"mic.png"] forState:UIControlStateNormal];
? ? ? ? [setting addTarget:self action:@selector(clickAudio:) forControlEvents:UIControlEventTouchUpInside];
? ? ? ? [m_contentView addSubview:setting];
*/
? ? ? ? [self insertSubview:m_contentView belowSubview:m_selectBtn];
? ? }
? ??
? ? return self;
}
-(void)layoutMenuView:(BOOL)bShow { // 用戶點擊設置按鈕時,需要彈出或者隱藏設置功能視圖。這個視圖的顯示因為有邊界問題,所以需要一些算法調整顯示位置
? ? CGRect mainRect = [[UIScreen mainScreen] bounds];
? ? CGRect viewRect = [self frame];
? ??
? ? int x = 0, y = viewRect.origin.y, w = 0, h = MAX_HEIGHT;
? ? if (bShow) // 顯示
? ? {
? ? ? ? w = (MAX_WIDTH * (SETTING_COUNT + 1) + SPLIT_SPACE);
? ? ? ? if ((viewRect.origin.x + w) > mainRect.size.width) //右邊可顯示區域不夠顯示,需要切換到左邊來顯示
? ? ? ? {
? ? ? ? ? ? x = viewRect.origin.x - w + MAX_WIDTH;
? ? ? ? ? ? self.frame = CGRectMake(x, y, w, h);
? ? ? ? ? ? m_contentView.frame = CGRectMake(0, 0, MAX_WIDTH * SETTING_COUNT, MAX_HEIGHT);
? ? ? ? ? ? m_selectBtn.frame = CGRectMake(MAX_WIDTH * SETTING_COUNT + SPLIT_SPACE, 0, MAX_WIDTH, MAX_HEIGHT);
? ? ? ? }
? ? ? ? else // 右邊顯示區域夠了,則直接在右邊顯示
? ? ? ? {
? ? ? ? ? ? x = viewRect.origin.x;
? ? ? ? ? ? self.frame = CGRectMake(x, y, w, h);
? ? ? ? ? ? m_selectBtn.frame = CGRectMake(0, 0, MAX_WIDTH, MAX_HEIGHT);
? ? ? ? ? ? m_contentView.frame = CGRectMake(MAX_WIDTH + SPLIT_SPACE, 0, MAX_WIDTH * SETTING_COUNT, MAX_HEIGHT);
? ? ? ? }
? ? }
? ? else //隱藏
? ? {
? ? ? ? w = MAX_WIDTH;
? ? ? ? CGRect btnRect = m_selectBtn.frame;
? ? ? ? if (btnRect.origin.x == 0) //如果是直接右邊顯示的,則調整寬度即可隱藏復原
? ? ? ? {
? ? ? ? ? ? x = viewRect.origin.x;
? ? ? ? ? ? self.frame = CGRectMake(x, y, w, h);
? ? ? ? }
? ? ? ? else ?// 如果是因為可顯示區域不夠,而調整到左邊來顯示的話,則需要調整X坐標和寬度。另外還需要重新調整子視圖的位置。
? ? ? ? {
? ? ? ? ? ? x = viewRect.origin.x + (MAX_WIDTH * SETTING_COUNT + SPLIT_SPACE);
? ? ? ? ? ? self.frame = CGRectMake(x, y, w, h);
? ? ? ? ? ? m_selectBtn.frame = CGRectMake(0, 0, MAX_WIDTH, MAX_HEIGHT);
? ? ? ? }
? ? }
}
-(void)click:(id)sender { // 設置按鈕的響應動作,根據當前位置和邊界情況來顯示設置視圖
? ? m_contentView.hidden = !m_contentView.hidden;
? ? [self layoutMenuView:!(m_contentView.hidden)];
}
-(void)clickVoice:(id)sender { // 設置視圖中,功能按鈕的響應函數
? ? UIButton *btn = (UIButton*)sender;
? ? [btn setSelected:![btn isSelected]];
? ? [btn setAlpha:([btn isSelected]) ? 0.5f : 1.0f]; // 為了區分點擊和未點擊狀態
? ? // do somthing......
}
@end
實現代碼也就那么一點點,都是很簡單的代碼。
然后在ViewController中加上變量,并創建這個浮動菜單:
DragMenuView ?*m_dragMenu;
?
? ? //
? ? // whether support floating menu
? ? // add by yshen on 2015-7-27
? ? //
? ? m_dragMenu = [[DragMenuView alloc]initDragMenuView];
? ? UIPanGestureRecognizer *gesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(viewDidDragged:)];
? ? [gesture setMaximumNumberOfTouches:1];
? ? [gesture setMinimumNumberOfTouches:1];
? ? [m_dragMenu addGestureRecognizer:gesture];
? ? [self.view insertSubview:m_dragMenu atIndex:9999];
? ? m_dragMenu.hidden = NO;
手勢識別函數:
-(void)viewDidDragged:(UIPanGestureRecognizer*)gesture {
? ? if (gesture.state == UIGestureRecognizerStateChanged || gesture.state == UIGestureRecognizerStateEnded)
? ? {
? ? ? ? CGPoint offset = [gesture translationInView:self.view];
? ? ? ? int x = m_dragMenu.center.x + offset.x;
? ? ? ? int y = m_dragMenu.center.y + offset.y;
? ? ? ? [m_dragMenu setCenter:CGPointMake(x, y)];
? ? ? ? [gesture setTranslation:CGPointMake(0, 0) inView:self.view];
? ? }
}
浮動菜單置頂:
[self.view bringSubviewToFront:m_dragMenu];
原文鏈接:https://blog.csdn.net/shenyi0106/article/details/47106771
相關推薦
- 2022-02-18 yml配置文件中存在@無法識別,報錯:found character ‘@‘ that cannot
- 2022-04-25 C#利用NPOI操作Excel(單元格設置)_C#教程
- 2022-06-22 使用Git向GitHub上傳更新內容_其它綜合
- 2022-09-01 C語言中static與sizeof查缺補漏篇_C 語言
- 2022-06-02 Apache?Hudi基于華米科技應用湖倉一體化改造_服務器其它
- 2022-08-20 python操作csv格式文件之csv.DictReader()方法_python
- 2021-12-16 jquery+swiper組件實現時間軸滑動年份tab切換效果_jquery
- 2022-09-12 C++數據結構哈希表詳解_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支