iOS开发 毛玻璃背景弹窗 SXAlertView

Simulator Screen Shot 2016年3月29日 上午11.45.39.png
SXAlertView.gif

简单封装了毛玻璃背景弹窗视图,并用闭包判断点击事件

SXAlertView.swift

import UIKit
// 闭包
typealias SXAlertViewBlock = (btnName: String) -> Void
class SXAlertView: UIView {

    var leftLeave: Bool!
    var alertTitleLabel: UILabel!
    var alertContentLabel: UILabel!
    var leftButton: UIButton!
    var rightButton: UIButton!
    var bgImageView: UIView!
    
    let alertWidth:CGFloat = 245
    let alertHeight:CGFloat = 160
    
    let titleYOffset:CGFloat = 15
    let titleHeight:CGFloat = 25
    let contentOffset:CGFloat = 30
    let betWeenLabelOffset:CGFloat = 20
    
    var callBack: SXAlertViewBlock?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func initWithTitle(title: String, content: String, leftTitle: String, rigthTitle: String) {
        
        // alertView
        self.layer.cornerRadius = 5.0
        self.backgroundColor = UIColor.whiteColor()
        
        //1 标题
        alertTitleLabel = UILabel(frame: CGRect(x: 0, y: titleYOffset, width: alertWidth, height: titleHeight))
        alertTitleLabel.text = title
        alertTitleLabel.textAlignment = .Center
        self.addSubview(alertTitleLabel)
        
        //2 内容
        let contentLabelWidth = alertWidth - 16
        alertContentLabel = UILabel(frame: CGRect(x: (alertWidth - contentLabelWidth) * 0.5, y: CGRectGetMaxY(alertTitleLabel.frame), width: contentLabelWidth, height: 60))
        alertContentLabel.text = content
        alertContentLabel.numberOfLines = 0
        alertContentLabel.textAlignment = .Center
        alertContentLabel.textColor = UIColor(red: 127/255, green: 127/255, blue: 127/255, alpha: 1)
        alertContentLabel.font = UIFont.systemFontOfSize(15)
        self.addSubview(alertContentLabel)
        
        var leftButtonFrame: CGRect!
        var rightButtonFrame: CGRect!
        
        let singleButtonWidth:CGFloat = 160
        let coupleButtonWidth:CGFloat = 107
        let buttonHeight:CGFloat = 40
        let buttonBottomOffset:CGFloat = 10
        
        // 判断左视图是否为空时、进行调整按钮尺寸
        if leftTitle == "" {
            rightButtonFrame = CGRect(x: (alertWidth - singleButtonWidth) * 0.5, y: alertHeight - buttonBottomOffset - buttonHeight, width: singleButtonWidth, height: buttonHeight)
            rightButton = UIButton(type: .Custom)
            rightButton.frame = rightButtonFrame
        } else {
            leftButtonFrame = CGRect(x: (alertWidth - 2 * coupleButtonWidth - buttonBottomOffset) * 0.5, y: alertHeight - buttonBottomOffset - buttonHeight, width: coupleButtonWidth, height: buttonHeight)
            rightButtonFrame = CGRect(x: CGRectGetMaxX(leftButtonFrame) + buttonBottomOffset, y: alertHeight - buttonBottomOffset - buttonHeight, width: coupleButtonWidth, height: buttonHeight)
            leftButton = UIButton(type: .Custom)
            rightButton = UIButton(type: .Custom)
            leftButton.frame = leftButtonFrame
            rightButton.frame = rightButtonFrame
            
            //3 左按钮
            let leftBgColor = UIColor(red: 21/255, green: 173/255, blue: 158/255, alpha: 1)
            leftButton.setBackgroundImage(imageWithColor(leftButtonFrame, color: leftBgColor), forState: .Normal)
            leftButton.setTitle(leftTitle, forState: .Normal)
            leftButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
            leftButton.titleLabel?.font = UIFont.systemFontOfSize(14)
            leftButton.addTarget(self, action: "leftButtonClick", forControlEvents: .TouchUpInside)
            leftButton.layer.masksToBounds = true
            leftButton.layer.cornerRadius = 5
            self.addSubview(leftButton)
        }
        
        //4 右按钮
        let rightBgColor = UIColor(red: 227/255, green: 100/255, blue: 83/255, alpha: 1)
        rightButton.setBackgroundImage(imageWithColor(rightButtonFrame, color: rightBgColor), forState: .Normal)
        rightButton.setTitle(rigthTitle, forState: .Normal)
        rightButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        rightButton.titleLabel?.font = UIFont.systemFontOfSize(14)
        rightButton.addTarget(self, action: "rightButtonClick", forControlEvents: .TouchUpInside)
        rightButton.layer.masksToBounds = true
        rightButton.layer.cornerRadius = 5
        self.addSubview(rightButton)
        // 右上角 按钮
        let xBtn = UIButton(type: .Custom)
        xBtn.frame = CGRect(x: alertWidth - 28, y: 4, width: 22, height: 22)
        let xBtnBgColor = UIColor(red: 161/255, green: 163/255, blue: 166/255, alpha: 0.7)
        xBtn.setBackgroundImage(imageWithColor(xBtn.frame, color: xBtnBgColor), forState: .Normal)
        xBtn.setTitle("X", forState: .Normal)
        xBtn.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        xBtn.titleLabel?.font = UIFont.systemFontOfSize(14)
        xBtn.layer.masksToBounds = true
        xBtn.layer.cornerRadius = 11
        self.addSubview(xBtn)
        xBtn.addTarget(self, action: "xBtnClick", forControlEvents: .TouchUpInside)
    }
    
