启动页广告设置

策略

广告显示策略=
   1)只有1张时,显示3秒;
   2)多余1张时,每张显示1秒,最多三张;
   3)首次加载不显示广告,并缓存广告(链接),第二次开始显示广告并缓存图片;
   4)缓存过期时间7天
   5)预留点击响应接口

这么晚了,还是直接上代码吧

class BannerView: UIView {

    private var scrollView: UIScrollView?
    public var currentPageIndex: Int = 0
    fileprivate var animationTimer: Timer?
    fileprivate var pageControl : UIPageControl?
    
    //block
    public var contentViewAtIndex : ((_ pageIndex: Int)->UIImageView)?
    public var tapActionBlock: ((_ pageIndex: Int)-> Void)?
    public var endActionBlock: (() -> Void)?
    //private
    private var contentViews : [UIImageView] = []
    fileprivate var animationInterval : TimeInterval?
    private var totalPages :  Int?
    private var jumpButton = UIButton(type: .custom);
    
    deinit {
        scrollView?.delegate = nil
        if self.animationTimer != nil {
            self.animationTimer?.invalidate();
            self.animationTimer = nil;
        }
    }
    
    public  init(frame: CGRect ,_ duration: TimeInterval,iamgeUrls: [URL]) {
        super.init(frame: frame)
        if duration > 0 {
            animationTimer = Timer.scheduledTimer(timeInterval: duration, target: self, selector: #selector(animationTimerDidFire(timer:)), userInfo: nil, repeats: true)
        }
        animationInterval = duration
        self.clipsToBounds = true
        scrollView = UIScrollView(frame: self.bounds)
        scrollView?.scrollsToTop = true
        scrollView?.isPagingEnabled = true
        scrollView?.delegate = self
        
        scrollView?.contentOffset = CGPoint(x: 0, y: 0)
        scrollView?.contentSize = CGSize(width: CGFloat(iamgeUrls.count) * ScreenWidth, height: self.bounds.size.height)
        self.addSubview(scrollView!)
        pageControl = UIPageControl(frame: CGRect(x: 0, y: self.bounds.size.height - 30, width: ScreenWidth, height: 10))
        pageControl?.isUserInteractionEnabled = false
        self.addSubview(pageControl!)
        for index in 0..<iamgeUrls.count {
            let imageView = UIImageView()
            imageView.setImage(with: iamgeUrls[index] )
            imageView.frame = CGRect(x: 0 + CGFloat(index) * ScreenWidth , y: 0, width: ScreenWidth, height: self.bounds.size.height)
            imageView.isUserInteractionEnabled = true;
            imageView.tag = 200 + index;
            let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(contentViewTapped(sender:)))
            imageView.addGestureRecognizer(tapGesture);
            scrollView?.addSubview(imageView);
            
        }
        jumpButton.frame = CGRect(x: ScreenWidth - 70.0, y: 34, width: 60, height: 30);
        jumpButton.backgroundColor = UIColor.black;
        jumpButton.alpha = 0.4;
        jumpButton.setTitle(String(format: "跳过(%d)", iamgeUrls.count), for: .normal)
        jumpButton.setTitleColor(UIColor.white, for: .normal)
        jumpButton.titleLabel?.font = UIFont.systemFont(ofSize: 13);
        jumpButton.addTarget(self, action: #selector(jumpButttonAction(sender:)), for: .touchUpInside)
        self.addSubview(jumpButton);
        
        
    }
    //MARK:设置总页数后,启动动画
    
    public  func setTotalPagesCount(totalPageCout: (()->(Int))) {
        self.totalPages = totalPageCout()
        if self.totalPages! > 3 {
            self.totalPages = 3;
        }
       // print("totalPages = \(self.totalPages)")
        
        self.pageControl?.numberOfPages = self.totalPages!
        pageControl?.backgroundColor = UIColor.clear
        pageControl?.isUserInteractionEnabled = true
        
        self.currentPageIndex = 0
        if self.totalPages == 1 {
            self.totalPages = 2
            scrollView?.contentSize = CGSize(width: ScreenWidth, height: self.bounds.size.height)
            //configureContentViews()
            self.pageControl?.isHidden = true
            animationTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(countDown(timer:)), userInfo: nil, repeats: true)
            self.animationTimer?.resume()
        }else{
            self.pageControl?.isHidden = false
        }
        if self.totalPages! > 0 && self.totalPages! != 1 {
            //configureContentViews()
            self.animationTimer?.resumeAfter(interval: self.animationInterval!)
        }
        
        
    }
    
