iOS开发-启动页广告实现

news2025/1/21 22:10:40

iOS开发-启动页广告实现

启动页广告实现是一个非常常见的广告展示模式。 就是在启动时候显示广告,之后点击跳转到广告页面或者其他APP。

在这里插入图片描述

一、实现启动页广告

启动页广告控件实现,将View放置在keyWindow上,显示广告图片,点击广告图片进行跳转。
如果没有操作,倒计时5s后进行App

具体代码如下

SDFullScreenADView.h

#import <UIKit/UIKit.h>

#define kFullScreenAdTag  9012

//跳转按钮样式
typedef NS_ENUM(NSUInteger, SDSkipButtonType) {
    SDSkipButtonTypeText = 0,
};

typedef void(^SDFullScreenADBlock)();

@interface SDFullScreenADView : UIView

/**
 广告图的显示时间(默认5秒)
 */
@property (nonatomic, assign) NSUInteger duration;

/**
 右上角按钮的样式(默认倒计时+跳过)
 */
@property (nonatomic, assign) SDSkipButtonType skipType;

/**
 广告图
 */
@property (nonatomic, strong) UIImage *adImage;

/**
 广告数据,跳转数据
 */
@property (nonatomic, strong) id data;


@property (nonatomic, copy) SDFullScreenADBlock block;

/**
 显示广告
 */
- (void)show;


/**
 默认广告
 
 @return id
 */
+ (SDFullScreenADView *)defaultFullScreenADView;

@end

SDFullScreenADView.m

#import "SDFullScreenADView.h"

#define kMainScreenWidth [UIScreen mainScreen].bounds.size.width

@interface SDFullScreenADView ()

@property (nonatomic, strong) UIImageView *adImageView;   //广告界面
@property (nonatomic, strong) UIButton *skipButton;       //跳过按钮
@property (nonatomic, strong) UILabel *timeLabel;         //倒计时控件

@property (nonatomic, strong) NSTimer *displayTimer;         //剩余时间倒计时

@end

@implementation SDFullScreenADView

- (instancetype)init {
    self = [super init];
    if (self) {
        [self configDefaultParameter];
        [self setupSubView];
        
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(adTapAction)];
        [self addGestureRecognizer:tap];
        
        UIWindow *window = [UIApplication sharedApplication].keyWindow;
        if (!window) {
            return nil;
        }
        [window addSubview:self];
    }
    return self;
}

#pragma mark - Private Method -
/**
 配置默认参数
 */
- (void)configDefaultParameter {
    self.duration = 5;
    self.skipType = SDSkipButtonTypeText;
    self.frame = [[UIScreen mainScreen] bounds];
}

/**
 设置控件
 */
- (void)setupSubView {
    [self addSubview:self.adImageView];
    self.adImageView.frame = self.bounds;
    
    [self addSubview:self.skipButton];
    self.skipButton.frame = CGRectMake(kMainScreenWidth - 80, 30, 70, 30);
    
    [self addSubview:self.timeLabel];
    self.timeLabel.frame = self.skipButton.frame;
}

- (void)setDuration:(NSUInteger)duration {
    _duration = duration;
}

- (void)setAdImage:(UIImage *)adImage {
    _adImage = adImage;
}

- (void)adTapAction {
    [self.displayTimer invalidate];
    self.displayTimer = nil;
    [self dismiss];
    
    if (self.block) {
        self.block();
    }
}

- (void)skipButtonAction {
    [self dismiss];
}

- (void)displayTimerAciton {
    self.duration--;
    if (self.duration == 0) {
        [self dismiss];
        return;
    }
    
    if (self.duration > 0) {
        _timeLabel.text = [NSString stringWithFormat:@"%lus跳过广告",(unsigned long)self.duration];
    }
}

/**
 显示广告
 */
- (void)show {
    if (!self.adImage) {
        [self removeFromSuperview];
        return;
    }
    
    [self addDisplayTimer];
    
    self.adImageView.image = self.adImage;
    
    self.alpha = 0.0;
    [UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.alpha = 1.0;
    } completion:^(BOOL finished) {
    }];
}

/**
 消失广告图
 */
- (void)dismiss {
    [UIView animateWithDuration:0.5 delay:0.3 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.transform = CGAffineTransformMakeScale(1.2, 1.2);
        self.alpha = 0.0;
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
    }];
}