    // MARK: - Aciton
    func leftButtonClick() {
        leftLeave = true
        self.callBack!(btnName: "leftButton")
        self.removeFromSuperview()
    }
    
    func rightButtonClick() {
        leftLeave = false
        self.removeFromSuperview()
        self.callBack!(btnName: "rightButton")
    }
    
    func xBtnClick() {
        self.callBack!(btnName: "xBtn")
        self.removeFromSuperview()
    }
    
    func showAlertView() {
        
        let shareWindow = UIApplication.sharedApplication().keyWindow
        self.frame = CGRect(x: (shareWindow?.bounds.size.width)! - alertWidth * 0.5, y: -alertHeight - 30, width: alertWidth, height: alertHeight)
        shareWindow?.addSubview(self)
    }
    
    override func removeFromSuperview() {
        bgImageView.removeFromSuperview()
        bgImageView = nil
        let shareWindow = UIApplication.sharedApplication().keyWindow
        let afterFrame = CGRect(x: ((shareWindow?.bounds.size.width)! - alertWidth) * 0.5, y: (shareWindow?.bounds.size.height)!, width: alertWidth, height: alertHeight)
        
        // 移除 view 动画效果
        UIView.animateWithDuration(0.35, delay: 0, options: .CurveEaseInOut, animations: { () -> Void in
            self.frame = afterFrame
            
            switch self.leftLeave {
            case nil : // 右上角按钮
                self.transform = CGAffineTransformMakeRotation(-CGFloat(M_1_PI) / 2)
            case true: // 左边按钮
                self.transform = CGAffineTransformMakeRotation(CGFloat(M_1_PI) / 1.5)
            case false: // 右边按钮
                self.transform = CGAffineTransformMakeRotation(CGFloat(M_1_PI) / 1.5)
            default: // 其他
                self.transform = CGAffineTransformMakeRotation(CGFloat(M_1_PI) / 1.5)
            }
            }) { (finished) -> Void in
                super.removeFromSuperview()
        }
    }
    
