一款自定义的提示框JHToast(swift)
来源:互联网 发布:学做美工 编辑:程序博客网 时间:2024/06/18 01:54
iOS的风格和Apple其他产品一样,简单而粗暴。没有给人其他选择的余地,让你又爱又恨。同样的,Apple对待iOS平台的开发人员和对待大众消费者一样,也不给你留余地。UIAlertView就是一个鲜明标志。功能简单,甚至单一,定制性差,消耗资源。在资源紧张的设备上,UIAlertView的动画效果都会稍微卡一下,很是别扭。
这时还是很希望在iOS上有一个Android风格的Toast控件。
我制作了一个demo,使用起来感觉效果还是很不错的,简单易用,在这里和大家分享一下。(swift3.0)
import UIKitenum JHToastShowType { case JHToastShowTypeTop, JHToastShowTypeCenter, JHToastShowTypeBottom}let kDefaultForwardAnimationDuration:CFTimeInterval = 0.5let kDefaultBackwardAnimationDuration:CFTimeInterval = 0.5let kDefautlWaitAnimationDuration:CFTimeInterval = 1.0let kDefaultTopMargin:CGFloat = 70let kDefaultTextInset:CGFloat = 12class JHToast: UILabel,CAAnimationDelegate { private var forwardAnimationDuration : CFTimeInterval! private var backwardAnimationDuration : CFTimeInterval! private var textInsets : UIEdgeInsets! private var maxWidth : CGFloat! override func awakeFromNib() { super.awakeFromNib() } override init(frame: CGRect) { super.init(frame: frame) self.forwardAnimationDuration = kDefaultForwardAnimationDuration self.backwardAnimationDuration = kDefaultBackwardAnimationDuration self.textInsets = UIEdgeInsetsMake(kDefaultTextInset, kDefaultTextInset, kDefaultTextInset, kDefaultTextInset) self.maxWidth = UIScreen.main.bounds.size.width - 20 self.layer.cornerRadius = 5 self.layer.masksToBounds = true self.backgroundColor = UIColor.black.withAlphaComponent(0.6) self.numberOfLines = 0 self.textAlignment = .center self.textColor = UIColor.white self.font = UIFont.systemFont(ofSize: 13.0) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) fatalError("init(coder:) has not been implemented") } func showToast(text:String, type:JHToastShowType) { self.text = text self.sizeToFit() self.showType(type: type) } private func showType(type:JHToastShowType) { let keyWindow = UIApplication.shared.delegate?.window self.addAnimationGroup() var point = keyWindow??.center switch type { case .JHToastShowTypeTop: point?.y = kDefaultTopMargin break case .JHToastShowTypeCenter: break case .JHToastShowTypeBottom: point?.y = (keyWindow??.bounds.size.height)! - kDefaultTopMargin break } self.center = point! keyWindow??.addSubview(self) } /** Animation */ private func addAnimationGroup() { let forwardAnimation = CABasicAnimation.init(keyPath: "transform.scale") forwardAnimation.duration = self.forwardAnimationDuration forwardAnimation.timingFunction = CAMediaTimingFunction.init(controlPoints: 0.5, 1.7, 0.6, 0.85) forwardAnimation.fromValue = NSNumber.init(value: 0.0) forwardAnimation.toValue = NSNumber.init(value: 1.0) let backwardAnimation = CABasicAnimation.init(keyPath: "transform.scale") backwardAnimation.duration = self.backwardAnimationDuration backwardAnimation.beginTime = forwardAnimation.duration + kDefautlWaitAnimationDuration backwardAnimation.timingFunction = CAMediaTimingFunction.init(controlPoints: 0.4, 0.15, 0.5, -0.7) backwardAnimation.fromValue = NSNumber.init(value: 1.0) backwardAnimation.toValue = NSNumber.init(value: 0.0) let animationGroup = CAAnimationGroup() animationGroup.animations = [forwardAnimation,backwardAnimation] animationGroup.duration = forwardAnimation.duration + backwardAnimation.duration + kDefautlWaitAnimationDuration animationGroup.isRemovedOnCompletion = false animationGroup.delegate = self animationGroup.fillMode = kCAFillModeForwards self.layer.add(animationGroup, forKey: "customShow") } func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { if flag { self.removeFromSuperview() self.layer.removeAnimation(forKey: "customShow") } } /** text */ override func sizeToFit() { super.sizeToFit() var frame = self.frame let width = self.bounds.size.width + self.textInsets.left + self.textInsets.right frame.size.width = min(width, self.maxWidth) frame.size.height = self.bounds.size.height + self.textInsets.top + self.textInsets.bottom self.frame = frame } override func draw(_ rect: CGRect) { super.drawText(in: UIEdgeInsetsInsetRect(rect, self.textInsets)) } override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect { let size = self.text?.boundingRect( with: CGSize.init(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName:self.font], context:nil).size let bound = CGRect.init(origin: bounds.origin, size: size!) return bound }}
Github上有完整代码,喜欢的给颗星哦,谢谢!
下载代码JHToast
0 0
- 一款自定义的提示框JHToast(swift)
- 一款类似网易新闻的条件筛选器(swift)
- Swift - 告警提示框(UIAlertController)的用法
- Swift - 告警提示框(UIAlertController)的用法
- Swift - 告警提示框(UIAlertController)的用法
- Swift - 告警提示框(UIAlertController)的用法
- Swift - 告警提示框(UIAlertController)的用法
- Swift - 警告提示框(UIAlertController)的用法
- Swift - 告警提示框(UIAlertController)的用法
- 简单的自定义提示框(alert)
- Swift自定义控制器代码提示不出来
- swift 提示框
- Swift 提示框 UIAlertViewController
- Swift提示框
- 一款小巧的jquery消息提示插件
- 自定义presentViewController的转场动画(Swift)
- swift 相册的自定义
- 一款自定义的热门搜索组件
- log4j.properties 配置详解
- ECharts地图详解
- 安卓工具
- linux屏幕亮度调节解决办法
- 环形队列
- 一款自定义的提示框JHToast(swift)
- stm32模拟串口(基于高精度延时)
- Python 内置函数 lambda、filter、map、reduce
- 安卓注释模板---(安卓学习笔记)
- Json数据生成实体类报错
- c++类型转换详解
- CentOS_Mysql语句大全
- NVMe驱动解析-注册设备
- css3 3D旋转特效