#pragma mark - SETTER/GETTER
- (UIButton *)skipButton {
    if (!_skipButton) {
        _skipButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _skipButton.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.4];
        _skipButton.layer.cornerRadius = 4;
        _skipButton.layer.masksToBounds = YES;
        _skipButton.titleLabel.font = [INSysFont inSysFontOfSize:14];
        [_skipButton addTarget:self action:@selector(skipButtonAction) forControlEvents:UIControlEventTouchUpInside];
    }
    return _skipButton;
}

- (UIImageView *)adImageView {
    if (!_adImageView) {
        _adImageView = [[UIImageView alloc] initWithFrame:self.bounds];
        _adImageView.backgroundColor = [UIColor clearColor];
        _adImageView.clipsToBounds = YES;
        _adImageView.contentMode = UIViewContentModeScaleAspectFill;
    }
    return _adImageView;
}

- (UILabel *)timeLabel {
    if (!_timeLabel) {
        _timeLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        _timeLabel.backgroundColor = [UIColor clearColor];
        _timeLabel.textAlignment = NSTextAlignmentCenter;
        _timeLabel.font = [UIFont fontWithName:@"Heiti SC" size:12];
        _timeLabel.textColor = [UIColor whiteColor];
        _timeLabel.text = @"跳过广告";
    }
    return _timeLabel;
}

- (void)addDisplayTimer {
    if (self.displayTimer) {
        [self.displayTimer invalidate];
        self.displayTimer = nil;
    }
    self.displayTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(displayTimerAciton) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:self.displayTimer forMode:NSRunLoopCommonModes];
}

#pragma mark - DEALLOC
- (void)dealloc {
    [self.displayTimer invalidate];
    self.displayTimer = nil;
}

/**
 默认广告
 
 @return id
 */
+ (SDFullScreenADView *)defaultFullScreenADView {
    SDFullScreenADView *fullScreenAdView = [[SDFullScreenADView alloc] init];
    fullScreenAdView.duration = 3;
    fullScreenAdView.tag = kFullScreenAdTag;
    fullScreenAdView.alpha = 0.0;
    return fullScreenAdView;
}

@end

二、小结

iOS开发-启动页广告实现
启动页广告实现是一个非常常见的广告展示模式。 就是在启动时候显示广告,之后点击跳转到广告页面或者其他APP。

学习记录,每天不停进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

https://app.hackthebox.com/machines/Sau

https://app.hackthebox.com/machines/Sau https://app.hackthebox.com/machines/Sau1.info collecting └─$ nmap -A 10.10.11.224 -T4 Starting Nmap 7.93 ( https://nmap.org ) at 2023-07-30 15:36 HKT Nmap scan report for 10.10.11.224 (10.10.11.224) Host is up (…

Arrays(数组)工具类

java.util.Arrays 是一个与数组相关的工具类&#xff0c;里面提供了大量静态方法&#xff0c;用来实现数组常见的操作。 Arrays.toString ( 数组名 )将参数数组变成字符串&#xff08;按照默认格式&#xff1a;[10, 20, 30]&#xff09;Array.sort ( 数组名 ) 按照默认升序&…

C++ ------类和对象详解六大默认成员函数

文章目录 类的6个默认成员函数概念 构造函数概念特点 析构函数概念特征 拷贝构造函数概念特点 赋值运算符重载运算符重载的概念特性赋值运算符重载格式特性 取地址及const取地址操作符重载 类的6个默认成员函数 如果我们定义一个类&#xff0c;然后这个类中什么也没有。那么这里…

java之juc

juc是java.util.current的简写&#xff0c;意思是并发编程。 锁是什么&#xff1f;如何判断锁的是谁&#xff1f; 生产者和消费者问题 synchronized版本 package com.demo.juc.pc;/*** 线程之间的通信问题&#xff0c;生产者和消费者问题&#xff01;* 线程交替执行** a b …

聊聊这几年的科技风口

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 数数这几年的科技风口&#xff1a;AR&#xff08;包括什么MR、VR&#xff09;、区块链(包括后来的什么web3)、元宇宙到现在的AI&#xff0c;下面逐一谈谈…

AI创作ChatGPT源码系统搭建教程+附源码/支持GPT4.0/支持ai绘画/mj以图生图/Mind思维导图

本系统使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到本系统&#xff01; ● 支持微信环境静默登录&#xff08;可开启或关闭&#xff09;、浏览器微信主动扫码登录、邮箱注册登录 ● 无认证公众号后台可关闭微信登录功能 ● 支持GPT3模型、GPT4模型、GPT联网功能 ● M…

