使用:
-(WelcomView*)welcomeView{
if (!_welcomeView) {
_welcomeView = [[NSBundle mainBundle] loadNibNamed:@"WelcomView" owner:nil options:nil].firstObject;
_welcomeView.frame = self.window.frame;
}
return _welcomeView;
} ............
ImgModel *im = [[ImgModel alloc]init];
[im setValuesForKeysWithDictionary:obj];
self.welcomeView.imgArray = @[im];
//MARK:- Timer
extension Timer{
/**
*计时器暂停
*/
func timer_pause(){
self.fireDate = Date.distantFuture
} /**
*计时器继续
*/
func timer_continue(){
self.fireDate = Date.distantPast
}
}
import UIKit
//图片信息模型,根据需求修改
class ImgModel: NSObject {
var PicPath = ""
var PicDescription = ""
var AppSubjectPictureID = ""
var InfoLinkUrl = ""
var ShowSeconds = "" override func setValue(_ value: Any?, forUndefinedKey key: String) {
#if DEBUG
print("ImgModel出现了未定义的字段:\(key)-->\(String(describing: value))")
#endif
}
} class WelcomView: UIView ,UIScrollViewDelegate{
//空间关联
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var pageController: UIPageControl!
@IBOutlet weak var titleLB: UILabel!
@IBOutlet weak var btnBgview: UIView!
@IBOutlet weak var timeLB: UILabel!
@IBOutlet weak var intoMainBtn: UIButton! var stopIndex = 0 //滚动视图停止时候停在的位置
var beginPoint = CGPoint()
var beginPoint1 = CGPoint()
var second = 0
var beginSecond = 0
var timer:Timer?
//图片资源数组
var imgArray = [ImgModel]() {
didSet{
scrollView.tag = 1000
scrollView.contentSize = CGSize(width: CGFloat(imgArray.count)*self.frame.width, height: self.frame.height)
pageController.numberOfPages = imgArray.count
scrollView.isPagingEnabled = true
scrollView.bounces = true
scrollView.showsVerticalScrollIndicator = false
scrollView.showsHorizontalScrollIndicator = false
scrollView.delegate = self
for (index,ele) in imgArray.enumerated() {
let sv = UIScrollView(frame: CGRect(x: CGFloat(index)*self.frame.width, y: 0, width: self.frame.width, height: self.frame.height))
sv.tag = 1000 + (index + 1)
sv.delegate = self
sv.bounces = false
sv.showsVerticalScrollIndicator = false
sv.showsHorizontalScrollIndicator = false
sv.decelerationRate = 0.5
sv.contentSize = CGSize(width: self.frame.width, height: self.frame.height*2)
let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height))
sv.addSubview(imgView)
scrollView.addSubview(sv)
imgView.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action:#selector(tapAction))
imgView.addGestureRecognizer(tap)
second = Int(ele.ShowSeconds)!
beginSecond = second
DispatchQueue.main.async {
imgView.sd_setImage(with: URL(string:ele.PicPath), placeholderImage: UIImage(named: "正在加载"), options: .lowPriority, completed: { (img:UIImage?, erro:Error?, type:SDImageCacheType, imgUrl:URL?) in
if erro != nil{
self.removeFromSuperview()
self.showHint((erro?.localizedDescription)!)
}else{
appDelegate.window.addSubview(self)
}
})
}
}
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerNumChange(t:)), userInfo: nil, repeats: true)
//self.perform(#selector(removeSelf), with: nil, afterDelay: TimeInterval(second))
self.bringSubview(toFront: self.btnBgview)
}
} func timerNumChange(t:Timer){
second -= 1
if second >= 0 {
timeLB.text = "\(second)s"
}else{
self.removeSelf()
timer?.invalidate()
}
} @IBAction func btnAction(_ sender: UIButton) {
self.removeFromSuperview()
} //将自己移出界面
func removeSelf(){
UIView.animate(withDuration: 0.5, animations: {
self.center.y = -sheight/2
}) { (done:Bool) in
if done {
self.removeFromSuperview()
}
}
} override func draw(_ rect: CGRect) {
// Drawing code
super.draw(rect)
} override func awakeFromNib() {
super.awakeFromNib()
btnBgview.layer.cornerRadius = 25/2
btnBgview.layer.masksToBounds = true
} //图片点击事件
func tapAction(){
print("点击了第\(stopIndex)张")
} //MARK:ScrollView delegate
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
if scrollView.tag > 1000 {
beginPoint = self.center
beginPoint1 = scrollView.contentOffset
timer?.timer_pause()
//NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(removeSelf), object: nil)
}
} func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.tag > 1000 {
self.center.y = beginPoint.y - scrollView.contentOffset.y - beginPoint1.y
for imgView in scrollView.subviews {
if imgView.isKind(of: UIImageView.self) {
imgView.center = CGPoint(x: appDelegate.window.center.x, y: scrollView.center.y + scrollView.contentOffset.y - beginPoint1.y)
break
}
}
}
} func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if scrollView.tag == 1000 {
let offset = scrollView.contentOffset.x
let swidth = UIScreen.main.bounds.size.width
stopIndex = Int(offset / swidth)
pageController.currentPage = stopIndex }else{
scrollView.isScrollEnabled = true
scrollViewDidEndAction(scrollView)
}
} func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if decelerate{
if scrollView.tag > 1000 {
scrollView.isScrollEnabled = false
}
}else{
if scrollView.tag > 1000 {
scrollViewDidEndAction(scrollView)
}
}
} //MARK:滚动结束(界面速度为0)
func scrollViewDidEndAction(_ scrollView: UIScrollView){ if self.center.y < 0 {
UIView.animate(withDuration: 0.5, animations: {
self.center = CGPoint(x: self.center.x, y: appDelegate.window.center.y * -2)
}) { (done:Bool) in
if done {
self.removeFromSuperview()
}
}
}else{
UIView.animate(withDuration: 0.3, delay: 0.1, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.1, options: .curveLinear, animations: {
self.center = appDelegate.window.center
}) { (done:Bool) in
if done {
scrollView.contentOffset = self.beginPoint1
for imgView in scrollView.subviews {
if imgView.isKind(of: UIImageView.self) {
imgView.center = CGPoint(x: appDelegate.window.center.x, y: scrollView.center.y)
break
}
}
self.second = self.beginSecond + 1
self.timer?.timer_continue()
}
}
}
}
}

