iOS實(shí)現(xiàn)可拖動(dòng)的浮動(dòng)菜單
本文實(shí)例為大家分享了iOS實(shí)現(xiàn)可拖動(dòng)的浮動(dòng)菜單的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)一個(gè)可拖動(dòng)的浮動(dòng)菜單,效果如下:
這個(gè)設(shè)置圖標(biāo)是可以全屏拖動(dòng)的,點(diǎn)擊一下,可以出現(xiàn)一排設(shè)置按鈕,可以用來(lái)進(jìn)行功能的開(kāi)關(guān)切換。
廢話不多說(shuō)了,上代碼:
// // ?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
很簡(jiǎn)單的頭文件,就兩個(gè)變量,一個(gè)初始化函數(shù)。
m_selectBtn是一個(gè)按鈕控件,這個(gè)控件用來(lái)顯示上圖中那個(gè)螺絲刀和扳手的圖片,它可以被任意拖動(dòng),只要點(diǎn)擊它,就可以打開(kāi)其他設(shè)置按鈕。
m_contentView
initDragMenuView這個(gè)函數(shù)是這個(gè)類唯一的一個(gè)自有函數(shù),它用來(lái)創(chuàng)建這個(gè)浮動(dòng)菜單,并初始化浮動(dòng)菜單。
下面是實(shí)現(xiàn)文件:
// // ?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 { // 用戶點(diǎn)擊設(shè)置按鈕時(shí),需要彈出或者隱藏設(shè)置功能視圖。這個(gè)視圖的顯示因?yàn)橛羞吔鐔?wèn)題,所以需要一些算法調(diào)整顯示位置 ? ? 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) //右邊可顯示區(qū)域不夠顯示,需要切換到左邊來(lái)顯示 ? ? ? ? { ? ? ? ? ? ? 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 // 右邊顯示區(qū)域夠了,則直接在右邊顯示 ? ? ? ? { ? ? ? ? ? ? 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) //如果是直接右邊顯示的,則調(diào)整寬度即可隱藏復(fù)原 ? ? ? ? { ? ? ? ? ? ? x = viewRect.origin.x; ? ? ? ? ? ? self.frame = CGRectMake(x, y, w, h); ? ? ? ? } ? ? ? ? else ?// 如果是因?yàn)榭娠@示區(qū)域不夠,而調(diào)整到左邊來(lái)顯示的話,則需要調(diào)整X坐標(biāo)和寬度。另外還需要重新調(diào)整子視圖的位置。 ? ? ? ? { ? ? ? ? ? ? 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 { // 設(shè)置按鈕的響應(yīng)動(dòng)作,根據(jù)當(dāng)前位置和邊界情況來(lái)顯示設(shè)置視圖 ? ? m_contentView.hidden = !m_contentView.hidden; ? ? [self layoutMenuView:!(m_contentView.hidden)]; } -(void)clickVoice:(id)sender { // 設(shè)置視圖中,功能按鈕的響應(yīng)函數(shù) ? ? UIButton *btn = (UIButton*)sender; ? ? [btn setSelected:![btn isSelected]]; ? ? [btn setAlpha:([btn isSelected]) ? 0.5f : 1.0f]; // 為了區(qū)分點(diǎn)擊和未點(diǎn)擊狀態(tài) ? ? // do somthing...... } @end
實(shí)現(xiàn)代碼也就那么一點(diǎn)點(diǎn),都是很簡(jiǎn)單的代碼。
然后在ViewController中加上變量,并創(chuàng)建這個(gè)浮動(dòng)菜單:
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;
手勢(shì)識(shí)別函數(shù):
-(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]; ? ? } }
浮動(dòng)菜單置頂:
[self.view bringSubviewToFront:m_dragMenu];
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS實(shí)現(xiàn)動(dòng)態(tài)自適應(yīng)標(biāo)簽
這篇文章主要為大家詳細(xì)介紹了iOS動(dòng)態(tài)自適應(yīng)標(biāo)簽的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03iOS仿微博導(dǎo)航欄動(dòng)畫(huà)(CoreGraphics)的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于iOS仿微博導(dǎo)航欄動(dòng)畫(huà)(CoreGraphics)的實(shí)現(xiàn)方法,文章最后給出了完整的示例代碼,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07詳解IOS的Automatically Sign在設(shè)備上打包
本篇教程主要給大家分享了IOS的Automatically Sign如何在設(shè)備上直接打包,有需要的朋友參考學(xué)習(xí)下。2018-01-01iOS11實(shí)現(xiàn)App內(nèi)自動(dòng)連接Wi-Fi的方法
這篇文章主要給大家介紹了關(guān)于iOS11實(shí)現(xiàn)App內(nèi)自動(dòng)連接Wi-Fi的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10詳解iOS AFNetworking取消正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求
這篇文章主要介紹了詳解iOS AFNetworking取消正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06iOS開(kāi)發(fā)教程之UIRefreshControl使用的踩坑指南
UIRefreshControl是iOS6自帶的UITableView下拉刷新控件。下面這篇文章主要給大家介紹了關(guān)于iOS開(kāi)發(fā)教程之UIRefreshControl使用的踩坑指南,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04iOS開(kāi)發(fā)-調(diào)用系統(tǒng)相機(jī)和相冊(cè)獲取照片示例
這篇文章主要介紹了iOS開(kāi)發(fā)-調(diào)用系統(tǒng)相機(jī)和相冊(cè)獲取照片示例的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02