TMS WEB Core Crack,TMS软件Delphi组件RADical Web

TMS WEB Core Crack,TMS软件Delphi组件RADical Web 使用我们的现代web应用程序框架&#xff0c;可以节省宝贵的时间并创造丰富的用户体验。我们所有的工具都由经验丰富的开发人员组成的专门团队提供支持。您可以信赖卓越的服务、活跃的社区和我们不断的创新。TMS Software是您的…

Restful的详细介绍~

RESTFUL简介&#xff1a; Restful是我们看待服务器的一种方式&#xff0c;我们都知道Java一切皆对象&#xff0c;因此在Java中&#xff0c;我们可以将所有的内容都看成对象&#xff0c;而在这里&#xff0c;RESTFUL是我们看待服务器的一种方式&#xff0c;我们可将服务器中的所…

【计算机视觉|人脸建模】3D人脸重建基础知识(入门)

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 一、三维重建基础 三维重建&#xff08;3D Reconstruction&#xff09;是指根据单视图或者多视图的图像重建三维信息的过程。 1. 常见三维重建技术 人工几何模型仪器采集基于图像的建模描述基于几何建模…

MP的开发流程-1

MP的开发流程 1、添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.ap…

Java Design and development -- QQ chat

About ARTS - Complete one ARTS per week: ● Algorithm: Do at least one LeetCode algorithm per week Review: Read and comment on at least one technical article in English ● Tips: Learn at least one technical trick ● Share: Share a technical article with op…

#P0999. [NOIP2008普及组] 排座椅

题目描述 上课的时候总会有一些同学和前后左右的人交头接耳&#xff0c;这是令小学班主任十分头疼的一件事情。不过&#xff0c;班主任小雪发现了一些有趣的现象&#xff0c;当同学们的座次确定下来之后&#xff0c;只有有限的 DD 对同学上课时会交头接耳。 同学们在教室中坐…

不同情境下沟通有哪些可用的工具箱?

在不同情境下&#xff0c;沟通的工具箱可以包括以下几个方面&#xff1a; 面对面交流&#xff1a;面对面交流是最直接和有效的沟通方式。可以通过面对面的会议、面谈或小组讨论等方式进行沟通。面对面交流可以更好地传递情感和非语言信息&#xff0c;有助于建立信任和理解。 …

基于峰谷分时电价引导下的电动汽车充电负荷优化(matlab代码)

目录 1 主要内容 峰谷电价优化 电动汽车充电负荷变化 2 部分代码 3 程序结果 1 主要内容 该程序基本复现《基于峰谷分时电价引导下的电动汽车充电负荷优化》&#xff0c;代码主要做的是基于NSGA-II的电动汽车充电负荷优化&#xff0c;首先&#xff0c;在研究电动汽车用户充…

Spring声明式事务@Transactional的一些问题的测试及求证

1.Spring的声明式事务Transactional问题 前提&#xff1a;有两个方法&#xff0c;a方法对a表做修改操作&#xff0c;b方法对b表做修改操作 a方法调用b方法&#xff0c;然后a方法报错&#xff0c;伪代码如下 public void a() {//数据库修改操作CompensateLogDO compensateLogDO…

英文论文(sci)解读复现【NO.14】基于关注机制的葡萄叶片病害检测

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

【宝藏系列】STM32之C语言基础知识

【宝藏系列】STM32之C语言基础知识 文章目录 【宝藏系列】STM32之C语言基础知识1️⃣位操作2️⃣define宏定义3️⃣ifdef条件编译4️⃣extern变量声明5️⃣typedef类型别名 C语言是单片机开发中的必备基础知识&#xff0c;本文列举了部分 STM32 学习中比较常见的一些C语言基础知…

OAuth机制_web站点接入微软azure账号进行三方登录

文章目录 ⭐前言⭐微软三方登录流程&#x1f496; web站点获取微软账号流程&#x1f496; node封装微软登录接口&#x1f496; webapp 自定义code换token&#x1f496; 调用 Microsoft Graph API&#x1f496; 前端唤醒authlink进行登录回调逻辑 ⭐结束 ⭐前言 大家好&#xf…

React(1)——快速入门

一、React背景简介 官网和资料 英文官网: https://reactjs.org/中文官网: 快速入门 – React (docschina.org) 3、如果JS基础忘了及时查看文档&#xff1a;JavaScript - 学习 Web 开发 |多核 (mozilla.org) JavaScript - 标签 - 汤姆大叔 - 博客园 (cnblogs.com) 4、React…