最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS實(shí)現(xiàn)可拖動(dòng)的浮動(dòng)菜單

 更新時(shí)間:2022年08月08日 08:38:32   作者:shenyi0106  
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)可拖動(dòng)的浮動(dòng)菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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è)置按鈕,可以用來進(jìn)行功能的開關(guān)切換。

廢話不多說了,上代碼:

//
// ?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

很簡單的頭文件,就兩個(gè)變量,一個(gè)初始化函數(shù)。

m_selectBtn是一個(gè)按鈕控件,這個(gè)控件用來顯示上圖中那個(gè)螺絲刀和扳手的圖片,它可以被任意拖動(dòng),只要點(diǎn)擊它,就可以打開其他設(shè)置按鈕。

m_contentView

initDragMenuView這個(gè)函數(shù)是這個(gè)類唯一的一個(gè)自有函數(shù),它用來創(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)橛羞吔鐔栴},所以需要一些算法調(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ū)域不夠顯示,需要切換到左邊來顯示
? ? ? ? {
? ? ? ? ? ? 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)整到左邊來顯示的話,則需要調(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)前位置和邊界情況來顯示設(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),都是很簡單的代碼。

然后在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ù):

-(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];

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS實(shí)現(xiàn)聊天輸入框功能

    iOS實(shí)現(xiàn)聊天輸入框功能

    大家都經(jīng)常使用微信聊天功能,在沒事的時(shí)候就會(huì)想微信聊天輸入框的實(shí)現(xiàn)過程,很無聊吧。今天小編抽空給大家分享iOS實(shí)現(xiàn)聊天輸入框功能,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-02-02
  • iOS路由(MGJRouter)的實(shí)現(xiàn)

    iOS路由(MGJRouter)的實(shí)現(xiàn)

    這篇文章主要介紹了iOS路由(MGJRouter)的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • 解決iOS13 無法獲取WiFi名稱(SSID)問題

    解決iOS13 無法獲取WiFi名稱(SSID)問題

    這篇文章主要介紹了解決iOS13 無法獲取WiFi名稱(SSID)問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • IOS百度地圖導(dǎo)航開發(fā)功能實(shí)現(xiàn)簡述

    IOS百度地圖導(dǎo)航開發(fā)功能實(shí)現(xiàn)簡述

    百度地圖導(dǎo)航非常實(shí)用,那么基于代碼是如何實(shí)現(xiàn)的呢,下面通過本文給大家介紹IOS百度地圖導(dǎo)航開發(fā)功能實(shí)現(xiàn)簡述,需要的朋友可以參考下本文
    2016-03-03
  • 關(guān)于ios配置微信config出現(xiàn)驗(yàn)簽失敗的問題解決

    關(guān)于ios配置微信config出現(xiàn)驗(yàn)簽失敗的問題解決

    這篇文章主要介紹了關(guān)于ios配置微信config出現(xiàn)驗(yàn)簽失敗的問題解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • iOS UITextView 首行縮進(jìn) 撤銷輸入 反撤銷輸入的實(shí)現(xiàn)代碼

    iOS UITextView 首行縮進(jìn) 撤銷輸入 反撤銷輸入的實(shí)現(xiàn)代碼

    本文是腳本之家小編給大家分享的iOS UITextView 首行縮進(jìn) 撤銷輸入 反撤銷輸入的實(shí)現(xiàn)代碼,需要的朋友參考下吧
    2017-09-09
  • ios百度地圖的使用(普通定位、反地理編碼)

    ios百度地圖的使用(普通定位、反地理編碼)

    iOS定位 - 普通定位(沒有地圖) - 反地理編碼(得到具體位置)使用代碼如何實(shí)現(xiàn)呢,下面小編就給大家詳解ios百度地圖的使用(普通定位、反地理編碼,有需要的朋友可以參考下
    2015-08-08
  • iOS中修改UITextField占位符字體顏色的方法總結(jié)

    iOS中修改UITextField占位符字體顏色的方法總結(jié)

    這篇文章給大家分享了iOS中修改UITextField占位符字體顏色的三個(gè)方法,分別是使用attributedPlaceholder屬性、重寫drawPlaceholderInRect方法和修改UITextField內(nèi)部placeholderLaber的顏色,下面我們一起來看看詳細(xì)的方法介紹。
    2016-09-09
  • iOS13適配深色模式(Dark Mode)的實(shí)現(xiàn)

    iOS13適配深色模式(Dark Mode)的實(shí)現(xiàn)

    這篇文章主要介紹了iOS13適配深色模式(Dark Mode)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 實(shí)例講解iOS音樂播放器DOUAudioStreamer用法

    實(shí)例講解iOS音樂播放器DOUAudioStreamer用法

    本篇文章給大家通過實(shí)例講解了iOS音樂播放器DOUAudioStreamer用法以及分享了實(shí)例代碼,一起學(xué)習(xí)參考下吧。
    2017-12-12

最新評論

宣武区| 东台市| 洪雅县| 梁山县| 乡宁县| 张家港市| 广饶县| 沙雅县| 吴川市| 庆城县| 凌云县| 内江市| 德令哈市| 庆安县| 宁安市| 喀什市| 中方县| 静乐县| 荆州市| 靖安县| 建德市| 白玉县| 金门县| 凤山市| 海门市| 柳江县| 孟津县| 龙口市| 汶川县| 新疆| 郓城县| 汶上县| 衡山县| 化州市| 九龙县| 吉木乃县| 当涂县| 泉州市| 花垣县| 台山市| 江孜县|