1. 程式人生 > >Swift3.0 實現模態/非模態loading框和toast

Swift3.0 實現模態/非模態loading框和toast


toast.gif

本文要實現Android的toast效果, 同理實現loading框, 包括模態和非模態(即是否攔截控制元件的焦點)。 

1、 因為toast文字有長有短, 所有要動態判斷toast文字的寬度。

extension UILabel {
//根據最大寬度計算高
func getLableSize(text: String, maxWidth: CGFloat) -> CGRect {
let maxSize = CGSize(width: maxWidth, height: 0) //注意高度是0
// size = text.boundingRectWithSize(size2, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: attributes , context: nil);
let size = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin,
attributes: [NSFontAttributeName:self.font], context: nil)
return size
}
}

2、 按鈕的點選事件:

    @IBAction func clickButton2( sender: Any) {
let toast = ToastView()
toast.showLoadingDlg()
}
@IBAction func clickButton3(
sender: Any) {
let toast = ToastView()
toast.showToast(text: "網路連線異常,請稍候再試", pos: .Bottom)
}
@IBAction func showToastTop( sender: Any) {
let toast = ToastView()
toast.showToast(text: "您的申請已受理,請耐心等待", pos: .Top)
}
@IBAction func showNoModal(
sender: Any) {
let toast = ToastView()
toast.showToastExt(text: "非模態toast", pos: .Bottom)
}

3、以顯示loading為例講解語法, 注意模態和非模態是根據window大小決定的。 如果window的大小跟應用根視窗大小一樣, 那麼就是模態, 反之是非模態。

 func showLoadingDlg() {
let rootRect = UIApplication.shared.windows.first?.frame //應用螢幕大小
let container = UIView() //全屏且透明,蓋在最上面, 可以自定義點選事件, 從而實現模態和非模態框效果。
container.backgroundColor = UIColor.clear
container.frame = rootRect!
//新增中間矩形黑色區域, 80*80
let bgLength = 90
let bgView = UIView() //黑色半透明方形區域
bgView.frame = CGRect(x: Int((rootRect?.width)!/2) - bgLength/2,
y: Int((rootRect?.height)!/2) - bgLength/2,
width: bgLength,
height: bgLength)
bgView.layer.cornerRadius = 10 //黑色矩形區域的角弧度
bgView.backgroundColor = UIColor(hue: 0, saturation: 0, brightness: 0, alpha: 0.8)
container.addSubview(bgView) //全屏透明背景在中心位置新增矩形黑色區域
//新增圈圈
let indicatorLength: CGFloat = 50 //黑色矩形區域裡的旋轉
let indicatorView = UIActivityIndicatorView(activityIndicatorStyle: .white)
indicatorView.frame = CGRect(x: (rootRect?.width)!/2 - indicatorLength/2,
y: (rootRect?.height)!/2 - indicatorLength/2 - 10,
width: indicatorLength,
height: indicatorLength)
indicatorView.startAnimating() //動畫
container.addSubview(indicatorView) //新增旋轉動畫view
//新增文字
let lableX = (rootRect?.width)!/2 - CGFloat(bgLength/2) + 5
let lableY = (rootRect?.height)!/2 + indicatorLength/2 - 10
let lableView = UILabel(frame: CGRect(x: Int(lableX),
y: Int(lableY),
width: bgLength-10,
height: bgLength/2-Int(indicatorLength)/2-5))
lableView.font = UIFont.systemFont(ofSize: 15) //設定系統字型和字號
lableView.textColor = UIColor.white
lableView.text = "載入中"
lableView.textAlignment = .center
container.addSubview(lableView)
//-------------測試程式碼-------------
//let size = lableView.getLableSize(text: "網路異常,請稍候再試", maxWidth: 100)
//-------------測試程式碼-------------
let window = UIWindow()
window.backgroundColor = UIColor.clear
window.frame = rootRect! //全屏大小
window.center = CGPoint(x: (rootRect?.width)!/2, y: (rootRect?.height)!/2)
window.windowLevel = UIWindowLevelAlert
window.isHidden = false
window.addSubview(container)
//新增點選事件
container.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapGesture(sender:))))
bufWindows.append(window)
perform(#selector(showFinished(sender:)), with: window, afterDelay: delay)
}

4、toast和loading框都是window, 可以動態關閉, 就像gif圖裡演示的那樣點選window所在區域就可以關閉。

    //新增點選事件
func tapGesture(sender: UITapGestureRecognizer) {
print("點選uiview")
//移除最後一個
if bufWindows.count > 0 {
bufWindows.removeLast()
}
NSObject.cancelPreviousPerformRequests(withTarget: self) //可以關閉window, 如果註釋該語句則相當於蓋住了一層透明介面
}

相關推薦

Swift3.0 實現/loadingtoast