    override func willMoveToSuperview(newSuperview: UIView?) {
        if newSuperview == nil {
            return
        }
        let shareWindow = UIApplication.sharedApplication().keyWindow
        
        let blurEffect = UIBlurEffect(style: .Light) // 模糊样式
        let effectView = UIVisualEffectView(effect: blurEffect)
        effectView.frame = shareWindow!.bounds
        bgImageView = effectView
        shareWindow?.addSubview(bgImageView)
        
        self.transform = CGAffineTransformMakeRotation(-CGFloat(M_1_PI) / 2)
        let afterFrame = CGRect(x: ((shareWindow?.bounds.size.width)! - alertWidth) * 0.5, y: ((shareWindow?.bounds.size.height)! - alertHeight) * 0.5, width: alertWidth, height: alertHeight)
        
        UIView.animateWithDuration(0.35, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0, options: .CurveEaseIn, animations: { () -> Void in
            self.transform = CGAffineTransformMakeRotation(0)
            self.frame = afterFrame
            }) { (finished) -> Void in
                super.willMoveToSuperview(newSuperview)
        }
    }
    
    // 颜色转图片
    func imageWithColor(imageFrame:CGRect, color:UIColor) -> UIImage {
        
        let rect = CGRect(x: 0, y: 0, width: imageFrame.width, height: imageFrame.height)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

使用例子:
ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let btn1 = UIButton(frame: CGRect(x: self.view.bounds.width/2 - 10, y:  50, width: 22, height: 22))
        btn1.setTitle("+", forState: .Normal)
        btn1.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        btn1.titleLabel?.font = UIFont.systemFontOfSize(22)
        btn1.layer.masksToBounds = true
        btn1.layer.cornerRadius = 11
        btn1.backgroundColor = UIColor(red: 161/255, green: 163/255, blue: 166/255, alpha: 0.7)
        btn1.addTarget(self, action: "btn1Click:", forControlEvents: .TouchUpInside)
        self.view.addSubview(btn1)
        
        let btn2 = UIButton(frame: CGRect(x: 50, y:  350, width: 22, height: 22))
        btn2.setTitle("+", forState: .Normal)
        btn2.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        btn2.titleLabel?.font = UIFont.systemFontOfSize(22)
        btn2.layer.masksToBounds = true
        btn2.layer.cornerRadius = 11
        btn2.backgroundColor = UIColor(red: 161/255, green: 163/255, blue: 166/255, alpha: 0.7)
        btn2.addTarget(self, action: "btn2Click:", forControlEvents: .TouchUpInside)
        self.view.addSubview(btn2)
    }

    
    // btn1
    func btn1Click(sender: UIButton) {
        let alert = SXAlertView()
        alert.initWithTitle("活着", content: "生活不只眼前的苟且", leftTitle: "是的", rigthTitle: "不是")
        alert.showAlertView()
        
        //通过闭包实现不同按钮点击事件
        alert.callBack = ({(btnName: String) -> Void in
            switch btnName {
                case "leftButton":
                     print("点击了leftButton")
                case "rightButton":
                     print("点击了rightButton")
                case "xBtn":
                     print("点击了xBtn")
                default:
                     break
            }
        })
    }
    
    // btn2
    func btn2Click(sender: UIButton) {
        let alert = SXAlertView()
        alert.initWithTitle("亲", content: "喜欢就点个👍", leftTitle: "", rigthTitle: "喜欢")
        alert.showAlertView()
        
        //通过闭包实现不同按钮点击事件
        alert.callBack = ({(btnName: String) -> Void in
            switch btnName {
            case "rightButton":
                print("点击了rightButton")
            case "xBtn":
                print("点击了xBtn")
            default:
                break
            }
        })
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容

  • 奇喵喵喵阅读 270评论 0 2
  • 《简介》 2012年前半年开始更新本书。 我的文字说到根儿上是我写给自己拥有并使用的,分享出来是供有兴...
    探索生物心灵旅客阅读 102评论 0 0
  • 林徽因说:“你是人间的四月天。”想来四月天是极好的。可这些年来整日价浑浑噩噩,冬夏印象都不深刻,更不知春秋如何。要...
    kangflict阅读 234评论 1 1
  • 就在上一秒,我跟球球吵架,大家说好的再不联系,把微信,微博,所有关注我的一切都取消拉黑掉,再不联系,我同意了。折磨...
    蔷薇与艾米阅读 460评论 0 3
  • 01 那是大年初一的晚上,跟爸妈聊天完正准备洗澡睡觉,突然接到朋友的电话,朋友问我:"有空吗?可以出来陪我说说话么...
    午小俊阅读 557评论 1 4