打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Swift语言学习之如何用swift写ProgressHUD
  • //  
  • //  ProgressHUD.swift  
  • //  BiaoGeMusic  
  • //  
  • //  Created by ljy-335 on 14-10-21.  
  • //  Copyright (c) 2014年 uni2uni. All rights reserved.  
  • //  
  •   
  • import Foundation  
  • import UIKit  
  •   
  • ///  
  • /// @brief 样式  
  • enum HYBProgressHUDStyle {  
  •     case BlackHUDStyle /// 黑色风格  
  •     case WhiteHUDStyle /// 白色风格  
  • }  
  •   
  • ///  
  • /// @brief 定制显示通知的视图HUD  
  • /// @author huangyibiao  
  • class HYBProgressHUD: UIView {  
  •     var hud: UIToolbar?  
  •     var spinner: UIActivityIndicatorView?  
  •     var imageView: UIImageView?  
  •     var titleLabel: UILabel?  
  •       
  •     ///  
  •     /// private 属性  
  •     ///  
  •     private let statusFont = UIFont.boldSystemFontOfSize(16.0)  
  •     private var statusColor: UIColor!  
  •     private var spinnerColor: UIColor!  
  •     private var bgColor: UIColor!  
  •     private var successImage: UIImage!  
  •     private var errorImage: UIImage!  
  •       
  •     ///  
  •     /// @brief 单例方法,只允许内部调用  
  •     private class func sharedInstance() ->HYBProgressHUD {  
  •         struct Instance {  
  •             static var onceToken: dispatch_once_t = 0  
  •             static var instance: HYBProgressHUD?  
  •         }  
  •          
  •         dispatch_once(&Instance.onceToken, { () -> Void in  
  •             Instance.instance = HYBProgressHUD(frame: UIScreen.mainScreen().bounds)  
  •             Instance.instance?.setStyle(HYBProgressHUDStyle.WhiteHUDStyle)  
  •         })  
  •          
  •         return Instance.instance!  
  •     }  
  •       
  •     override init(frame: CGRect) {  
  •         super.init(frame: frame)  
  •          
  •         hud = nil  
  •         spinner = nil  
  •         imageView = nil  
  •         titleLabel = nil  
  •         self.alpha = 0.0  
  •     }  
  •       
  •     required init(coder aDecoder: NSCoder) {  
  •         fatalError("init(coder:) has not been implemented")  
  •     }  
  •       
  •     ///  
  •     /// 公开方法  
  •     ///  
  •       
  •     /// 显示信息  
  •     class func show(status: String) {  
  •         sharedInstance().configureHUD(status, image: nil, isSpin: true, isHide: false)  
  •     }  
  •       
  •     /// 显示成功信息  
  •     class func showSuccess(status: String) {  
  •         sharedInstance().configureHUD(status, image: sharedInstance().successImage, isSpin: false, isHide: true)  
  •     }  
  •       
  •     /// 显示出错信息  
  •     class func showError(status: String) {  
  •         sharedInstance().configureHUD(status, image: sharedInstance().errorImage, isSpin: false, isHide: true)  
  •     }  
  •       
  •     /// 隐藏  
  •     class func dismiss() {  
  •         sharedInstance().hideHUD()  
  •     }  
  •       
  •     ///  
  •     /// 私有方法  
  •     ///  
  •       
  •     ///  
  •     /// @brief 创建并配置HUD  
  •     private func configureHUD(status: String?, image: UIImage?, isSpin: Bool, isHide: Bool) {  
  •         configureProgressHUD()  
  •          
  •         /// 标题  
  •         if status == nil {  
  •             titleLabel!.hidden = true  
  •         } else {  
  •             titleLabel!.text = status!  
  •             titleLabel!.hidden = false  
  •         }  
  •         // 图片  
  •         if image == nil {  
  •             imageView?.hidden = true  
  •         } else {  
  •             imageView?.hidden = false  
  •             imageView?.image = image  
  •         }  
  •          
  •         // spin  
  •         if isSpin {  
  •             spinner?.startAnimating()  
  •         } else {  
  •             spinner?.stopAnimating()  
  •         }  
  •          
  •         rotate(nil)  
  •         addjustSize()  
  •         showHUD()  
  •          
  •         if isHide {  
  •             NSThread.detachNewThreadSelector("hideWhenTimeout", toTarget: self, withObject: nil)  
  •         }  
  •     }  
  •       
  •     ///  
  •     /// @brief 设置风格样式,默认使用的是黑色的风格,如果需要改成白色的风格,请在内部修改样式  
  •     private func setStyle(style: HYBProgressHUDStyle) {  
  •         switch style {  
  •         case .BlackHUDStyle:  
  •             statusColor = UIColor.whiteColor()  
  •             spinnerColor = UIColor.whiteColor()  
  •             bgColor = UIColor(white: 0, alpha: 0.8)  
  •             successImage = UIImage(named: "ProgressHUD.bundle/success-white.png")  
  •             errorImage = UIImage(named: "ProgressHUD.bundle/error-white.png")  
  •             break  
  •         case .WhiteHUDStyle:  
  •             statusColor = UIColor.whiteColor()  
  •             spinnerColor = UIColor.whiteColor()  
  •             bgColor = UIColor(red: 192.0 / 255.0, green: 37.0 / 255.0, blue: 62.0 / 255.0, alpha: 1.0)  
  •             successImage = UIImage(named: "ProgressHUD.bundle/success-white.png")  
  •             errorImage = UIImage(named: "ProgressHUD.bundle/error-white.png")  
  •             break  
  •         default:  
  •             break  
  •         }  
  •     }  
  •       
  •     ///  
  •     /// @brief 获取窗口window  
  •     private func getWindow() ->UIWindow {  
  •         if let delegate: UIApplicationDelegate = UIApplication.sharedApplication().delegate {  
  •             if let window = delegate.window {  
  •                 return window!  
  •             }  
  •         }  
  •          
  •         return UIApplication.sharedApplication().keyWindow  
  •     }  
  •       
  •     ///  
  •     /// @brief 创建HUD  
  •     private func configureProgressHUD() {  
  •         if hud == nil {  
  •             hud = UIToolbar(frame: CGRectZero)  
  •             hud?.barTintColor = bgColor  
  •             hud?.translucent = true  
  •             hud?.layer.cornerRadius = 10  
  •             hud?.layer.masksToBounds = true  
  •               
  •             /// 监听设置方向变化  
  •             NSNotificationCenter.defaultCenter().addObserver(self,  
  •                 selector: "rotate:",  
  •                 name: UIDeviceOrientationDidChangeNotification,  
  •                 object: nil)  
  •         }  
  •          
  •         if hud!.superview == nil {  
  •             getWindow().addSubview(hud!)  
  •         }  
  •          
  •         if spinner == nil {  
  •             spinner = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)  
  •             spinner!.color = spinnerColor  
  •             spinner!.hidesWhenStopped = true  
  •         }  
  •          
  •         if spinner!.superview == nil {  
  •             hud!.addSubview(spinner!)  
  •         }  
  •          
  •         if imageView == nil {  
  •             imageView = UIImageView(frame: CGRectMake(0, 0, 28, 28))  
  •         }  
  •          
  •         if imageView!.superview == nil {  
  •             hud!.addSubview(imageView!)  
  •         }  
  •          
  •         if titleLabel == nil {  
  •             titleLabel = UILabel(frame: CGRectZero)  
  •             titleLabel?.backgroundColor = UIColor.clearColor()  
  •             titleLabel?.font = statusFont  
  •             titleLabel?.textColor = statusColor  
  •             titleLabel?.baselineAdjustment = UIBaselineAdjustment.AlignCenters  
  •             titleLabel?.numberOfLines = 0  
  •             titleLabel?.textAlignment = NSTextAlignment.Center  
  •             titleLabel?.adjustsFontSizeToFitWidth = false  
  •         }  
  •          
  •         if titleLabel!.superview == nil {  
  •             hud!.addSubview(titleLabel!)  
  •         }  
  •     }  
  •       
  •     ///  
  •     /// @brief 释放资源  
  •     private func destroyProgressHUD() {  
  •         NSNotificationCenter.defaultCenter().removeObserver(self, name: UIDeviceOrientationDidChangeNotification, object: nil)  
  •          
  •         titleLabel?.removeFromSuperview()  
  •         titleLabel = nil  
  •          
  •         spinner?.removeFromSuperview()  
  •         spinner = nil  
  •          
  •         imageView?.removeFromSuperview()  
  •         imageView = nil  
  •          
  •         hud?.removeFromSuperview()  
  •         hud = nil  
  •     }  
  •       
  •     ///  
  •     /// @brief 设置方向变化通知处理  
  •     func rotate(sender: NSNotification?) {  
  •         var rotation: CGFloat = 0.0  
  •         switch UIApplication.sharedApplication().statusBarOrientation {  
  •         case UIInterfaceOrientation.Portrait:  
  •             rotation = 0.0  
  •             break  
  •         case .PortraitUpsideDown:  
  •             rotation = CGFloat(M_PI)  
  •             break  
  •         case .LandscapeLeft:  
  •             rotation = -CGFloat(M_PI_2)  
  •             break  
  •         case .LandscapeRight:  
  •             rotation = CGFloat(M_PI_2)  
  •             break  
  •         default:  
  •             break  
  •         }  
  •          
  •         hud?.transform = CGAffineTransformMakeRotation(rotation)  
  •     }  
  •       
  •     ///  
  •     /// @brief 调整大小  
  •     private func addjustSize() {  
  •         var rect = CGRectZero  
  •         var width: CGFloat = 100.0  
  •         var height: CGFloat = 100.0  
  •          
  •         /// 计算文本大小  
  •         if titleLabel!.text != nil {  
  •             var style = NSMutableParagraphStyle()  
  •             style.lineBreakMode = NSLineBreakMode.ByCharWrapping  
  •             var attributes = [NSFontAttributeName: statusFont, NSParagraphStyleAttributeName: style.copy()]  
  •             var option = NSStringDrawingOptions.UsesLineFragmentOrigin  
  •             var text: NSString = NSString(CString: titleLabel!.text!.cStringUsingEncoding(NSUTF8StringEncoding)!,  
  •                 encoding: NSUTF8StringEncoding)  
  •             rect = text.boundingRectWithSize(CGSizeMake(160, 260), options: option, attributes: attributes, context: nil)  
  •             rect.origin.x = 12  
  •             rect.origin.y = 66  
  •               
  •             width = rect.size.width + 24  
  •             height = rect.size.height + 80  
  •               
  •             if width < 100 {  
  •                 width = 100  
  •                 rect.origin.x = 0  
  •                 rect.size.width = 100  
  •             }  
  •         }  
  •          
  •         hud!.center = CGPointMake(kScreenWidth / 2, kScreenHeight / 2)  
  •         hud!.bounds = CGRectMake(0, 0, width, height)  
  •          
  •         var h = titleLabel!.text == nil ? height / 2 : 36  
  •         imageView!.center = CGPointMake(width / 2, h)  
  •         spinner!.center = CGPointMake(width / 2, h)  
  •          
  •         titleLabel!.frame = rect  
  •     }  
  •       
  •     ///  
  •     /// @brief 显示  
  •     private func showHUD() {  
  •         if self.alpha == 0.0 {  
  •             self.alpha = 1.0  
  •               
  •             hud!.alpha  = 0.0  
  •             self.hud!.transform = CGAffineTransformScale(self.hud!.transform, 1.4, 1.4)  
  •             UIView.animateKeyframesWithDuration(0.15,  
  •                 delay: 0.0,  
  •                 options: UIViewKeyframeAnimationOptions.AllowUserInteraction,  
  •                 animations: { () -> Void in  
  •                     self.hud!.transform = CGAffineTransformScale(self.hud!.transform, 1.0 / 1.4, 1.0 / 1.4)  
  •                     self.hud!.alpha = 1.0  
  •                 }, completion: { (isFinished) -> Void in  
  •             })  
  •         }  
  •     }  
  •       
  •     ///  
  •     /// @brief 隐藏  
  •     private func hideHUD() {  
  •         if self.alpha == 1.0 {  
  •             UIView.animateKeyframesWithDuration(0.2,  
  •                 delay: 0.0,  
  •                 options: UIViewKeyframeAnimationOptions.AllowUserInteraction,  
  •                 animations: { () -> Void in  
  •                     self.hud!.transform = CGAffineTransformScale(self.hud!.transform, 0.35, 0.35)  
  •                     self.hud!.alpha = 0.0  
  •                 }, completion: { (isFinished) -> Void in  
  •                     self.destroyProgressHUD()  
  •                     self.alpha = 0.0  
  •             })  
  •         }  
  •     }  
  •       
  •     ///  
  •     /// @brief 在指定时间内隐藏  
  •     func hideWhenTimeout() {  
  •         autoreleasepool { () -> () in  
  •             var length = countElements(self.titleLabel!.text!)  
  •             var sleepTime: NSTimeInterval = NSTimeInterval(length) * 0.04 + 0.5  
  •             NSThread.sleepForTimeInterval(sleepTime)  
  •               
  •             self.hideHUD()  
  •         }  
  •     }  
  • }  
  • 本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
    打开APP,阅读全文并永久保存 查看更多类似文章
    猜你喜欢
    类似文章
    【热】打开小程序,算一算2024你的财运
    swift 从相册里取图片并Post传到服务器上
    Swift百万线程攻破单例(Singleton)模式
    【译】Swift 面试题及其答案
    [精校版]Using Swift with Cocoa and Objective-C--互用性-与C API交互
    Swift中的Network Reachability
    使用设计模式中的Singleton单例模式来开发iOS应用程序
    更多类似文章 >>
    生活服务
    热点新闻
    分享 收藏 导长图 关注 下载文章
    绑定账号成功
    后续可登录账号畅享VIP特权!
    如果VIP功能使用有故障,
    可点击这里联系客服!

    联系客服