XIB效果图

Swift可向上滑移出界面的欢迎页简单封装的更多相关文章

  1. swift开发之--简单封装Alamofire请求类以及简单使用SnapKit

    以前在swift3的时候,写过类似的,那个时候还没有很成熟的网络请求类库,在这里,还是衷心感谢大神们的付出! 具体效果如下,先上图: 点击按钮的时候,请求数据,数据结构如下: { ; reason = ...

  2. iOS开发Swift篇(02) NSThread线程相关简单说明

    iOS开发Swift篇(02) NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThread在s ...

  3. iOS开发笔记(Swift)-通用App安装引导页的实现

    之前一直做的项目都是基于OC开发的,最近开始尝试使用Swift语言来重写整个项目. 本篇文章主要是讲述如何使用Swift来实现常见的通用App安装引导界面. 效果预览: 实现思路: 主要是采用了UIS ...

  4. 页面的Tab选项卡 简单实例

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  5. 【Swift】 GET&POST请求 网络缓存的简单处理

     GET & POST 的对比 源码:https://github.com/SpongeBob-GitHub/Get-Post.git 1. URL - GET 所有的参数都包含在 URL 中 ...

  6. vuex存取token,http简单封装、模拟登入权限校验操作、路由懒加载的几种方式、vue单页设置title

    1.config index.js下面的跨域代理设置: proxyTable: { '/api': { target: 'http://xxxx', //要访问的后端接口 changeOrigin: ...

  7. Swift - 简单封装一个工具类模板

    创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...

  8. swift:用UITabBarController、UINavigationController、模态窗口简单的搭建一个QQ界面

    搭建一个QQ界面其实是一个很简单的实现,需要几种切换视图的控制器组合一起使用,即导航控制器.标签栏控制器.模态窗口.其中,将标签栏控制器设置为window的rootViewController,因为Q ...

  9. iOS开发——UI篇Swift篇&玩转UItableView(四)自定义&封装

    UItableView自定义&封装 一:Model class AppsModel: NSObject { //定义模型的三个属性 var imageName:String! //图片名称 v ...

随机推荐

  1. node.js 关于 async的使用

    第一次使用,感觉有点糊涂,后来实验明白了. 在串行执行中,经常会只做了第一步.后来明白了.是没有把回调函数放在里面简单就是:  async.series(                 {     ...

  2. VisualStudio使用技巧

    控制台工程去除黑框 刚学习OpenGL,绘制图形的时候,如果不进行设置,运行的时候会先出现黑窗口再出现Windows窗口.其实要去除控制台窗口非常简单,只需要修改工程设置,把子系统改成Windows, ...

  3. 糟糕的@@identity,SCOPE_IDENTITY ,IDENT_CURRENT

    在某数据库里面,某甲用@@identity来获取最近插入的id值,当在多人环境,发生获取到null值的问题. 那么@@identity是否有存在的必要? 感觉像生个孩子,多了个指头. 有的数据库的ge ...

  4. ksort排序的依据是什么

    ksort:升序 asort:降序

  5. jmeter对需要登录的接口进行性能测测试

    只需要一步: https://www.testwo.com/blog/7253

  6. maven下载的jar相应pom文件下载不完整问题。

    今天遇到一个奇葩问题: 同样的项目,我启动报错 : 某个class文件找不到.. 查找maven 依赖也的确没有找到 对应的jar 包. 查找同事项目,可以看到该class对应的 jar 包 是 lo ...

  7. javascript 事件流的应用之 addEventListener

    原始需求:防止按钮短时间内高频率触发点击事件,由于重复提交导致的业务异常. 图: demo: <!DOCTYPE html> <html lang="en" di ...

  8. 纯css导航栏下划线

    .nav-underline > *{/* 指定容器,里面可以是li.span等多样化的元素 */ display: inline-block; margin: -3px; padding: 1 ...

  9. web API分类

    什么是Web API? Web API是网络应用程序接口.包含了广泛的功能,网络应用通过API接口,可以实现存储服务.消息服务.计算服务等能力,利用这些能力可以进行开发出强大功能的web应用. 分类 ...

  10. android开发笔记(1)

    最近老师要求我们使用android开发一些东西.但是对我们而言,android是一个未知的方面.先说说我对于android的软件的基本认识,首先他很难,因为他是一个未知的领域:其次,我们只是掌握了一些 ...