自定义AlertView(Swift)
MyAlertView.swift
// Pop Up Styles
enum MyAlertViewStyle: Int {
case success
case error
case notice
case warning
case info
}
// Allow alerts to be closed/renamed in a chainable manner
// Example: MyAlertView().showSuccess(self, title: "Test", subTitle: "Value").Close()
//class MyAlertViewClose {
// let alertview: MyAlertView
//
// // Initialisation and Title/Subtitle/Close functions
// init(alertview: MyAlertView) { self.alertview = alertview }
// func setTitle(_ title: String) { self.alertview.labelView.text = title; }
// func setSubTitle(_ subTitle: String) { self.alertview.labelViewDescription.text = subTitle; }
// func Close() { self.alertview.doneButtonAction() }
//}
class MyAlertView: UIView {
let kDefaultShadowOpacity: CGFloat = 0.7;
let kCircleHeight: CGFloat = 56.0;
let kCircleTopPosition: CGFloat = -12; // Should not be defined here. Make it dynamic
let kCircleBackgroundTopPosition: CGFloat = -15; // Should not be defined here. Make it dynamic
let kCircleHeightBackground: CGFloat = 62.0;
let kCircleIconHeight: CGFloat = 20.0;
let kWindowWidth: CGFloat = 240.0;
let kWindowHeight: CGFloat = 228.0;
// Font
let kDefaultFont: NSString = "HelveticaNeue"
// Members declaration
var labelView: UILabel
var labelViewDescription: UILabel
var shadowView: UIView
var contentView: UIView
var circleView: UIView
var circleViewBackground: UIView
var circleIconImageView: UIImageView
var doneButton: UIButton
var rootViewController: UIViewController
var durationTimer: Timer!
init () {
// Content View
self.contentView = UIView(frame: CGRect(x: 0, y: kCircleHeight / 4, width: kWindowWidth, height: kWindowHeight))
self.contentView.backgroundColor = UIColor(white: 1, alpha: 1);
self.contentView.layer.cornerRadius = 5;
self.contentView.layer.masksToBounds = true;
self.contentView.layer.borderWidth = 0.5;
// Circle View
self.circleView = UIView(frame: CGRect(x: kWindowWidth / 2 - kCircleHeight / 2, y: kCircleTopPosition, width: kCircleHeight, height: kCircleHeight))
self.circleView.layer.cornerRadius = self.circleView.frame.size.height / 2;
// Circle View Background
self.circleViewBackground = UIView(frame: CGRect(x: kWindowWidth / 2 - kCircleHeightBackground / 2, y: kCircleBackgroundTopPosition, width: kCircleHeightBackground, height: kCircleHeightBackground))
self.circleViewBackground.layer.cornerRadius = self.circleViewBackground.frame.size.height / 2;
self.circleViewBackground.backgroundColor = UIColor.white
// Circle View Image
self.circleIconImageView = UIImageView(frame: CGRect(x: kCircleHeight / 2 - kCircleIconHeight / 2, y: kCircleHeight / 2 - kCircleIconHeight / 2, width: kCircleIconHeight, height: kCircleIconHeight))
self.circleView.addSubview(self.circleIconImageView)
// Title
self.labelView = UILabel(frame: CGRect(x: 12, y: kCircleHeight / 2 + 22, width: kWindowWidth - 24, height: 40))
self.labelView.numberOfLines = 1
self.labelView.textAlignment = NSTextAlignment.center
self.labelView.font = UIFont(name: kDefaultFont as String, size: 20)
self.contentView.addSubview(self.labelView)
// Subtitle
self.labelViewDescription = UILabel(frame: CGRect(x: 12, y: 84, width: kWindowWidth - 24, height: 80))
self.labelViewDescription.numberOfLines = 3
self.labelViewDescription.textAlignment = NSTextAlignment.center
self.labelViewDescription.font = UIFont(name: kDefaultFont as String, size: 14)
self.contentView.addSubview(self.labelViewDescription)
// Shadow View
self.shadowView = UIView(frame: UIScreen.main.bounds)
self.shadowView.backgroundColor = UIColor.black
// Done Button
self.doneButton = UIButton(frame: CGRect(x: 12, y: kWindowHeight - 52, width: kWindowWidth - 24, height: 40))
self.doneButton.layer.cornerRadius = 3
self.doneButton.layer.masksToBounds = true
self.doneButton.setTitle("Done", for: UIControlState())
self.doneButton.titleLabel?.font = UIFont(name: kDefaultFont as String, size: 14)
self.contentView.addSubview(self.doneButton)
// Root view controller
self.rootViewController = UIViewController()
// Superclass initiation
super.init(frame: CGRect(x: ((320 - kWindowWidth) / 2), y: 0 - kWindowHeight, width: kWindowWidth, height: kWindowHeight))
// Show notice on screen
self.addSubview(self.contentView)
self.addSubview(self.circleViewBackground)
self.addSubview(self.circleView)
// Colours
self.contentView.backgroundColor = UIColorFromRGB(0xFFFFFF)
self.labelView.textColor = UIColorFromRGB(0x4D4D4D)
self.labelViewDescription.textColor = UIColorFromRGB(0x4D4D4D)
self.contentView.layer.borderColor = UIColorFromRGB(0xCCCCCC).cgColor
// On complete.
self.doneButton.addTarget(self, action: #selector(MyAlertView.doneButtonAction), for: UIControlEvents.touchUpInside)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// showTitle(view, title, subTitle, style)
func showTitle(_ view: UIViewController, title: String, subTitle: String, style: MyAlertViewStyle) {
return showTitle(view, title: title, subTitle: subTitle, completeText: nil, style: style)
}
// showSuccess(view, title, subTitle)
func showSuccess(_ view: UIViewController, title: String, subTitle: String) {
return showTitle(view, title: title, subTitle: subTitle, completeText: nil, style: MyAlertViewStyle.success);
}
// showError(view, title, subTitle)
func showError(_ view: UIViewController, title: String, subTitle: String) {
return showTitle(view, title: title, subTitle: subTitle, completeText: nil, style: MyAlertViewStyle.error);
}
// showNotice(view, title, subTitle)
func showNotice(_ view: UIViewController, title: String, subTitle: String) {
return showTitle(view, title: title, subTitle: subTitle, completeText: nil, style: MyAlertViewStyle.notice);
}
// showWarning(view, title, subTitle)
func showWarning(_ view: UIViewController, title: String, subTitle: String) {
return showTitle(view, title: title, subTitle: subTitle, completeText: nil, style: MyAlertViewStyle.warning);
}
// showInfo(view, title, subTitle)
func showInfo(_ view: UIViewController, title: String, subTitle: String) {
return showTitle(view, title: title, subTitle: subTitle, completeText: nil, style: MyAlertViewStyle.info);
}
// showTitle(view, title, subTitle, duration, style)
func showTitle(_ view:UIViewController, title: String, subTitle: String, completeText: String?, style: MyAlertViewStyle) {
self.alpha = 0;
self.rootViewController = view
self.rootViewController.view.addSubview(self.shadowView)
self.rootViewController.view.addSubview(self)
// Complete text
if(completeText != nil) {
self.doneButton.setTitle(completeText, for: UIControlState())
}
// Alert colour/icon
var viewColor: UIColor = UIColor()
var iconImageName: NSString = ""
// Icon style
switch(style) {
case MyAlertViewStyle.success:
viewColor = UIColorFromRGB(0x22B573);
iconImageName = "notification-success"
case MyAlertViewStyle.error:
viewColor = UIColorFromRGB(0xC1272D);
iconImageName = "notification-error"
case MyAlertViewStyle.notice:
viewColor = UIColorFromRGB(0x727375)
iconImageName = "notification-notice"
case MyAlertViewStyle.warning:
viewColor = UIColorFromRGB(0xFFD110);
iconImageName = "notification-warning"
case MyAlertViewStyle.info:
viewColor = UIColorFromRGB(0x2866BF);
iconImageName = "notification-info"
}
// Title
if ((title as NSString).length > 0 ) {
self.labelView.text = title;
}
// Subtitle
if ((subTitle as NSString).length > 0) {
self.labelViewDescription.text = subTitle;
}
// Alert view colour and images
self.doneButton.backgroundColor = viewColor;
self.circleView.backgroundColor = viewColor;
self.circleIconImageView.image = UIImage(named: iconImageName as String)
// Animate in the alert view
UIView.animate(withDuration: 0.2, animations: {
self.shadowView.alpha = self.kDefaultShadowOpacity
var frame:CGRect = self.frame;
frame.origin.y = self.rootViewController.view.center.y - 100;
self.frame = frame;
self.alpha = 1;
}, completion: { finished in
UIView.animate(withDuration: 0.2, animations: {
self.center = self.rootViewController.view.center;
}, completion: { finished in })
})
}
// When click 'Done' button, hide view.
func doneButtonAction() { hideView(); }
//Close MyAlertView By duration
func hideMyAlertView(duration: TimeInterval?) {
// Adding duration
if (duration != nil) {
durationTimer?.invalidate()
durationTimer = Timer.scheduledTimer(timeInterval: duration!, target: self, selector: #selector(MyAlertView.hideView), userInfo: nil, repeats: false)
}
}
// Close MyAlertView
func hideView() {
UIView.animate(withDuration: 0.2, animations: {
self.shadowView.alpha = 0;
self.alpha = 0;
}, completion: { finished in
self.shadowView.removeFromSuperview()
self.removeFromSuperview()
})
}
// Helper function to convert from RGB to UIColor
func UIColorFromRGB(_ rgbValue: UInt) -> UIColor {
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
}
}
ViewController.swift
import UIKit
let kSuccessTitle: NSString = "Congratulations"
let kErrorTitle: NSString = "Connection error"
let kNoticeTitle: NSString = "Notice"
let kWarningTitle: NSString = "Warning"
let kInfoTitle: NSString = "Info"
let kSubtitle: NSString = "You've just displayed this awesome Pop Up View"
let kDefaultAnimationDuration = 2.0
class ViewController: UIViewController {
let alertView = MyAlertView()
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func success(_ sender: Any) {
alertView.showSuccess(self, title: kSuccessTitle as String, subTitle: kSubtitle as String)
alertView.hideMyAlertView(duration: 1.0)
}
@IBAction func error(_ sender: Any) {
alertView.showError(self, title: kErrorTitle as String, subTitle: kSubtitle as String)
alertView.hideMyAlertView(duration: 2.0)
}
@IBAction func notice(_ sender: Any) {
alertView.showNotice(self, title: kNoticeTitle as String, subTitle: kSubtitle as String)
alertView.hideMyAlertView(duration: 3.0)
}
@IBAction func warning(_ sender: Any) {
alertView.showWarning(self, title: kWarningTitle as String, subTitle: kSubtitle as String)
alertView.hideMyAlertView(duration: 4.0)
}
@IBAction func info(_ sender: Any) {
alertView.showInfo(self, title: kInfoTitle as String, subTitle: kSubtitle as String)
alertView.hideMyAlertView(duration: 5.0)
}
}
效果图如下:

自定义AlertView(Swift)的更多相关文章
- Swift自定义AlertView
今天项目加新需求,添加积分过期提醒功能: 第一反应就用系统的UIAlertViewController,但是message中积分是需要红色显示. // let str = "尊敬的顾客,您有 ...
- iOS 第三方自定义Alertview项目MBProcessHud中的重要代码分析
做ios,弹出一个自定义的alertview挺常见的.ios7以前,我们可以对系统的UIAlertView进行一点操作,实现一点简单的定制,但是ios7不再允许我们这样做了.因此,我们需要自己创建一个 ...
- 兼容iOs7的自定义alertView
转载请注明出处. 升级到ios7后,旧项目中使用的继承UIAlertView的自定义alertview无法正常显示了,无奈只好换思路去实现,改成从当前keywindow下创建要显示的alertview ...
- 自定义AlertView的方法和改变Alert的弹出位置以及其宽度
此方法在IOS7中不适合 一.自定义AlertView 1.首先新建一个OC类继承与AlertView. 2.然后再.m中添加方法 - (void)layoutSubviews 可以再这个方法里边改变 ...
- iOS开发——自定义AlertView
自定义的AlertView,可以选择出现的动画方式,正文信息高度自动变化,特意做了几个可以对比.没啥难点,直接上代码,一看就懂. 1.在YYTAlertView.h文件中 // // YYTAler ...
- 自定义AlertView实现模态对话框
在Windows应用程序中,经常使用模态(Model)对话框来和用户进行简单的交互,比如登录框.在IOS应用程序中,有时我们也希望做同样的事情.但IOS的UI库中,没有模态对话框,最接近那个样子的应该 ...
- IOS自定义alertview
在家闲来无事,于是就看起来ios绘图的那块,写点什么好呢? 鼓捣了一会,总算写出了一个小东西 这个是写完以后的效果 这里我实现了三种款式的alertview 分别是成功,错误和警告,剩下的呢有空继续添 ...
- iOS自定义AlertView 与 ActionSheet 遮罩提示+弹出动画
产品大人总是能够想到很多让人欣慰的点子,基本所有能提示的地方都要很多文案啊图片之类 由此封装了一个半透明黑色遮罩的alert类(假装有图.jpg) 代码略糙,just share (逃 下载链接
- Swift之高德地图自定义标注弹出气泡样式
在用到地图类的sdk,sdk自带的样式必定不能满足开发者的需求,于是开发者不得不进行自定义,由于官方同样是object-c 版语法,不得不将其转为swift语法,以满足项目需求. 新建两个类 Cust ...
随机推荐
- mysql-练级查询
mysql的链接查询中主要有五大类链接查询 1.内连接查询 1.1:等值链接查询:指使用等号"="比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连结列值相等的记录. SEL ...
- AHK进阶之路
本文摘自 http://www.cnblogs.com/echorep/p/4911117.html 小鸟学AHK(1)之运行程序或打开文档 AHK就是AutoHotKey,是一款免费的.Wind ...
- Controller接收处理json、xml格式数据
1.RequestBody接收json格式的数据,并直接转为对象. User.java使用lombok依赖包 @Data @AllArgsConstructor @NoArgsConstructor ...
- Python语言编写脚本时,对日期控件的处理方式
对日期控件,日期控件的输入控一般是不能手动输入的:把readonly属性去掉就好 其实很简单,我们不去搞时间日期空间,我们把它当成一个普通的input框处理就好了! 但是,很多此类型input框都是禁 ...
- sql*plus常用指令介紹
sql*plus常用指令介紹 1.用set指令來設定SQL*Plus的環境參數值 格式: Set 環境參數名 環境參數值 ex:set feedback on set feedback 8.用show ...
- 01_1_准备ibatis环境
01_1_准备ibatis环境 1. 搭建环境:导入相关的jar包 mysql-connector-java-5.1.5-bin.jar(mysql)或者ojdbc6.jar(oracle).ibat ...
- Java基础面试操作题:Java代理工厂设计模式 ProxyFactory 有一个Baby类,有Cry行为,Baby可以配一个保姆 但是作为保姆必须遵守保姆协议:能够处理Baby类Cry的行为,如喂奶、哄睡觉。
package com.swift; public class Baby_Baomu_ProxyFactory_Test { public static void main(String[] args ...
- 【线段树合并】bzoj3545: [ONTAK2010]Peaks
1A还行 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问, ...
- Centos7离线部署kubernetes 1.13集群记录
一.说明 本篇主要参考kubernetes中文社区的一篇部署文章(CentOS 使用二进制部署 Kubernetes 1.13集群),并做了更详细的记录以备用. 二.部署环境 1.kubernetes ...
- python--以1-31的数字作为结尾的列表?论英文好的重要性!
一.python基础教程第2板(修订版)[代码清单2-1]中有一段要求打印‘以1-31的数字作为结尾的列表’ 截取代码示例:endings =['st','nd','rd'] +17*['th'] + ...