1. 程式人生 > >ios --- 為程式新增一個懸浮框

ios --- 為程式新增一個懸浮框

一、UIWindow的簡介

1.UIWindow是一種特殊的UIView,通常在一個app中只會有一個UIWindow

2.iOS程式啟動完畢後,建立的第一個檢視控制元件就是UIWindow,接著建立控制器的view,最後將控制器的view新增到UIWindow上,於是控制器的view就顯示在螢幕上了

3.一個iOS程式之所以能顯示到螢幕上,完全是因為它有UIWindow。也就說,沒有UIWindow,就看不見任何UI介面

二、在window上新增Button

1.建立window

-(UIWindow *)window
{
    if (!_window)
    {
        id <UIApplicationDelegate> delegate = [[UIApplication sharedApplication] delegate];
        if ([delegate respondsToSelector:@selector(window)])
        {
            _window = [delegate performSelector:@selector(window)];
        }
        else
        {
            _window = [[UIApplication sharedApplication] keyWindow];
        }
    }
    return _window;
}

2.建立Buuton

-(UIButton *)levitateButton
{
    if (!_levitateButton)
    {
        _levitateButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _levitateButton.frame = CGRectMake(self.view.frame.size.width - 70, self.view.frame.size.height - 200, 60, 60);
        _levitateButton.backgroundColor = MainColor;
        [_levitateButton setBackgroundImage:[UIImage imageNamed:@"Button"] forState:UIControlStateNormal];
        _levitateButton.layer.cornerRadius = 30.0f;
        _levitateButton.layer.masksToBounds = YES;
        [self.window addSubview:_levitateButton];
        [_levitateButton addTarget:self action:@selector(edit) forControlEvents:UIControlEventTouchUpInside];
        UIPanGestureRecognizer *gesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGestureRecognizer:)];
        gesture.delegate = self;
        [_levitateButton addGestureRecognizer:gesture];
    }
    return _levitateButton;
}

3.拉動懸浮按鈕移動需要遵守手勢的協議 UIGestureRecognizerDelegate

-(void)panGestureRecognizer:(UIPanGestureRecognizer *)recognizer
{
    CGPoint point = [recognizer translationInView:recognizer.view.superview];
    CGPoint center = CGPointMake(recognizer.view.center.x + point.x,recognizer.view.center.y + point.y);
    if (center.x > self.view.frame.size.width - recognizer.view.frame.size.width/2)
    {
        center.x = self.view.frame.size.width - recognizer.view.frame.size.width/2;
    }
    else if (center.x < recognizer.view.frame.size.width/2)
    {
        center.x = recognizer.view.frame.size.width/2;
    }
    else if (center.y < 109 + recognizer.view.frame.size.width/2)
    {
        center.y = 109 + recognizer.view.frame.size.width/2;
    }
    else if (center.y > self.view.frame.size.height - recognizer.view.frame.size.width/2)
    {
        center.y = self.view.frame.size.height - recognizer.view.frame.size.width/2;
    }
    [UIView animateWithDuration:0.1 animations:^{
        recognizer.view.center = center;
        [recognizer setTranslation:CGPointZero inView:recognizer.view.superview];
    }];
}
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return YES;
}
根據自己的需要修改拉動的範圍
三、總結

上面的程式碼還稍微繁瑣點不過可以使用的,後續我會優化封裝下使程式碼更加簡潔,歡迎大家關注奔跑的蝸牛

相關推薦

ios --- 程式新增一個懸浮

一、UIWindow的簡介 1.UIWindow是一種特殊的UIView,通常在一個app中只會有一個UIWindow 2.iOS程式啟動完畢後,建立的第一個檢視控制元件就是UIWindow,接著建立控制器的view,最後將控制器的view新增到UIWindow上,於是控制

iosview新增一個圓角邊框

 _monthBtnView.layer.cornerRadius = 2;     _monthBtnView.layer.masksToBounds = YES;     //給圖層新增一個有色邊框     _monthBtnView.layer.borderWid

webgl中新增一個div實現

在webgl的開發中,新增一個div,可以實現框選的樣式。過程很簡單,直接看程式碼吧,這裡主要實現了點選第一次的時候確定div的位置,第二次實時顯示div的大小及樣式。這裡為了顯示實在canvas上畫div,將canvas設定為紅色。 <!DOCTYPE HTML PUBLIC "-//

Java 新建一個簡單的窗體(僅新增一個文字)

