iOS 懸浮按鈕的實現(xiàn)

項目中為了語音功能的更好體驗,加了個懸浮按鈕腻菇,網(wǎng)上找了好久耗式,最終集成了一個懸浮按鈕,效果還不錯五芝。

參考Demo

可拖動的按鈕
按鈕的拖動和吸附在父控件邊緣

懸浮按鈕.gif

自定義個UIButton


- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

//觸摸-清掃
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    MoveEnabled = NO;
    [super touchesBegan:touches withEvent:event];
    if (!MoveEnable) {
        return;
    }
    UITouch *touch = [touches anyObject];
    beginpoint = [touch locationInView:self];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    
    MoveEnabled = YES;//單擊事件可用
    
    if (!MoveEnable) {
        return;
    }
    UITouch *touch = [touches anyObject];
    CGPoint currentPosition = [touch locationInView:self];
    //偏移量
    float offsetX = currentPosition.x - beginpoint.x;
    float offsetY = currentPosition.y - beginpoint.y;
    //移動后的中心坐標
    self.center = CGPointMake(self.center.x + offsetX, self.center.y + offsetY);
    
    //x軸左右極限坐標
    if (self.center.x > (self.superview.frame.size.width-self.frame.size.width/2)) {
        CGFloat x = self.superview.frame.size.width-self.frame.size.width/2;
        self.center = CGPointMake(x, self.center.y + offsetY);
    }else if (self.center.x < self.frame.size.width/2){
        CGFloat x = self.frame.size.width/2;
        self.center = CGPointMake(x, self.center.y + offsetY);
    }
    
    //y軸上下極限坐標
    if (self.center.y > (self.superview.frame.size.height-self.frame.size.height/2)) {
        CGFloat x = self.center.x;
        CGFloat y = self.superview.frame.size.height-self.frame.size.height/2;
        self.center = CGPointMake(x, y);
    }else if (self.center.y <= self.frame.size.height/2){
        CGFloat x = self.center.x;
        CGFloat y = self.frame.size.height/2;
        self.center = CGPointMake(x, y);
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!MoveEnable) {
        return;
    }
    if (self.center.x >= self.superview.frame.size.width/2) {//向右側移動
        //偏移動畫
        [UIView beginAnimations:@"move" context:nil];
        [UIView setAnimationDuration:1];
        [UIView setAnimationDelegate:self];
        self.frame=CGRectMake(335.f,self.center.y-20, 40.f,40.f);
        //提交UIView動畫
        [UIView commitAnimations];
    }else{//向左側移動
        
        [UIView beginAnimations:@"move" context:nil];
        [UIView setAnimationDuration:1];
        [UIView setAnimationDelegate:self];
        self.frame=CGRectMake(0.f,self.center.y-20, 40.f,40.f);
        //提交UIView動畫
        [UIView commitAnimations];
        
    }
    
    //不加此句話痘儡,UIButton將一直處于按下狀態(tài)
    [super touchesEnded: touches withEvent: event];
    
}

//外界因素取消touch事件,如進入電話
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    
}

MyButton實現(xiàn)

#import "ViewController.h"

#import "MyButton.h"
@interface ViewController ()
{
    UIView *tabBarView;
    MyButton *myButton;
    BOOL flag; //控制tabbar的顯示與隱藏標志

}


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];


    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bj_bg"]];
    


    
}
//做了修改 設置tab bar
- (void)addCustomElements
{
    myButton = [MyButton buttonWithType:UIButtonTypeCustom];
    myButton.MoveEnable = YES;
    myButton.frame = CGRectMake(335, 300, 40, 40);
    
    //TabBar上按鍵圖標設置
    [myButton setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"40.png"]] forState:UIControlStateNormal];
    [myButton setTag:10];
    flag = NO;//控制tabbar的顯示與隱藏標志 NO為隱藏
    
    [myButton addTarget:self action:@selector(tabbarbtn:) forControlEvents:UIControlEventTouchUpInside];
    
    
    [self.view addSubview:myButton];
    
    [self _initTabBar];
}