toast.gif 本文要實現Android的toast效果, 同理實現loading框, 包括模態和非模態(即是否攔截控制元件的焦點)。  1、 因為toast文字有長有短, 所有要動態判斷toast文字的寬度。 extension UILabel { //根據最大寬度計算高 func

十三、$.ajax、/、window.open()、href屬性、submit()等提交請求及優劣及問題解決

題解 字符 upd 管理員 系統管理 ogl menu 縮小 fir 1. $.ajax提交請求進行數據更新,並通過回調進行有效提示 $.ajax({ type: "post", url: dispacher,

Qt自定義樣式/無邊框視窗/子視窗/問題

依舊是參考了諸多文章及帖子,最後測試總結如下: 1、只要是繼承自QWidget的視窗/物件,理論上都可以設定模態/非模態 2、模態是指除了本視窗內部控制元件外,直接使用.exec()執行(或先設定模態setWindowModality(Qt::ApplicationMo

swift3.0反射的到struct中的屬性值屬性名

struct Person{     var name:String     var age:Int     var height:Double? }let aPerson = Person(nam

Qt - QDialog,QWidget實現Widget不能有父窗口,如果設置無邊框就不能阻塞父窗口,但是可以強行設置指定Qt::Dialog,還可以setAttribute(Qt::WA_ShowModal),很多講究)good

col set print png 運行時 操作 qwidget 對話 idg 在Qt中QDialog為“窗口”,而QWidget為“部件”,首先還是了解下《Qt 窗口與部件的概念》。 對於 QDialog 的模態及非模態是

VC++6.0 MFC顯示對話方塊對話方塊

1、模態對話方塊 #include "AddDataDlg.h"//新增標頭檔案 CAddDataDlg AddData_Dialog;//在標頭檔案中定義對話方塊物件(CAddDataDlg為該對話方塊對應的類) int nReturn = AddData_Dialog.DoModal

QWidget實現

比如在一個QWidget中new一個自定義對話方塊,該對話方塊設定為setWindowModality(Qt::WindowModal),然後將這個QWidget裡面的按鍵clicked()訊號和對話方塊的show()槽函式連線起來,一旦點選就show對話方塊。這樣建立完後卻發現視窗不是模態的,原因就是沒有父

實現對話方塊的顯示

新建一個對話方塊,選擇該對話方塊,右鍵選擇ClassWizard然後會提示你為該對話方塊新建一個新類,點選確定,然後輸入自己定義的類名,確定後會產生一個與該對話方塊對應的類,假定該類為CDlglist,然後在該類標頭檔案新增如下程式碼:CDlglist(CDialog* pP

基於對話方塊的MFC程式中,實現子視窗在工作列顯示圖示以及視窗左上角加圖示

在基於對話方塊的MFC程式中為了使子視窗同父視窗一樣在工作列顯示圖示,並且在子視窗最小化時可以在工作列顯示圖示,可以在子視窗的OnInitDialog函式中呼叫函式ModifyStyleEx進行修改視窗的樣式實現具體程式碼為: ModifyStyleEx(WS_EX_TOO

QDialog,QWidget實現

模態QDialog QDialog dlg(this); dlg.exec(); QDialog *pDlg=new QDialog(this); pDlg->setModal(true); pDlg->show(); 非模態QDialog QDialog

Qt 之 、半視窗的介紹及 實現QDialog的exec()方法

版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。 本文連結:https:/

駱駝命名法對話的對話

混合 evel 置頂 ring int 字節 適合 函數庫 unix 駱駝式命名法(Camel-Case)又稱駝峰命名法,是電腦程式編寫時的一套命名規則(慣例)。正如它的名稱CamelCase所表示的那樣,是指混合使用大小寫字母來構成變量和函數的名字。程序員們為了自己的代碼

MFC創建子窗口

mfc 非模態窗口 在第一個窗口中,創建第二個窗口,代碼如下:#include "second.h"//第二個窗口頭文件 void CtestDlg::OnBnClickedButton6() { SecondDig *pDig = new SecondDig; pDi

QT創建模對話阻塞整個應用程序對話唯一性約束的簡單示例

t對象 geometry ges con png qwidget int imu 唯一性約束 QT創建模態對話框阻塞整個應用程序和非模態對話框唯一性約束的簡單示例 部分代碼: // 創建模態對話框阻塞整個應用程序和非模態對話框唯一性約束 QMenu *pD

8.QT-對話()

所有 消息 屬於 分享 數值 oid qdialog HA 繼承 對話框介紹 對話框是於用戶進行簡易交互的頂層窗口 QDialog是Qt中所有對話框窗口的父類,是一種容器類型的組件 QDialog繼承於QWidget類,如下圖所示:

對話方塊與對話方塊的區別

以下內容部分摘自百度百科;     Windows應用程式中,對話方塊分為兩種。另一種是模態對話方塊。二者的區別在於當對話方塊開啟時,是否允許使用者進行其他物件的操作。         詳細如下: &nbs

MFC對話方塊對話方塊

下面是一個我的手寫的模態對話方塊和非模態對話方塊圖: 模態對話方塊是指當其顯示時,程式會暫停執行,直到關閉這個模態對話方塊後,才能繼續執行程式中其他任務。非模態對話方塊是指當其顯示時,允許轉而執行程式中其他任務,而不用關閉這個對話方塊。      模態對話方塊的建立:

C#裡面MessageBox不能亂用,阻塞阻塞,對話方塊

我一開始以為這個MessageBox跟Delphi裡面的ShowMessage是一樣的,程式裡可以隨便放,因為C#裡面就TM這一個封裝好的彈出對話方塊提示訊息函式,可以直接用的。 結果實習做程式測試被坑爹了,發現我錯了,C#這個MessageBox預設是模態對話方塊,是阻塞的,也就是說你不

對話方塊 兩個對話方塊之間值的傳遞

①、模態對話方塊的建立:CDialog::DoModal       不用釋放資源 ②、非模態對話方塊的建立:CDialog::Create     >:  MyDialog dlg;

【MFC】 如何通過主對話方塊的按鈕響應建立對話方塊

1.首先新建一個對話方塊IDD_DIALOG_Create, 並新增類CDialog_Create。 //在工程中會新生成一個Dialog_Create.h標頭檔案和一個Dialog_Create.CPP原始檔。 2.在主對話方塊的標頭檔案SerialDlg.h