public static void main (String[] args) {     //新建一個JFrame窗體     JFrame jf = new JFrame();     //設定窗體的寬為400 高為300     jf.setSize(400,

iOSUIView新增虛線邊框

本文為原創,未經允許勿轉載 有時候需要為UIView新增虛線描邊,本文記錄一種實現方式,主要是通過對UIView的根layer新增CAShapeLayer來完成。效果圖如下: 核心程式碼示例如下: CGSize screenSize = [

DataGridView 新增複選,實現全選功能

1、指定DataGridView的第一列為DataGridViewCheckBoxColumn 2、為第一列的標題欄新增一個CheckBox,假設為HeaderCheckBox同時為HeaderCheckBox定義好 MouseClick 和 KeyUp 事件priva

vc視窗新增一個陰影或者毛玻璃背景

看到迅雷啊qq啊都實現了視窗的周圍有一層毛邊的玻璃背景,使原本單調的背景變的好看多了,就想著怎麼做了,終於在codeproject上找到了一個外國老寫的WndShadow類的,他主要是通過setwindowlong來獲取到主視窗的訊息。如視窗移動,縮小,變大等,獲取訊息做相

C# winform 編譯成功後程式新增清單檔案,新增Icon以及強簽名

為了使程式不出警告,強簽名這裡是在最後完成的。 簡單說一下過程: 1.新建一個文字檔案,輸入以下程式碼:   <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xml

iOS類別新增屬性的方法(RunTime)

一般認為Category不能新增變數,其實系統已經告訴我們是可以的. 這傢伙已經給UIViewController添加了圖中的幾個屬性,那麼如何實現? 其實是使用@dynamic來動態新增的。 (

在StringGrid中每行新增一個選擇(checkbox)

    StringGrid得實際使用中,經常會遇到這樣的需求,使用者想對每一行的記錄作一個標記,想對做了標記的記錄作特別的操作。例如想刪除多條記錄。    在網頁中經常有類似的應用,例如在電子郵箱裡,顯示郵件的每一行都有一個選擇框,使用者可以對多個郵件同時做刪除,移動的操

用核心模組的方式系統新增一個系統呼叫

今天,利用核心模組的方式向系統添加了一個核心模組。在make後,我開始sudo insmod hello.ko 完成之後。老是出現killed,在lsmod後,發現hello這個模組已經載入上去,但是測試函式呼叫的時候 ,發現根本無法呼叫這個系統呼叫。在經

Qt: 程式新增外部字型

Qt:  新增外部字型到程式的方法: #include <QFontDatabase> #include <QIODevice> QString loadFontFamil

caddy & grpc(3) caddy 新增一個 反向代理外掛

caddy-grpc 為 caddy 新增一個 反向代理外掛 專案地址:https://github.com/yhyddr/caddy-grpc 前言 上一次我們學習瞭如何在 Caddy 中擴充套件自己想要的外掛。部落格中只提供了大致框架。這一次,我們來根據具體外掛 caddy-grpc&nbs

caddy & grpc(3) caddy 新增一個 反向代理外掛

caddy-grpc 為 caddy 新增一個 反向代理外掛 專案地址:https://github.com/yhyddr/cad

xenomai核心解析--雙核系統呼叫(三)--如何xenomai新增一個系統呼叫

版權宣告:本文為本文為博主原創文章,轉載請註明出處。如有錯誤,歡迎指正。 @[toc] ### 一、新增系統呼叫 下面給xenomai新增一個系統呼叫`get_timer_hits()`,用於獲取應用程式執行CPU的定時器中斷產生的次數,類似於VxWorks裡的tickGet()。需要說明一下VxWorks

iOS之給圖片新增一個顏色相(Swift4.2)

override func viewDidLoad() { super.viewDidLoad() // 給一張圖片新增一個顏色相框 let image

你的應用新增懸浮

不知道有沒有童鞋用過QQ的Android版本中的一個高清版本,當你退出QQ的時候,會在你的螢幕上出現一個QQ圖示的懸浮窗,就和PC上的迅雷的懸浮視窗一樣,在所有應用的最上層,本來這個功能感覺還是挺好的,結果TX就給流氓了下,居然沒有做隱藏掉這個懸浮窗的功能。今天就來為大家簡

vue+elementui 新增和編輯如何實現公用一個

and v-model element tex off footer top ima mac //html代碼: //按鈕 <el-button type="primary" size="medium" @click="addEquipment">新增<

03 React快速入門(三)——實現從一個輸入新增完資料後此輸入內容清除的功能

功能描述:       我們在一個輸入框輸入內容,然後點選新增按鈕,此輸入框的內容就會新增到頁面上,但是此輸入框中還存在上次輸入的內容,我們想在每次輸入新增完成之後,此輸入框中的內容就會清除,如圖:      

qt 如何應用程式新增圖示

轉載:https://blog.csdn.net/taoerit/article/details/37735639   方法一:通過qtcreator新建一個檔案filename.qrc, 1、將圖片新增到filename.qrc檔案中:選擇Add Prefix得到/new/pre