//初始化tabbar
-(void)_initTabBar
{
    //tab bar view  始終居中顯示    
    tabBarView = [[UIView alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2-100, self.view.frame.size.height/2-100, 200 , 200)] ;
    
    //view 設置半透明 圓角樣式
    tabBarView.layer.cornerRadius = 10;//設置圓角的大小
    tabBarView.layer.backgroundColor = [[UIColor blackColor] CGColor];

    
    tabBarView.alpha = 0.8f;//設置透明
    tabBarView.layer.masksToBounds = YES;
    
    [self.view addSubview:tabBarView];
    
    //循環(huán)設置tabbar上的button
//    NSArray *imgNames = [[NSArray alloc]initWithObjects:@"download.png",@"block.png",@"bluetooth.png",@"file.png", nil];
    NSArray *tabTitle = [[NSArray alloc]initWithObjects:@"download",@"block",@"bluetooth",@"file", nil];
    
    for (int i=0; i<4; i++) {
        CGRect rect;
        rect.size.width = 60;
        rect.size.height = 60;
        switch (i) {
            case 0:
                rect.origin.x = 100-30;
                rect.origin.y = 40-35;
                break;
            case 1:
                rect.origin.x = 375/2-50;
                rect.origin.y = 100-30;
                break;
            case 2:
                rect.origin.x = 100-30;
                rect.origin.y = 375/2-50;
                break;
            case 3:
                rect.origin.x = 40-35;
                rect.origin.y = 100-30;
                break;
        }
        
        
              //設置每個tabView
        UIView *tabView = [[UIView alloc]initWithFrame:rect];
        [tabBarView addSubview:tabView];
        
        

        //設置tabView的圖標
        UIButton *tabButton = [UIButton buttonWithType:UIButtonTypeCustom];
        tabButton.frame = CGRectMake(15, 0, 30, 30);
        [tabButton setBackgroundImage:[UIImage imageNamed:[tabTitle objectAtIndex:i]] forState:UIControlStateNormal];
        [tabButton setTag:i];
        [tabButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        [tabView addSubview:tabButton];
        
        //設置標題
        UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 35, 60, 15)];
        titleLabel.font = [UIFont systemFontOfSize:12];
        titleLabel.textAlignment = 1;
        titleLabel.textColor = [UIColor whiteColor];
        titleLabel.backgroundColor = [UIColor clearColor];
        titleLabel.text = [tabTitle objectAtIndex:i];
        [tabView addSubview:titleLabel];
    }
    
    [tabBarView setHidden:YES];
}

//顯示 隱藏tabbar
- (void)tabbarbtn:(MyButton*)btn
{
    //在移動的時候不觸發(fā)點擊事件
    if (!btn.MoveEnabled) {
        if(!flag){
            tabBarView.hidden = NO;
            flag = YES;
        }else{
            tabBarView.hidden = YES;
            flag = NO;
        }
    }
    
}

- (void)buttonClicked:(id)sender
{
    NSLog(@"%ld",[sender tag]);
    
}


- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:YES];
    [self addCustomElements];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
}

高仿 iPhoneTouchButton

隨手點個喜歡吧~

關注我

QQ--iOS 交流群:107548668

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末与柑,一起剝皮案震驚了整個濱河市谤辜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌价捧,老刑警劉巖丑念,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異结蟋,居然都是意外死亡脯倚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門嵌屎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來推正,“玉大人,你說我怎么就攤上這事宝惰≈查牛” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵尼夺,是天一觀的道長尊残。 經(jīng)常有香客問我炒瘸,道長,這世上最難降的妖魔是什么寝衫? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任顷扩,我火速辦了婚禮,結果婚禮上慰毅,老公的妹妹穿的比我還像新娘隘截。我一直安慰自己,他們只是感情好汹胃,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布婶芭。 她就那樣靜靜地躺著,像睡著了一般统台。 火紅的嫁衣襯著肌膚如雪雕擂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天贱勃,我揣著相機與錄音,去河邊找鬼谤逼。 笑死贵扰,一個胖子當著我的面吹牛,可吹牛的內容都是我干的流部。 我是一名探鬼主播戚绕,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枝冀!你這毒婦竟也來了舞丛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤果漾,失蹤者是張志新(化名)和其女友劉穎球切,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绒障,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡吨凑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了户辱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸵钝。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖庐镐,靈堂內的尸體忽然破棺而出恩商,到底是詐尸還是另有隱情,我是刑警寧澤必逆,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布怠堪,位于F島的核電站韧献,受9級特大地震影響,放射性物質發(fā)生泄漏研叫。R本人自食惡果不足惜锤窑,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嚷炉。 院中可真熱鬧渊啰,春花似錦、人聲如沸申屹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哗讥。三九已至嚷那,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杆煞,已是汗流浹背魏宽。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留决乎,地道東北人队询。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像构诚,于是被迫代替她去往敵國和親蚌斩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評論 25 707
  • #下店六年級上課記錄 2017/5/23# 繪本《The Princess Twins and the Tea P...
    螢火蟲ABC閱讀 536評論 0 0
  • 明天八月初七范嘱,不是中秋節(jié)送膳,不是國慶節(jié),也不是過年丑蛤,而是老爸的生日叠聋。老爸今年已經(jīng)六十七歲,可是做為女兒的我卻...
    dym1979閱讀 476評論 0 5