    func countDown(timer:Timer) {
        self.totalPages = self.totalPages! - 1;
        jumpButton.setTitle(String(format: "跳过(%d)", self.totalPages! ), for: .normal)
        if self.totalPages == 0 {
            if let endActionBlock = self.endActionBlock {
                endActionBlock();
                scrollView?.delegate = nil
                if self.animationTimer != nil {
                    self.animationTimer?.invalidate();
                    self.animationTimer = nil;
                }
            }
        }
    }
    
    func jumpButttonAction(sender: UIButton) {
        if let endActionBlock = self.endActionBlock {
            endActionBlock();
            scrollView?.delegate = nil
            if self.animationTimer != nil {
                self.animationTimer?.invalidate();
                self.animationTimer = nil;
            }
        }
    }
    
    
    //点击事件
    func contentViewTapped(sender: UIGestureRecognizer){
        let index: NSInteger = (sender.view?.tag)! - 200;
        if self.tapActionBlock != nil {
            self.tapActionBlock!(index)
        }
        
    }
    
    @objc fileprivate func animationTimerDidFire(timer:Timer){
        self.currentPageIndex = self.currentPageIndex + 1;
        self.scrollView?.setContentOffset(CGPoint(x: ScreenWidth * CGFloat(currentPageIndex ), y: 0),animated: true)
        self.countDown(timer: timer)
        
    }
    
    public required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}


extension BannerView: UIScrollViewDelegate {
    
    public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        self.animationTimer?.pause()
    }
    public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        self.animationTimer?.resumeAfter(interval: self.animationInterval!)
    }
    public func scrollViewDidScroll(_ scrollView: UIScrollView) {
        self.pageControl?.currentPage = self.currentPageIndex
    }
    public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        scrollView.setContentOffset(CGPoint(x: ScreenWidth, y: 0), animated: true)
    }
    
    
}

contrller的代码

    let urls: [URL] = (imageUrls?.map { (string) -> URL in
            return URL(string: string)!;
            })!;
        let imageView = UIImageView();
        imageView.image = UIImage(named: "Image_ad_log");
        //imageView.frame = CGRect(x: 0, y: ScreenHeight * 0.7, width: ScreenWidth, height: ScreenHeight * 0.3);
        
        self.bannerScroller = BannerView(frame: CGRect(x: 0, y: 0, width: ScreenWidth, height: ScreenHeight - 170), 1,iamgeUrls: urls)
        self.view.addSubview(bannerScroller!);
        
        self.view.addSubview(imageView);
        imageView.snp.makeConstraints { (make) in
            make.centerX.equalTo(self.view)
            make.width.equalTo(200)
            make.height.equalTo(170)
            make.centerY.equalTo(ScreenHeight - 85)
        }
        
        guard urls.count > 0 else {
            let appdelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate;
            appdelegate.custmozizeRootViewContrller()
            return
        }
        
        //点击回调响应
        bannerScroller?.tapActionBlock = {(index) in
            print("点击==\(index)")
        }
        
        bannerScroller?.endActionBlock =  { () in
            let appdelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate;
            appdelegate.custmozizeRootViewContrller()
        }

最主要的代码都在了,意会吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,079评论 25 707
  • 任何事情,开始的时候最难。一旦开始了,就如同箭已离弦,就有了自己的轨迹了。今晚这些文字,就是一个开始。 感谢自己,...
    龙三三阅读 187评论 0 0
  • 向白云, 向树, 向静默的草坡, 向草坡上静默的石头, 学习。 是的, 向它们学习, 学习它们的静默, 不管有没有...
    野菊芬芳阅读 219评论 0 2
  • 锦江水如画, 酒绿映灯红。 平湖千楼颜如玉, 梨花海棠泪如滴。 人间又一春。 暖风熏人醉, 夏至短裙来, 为把石榴...
    马长安阅读 177评论 0 1
  • 一眨眼,最早的九零后已经迈入三十岁。 97、98年的也开始出来工作了。 九零后已经成为社会的主力。相同之处是……上...
    重庆一早一报阅读 163评论 0 0