使用:
-(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. this 关键字 详解

    JS中的this关键字让很多新老JS开发人员都感到困惑.这篇文章将对this关键字进行完整地阐述.读完本文以后,您的困惑将全部消除.您将学会如何在各种不同的情形正确运用this. 我们和在英语.法语这 ...

  2. 在nginx中,禁止IP访问.只可以使用域名访问.

    if ($host ~* "\d+\.\d+\.\d+\.\d+"){ ; } 其实说白了, 就是进行host主机头过滤,使用正则来判断下.

  3. 基于稀疏表(Sparse Table)的RMQ(区间最值问题)

    在RMQ的其他实现方法中,有一种叫做ST的算法比较常见. [构建] dp[i][j]表示的是从i起连续的2j个数xi,xi+1,xi+2,...xi+2j-1( 区间为[i,i+2j-1] )的最值. ...

  4. sscanf 解析字符串

    test.txt中内容如下所示: eth0||192.168.0.2-192.168.0.150 eth2||192.168.0.2-192.168.0.150 想要将其中的ip地址等解析出来: #i ...

  5. js中 xpath 使用

    一.使用: 非IE浏览器,使用 document.evaluate var result = document.evaluate("//a[@href]", document, n ...

  6. C# 创建精简版IIS

    1. 方法 一 using System; using System.Collections.Generic; using System.Text; using System.Threading; u ...

  7. C# WebService创建、发布、调用的简单例子

    Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

  8. 求和(NOIP2015)

    题目链接:求和 这道题不是很简单,因为数据并不是很小,常规计算会t. 这里引用chenleyu的解答(如果想要cgg原创解答,--改天吧): 这题相对是比较难的,首先我们要解读题目的意思 一条狭长的纸 ...

  9. 清幽傲竹实现的kbmMWServer数据库联接失败重联(转载红鱼儿)

    1.修改kbmMWUnidac单元的TkbmMWUNIDACConnection.InternalOpenConnection方法,加上:          //支持unidac重联          ...

  10. 牛客训练四:Applese 走方格(细节)

    题目链接:传送门 思路:主要是n=1,m=2或者n=2,m=1时,不是-1. #include<iostream> #include<cstdio> #include<c ...