iOS开发-启动页广告实现

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.mzph.cn/news/15025.shtml

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

相关文章

Pytorch(二)

一、分类任务 构建分类网络模型 必须继承nn.Module且在其构造函数中需调用nn.Module的构造函数无需写反向传播函数&#xff0c;nn.Module能够利用autograd自动实现反向传播Module中的可学习参数可以通过named_parameters()返回迭代器 from torch import nn import torch.nn.f…

C++部署学习

gcc -E src/main.c -o src/main.i gcc -S src/main.c -o src/main.s gcc -C src/main.c -o src/main.o gcc src/main.c -o exec ./exec

RabbitMQ 教程 | 第3章 客户端开发向导

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

排序算法汇总

每日一句&#xff1a;你的日积月累终会成为别人的望尘莫及 目录 常数时间的操作 选择排列 冒泡排列 【异或运算】 面试题&#xff1a; 1&#xff09;在一个整形数组中&#xff0c;已知只有一种数出现了奇数次&#xff0c;其他的所有数都出现了偶数次&#xff0c;怎么找到…

面试之CurrentHashMap的底层原理

首先回答HashMap的底层原理? HashMap是数组链表组成。数字组是HashMap的主体&#xff0c;链表则是主要为了解决哈希冲突而存在的。要将key 存储到&#xff08;put&#xff09;HashMap中&#xff0c;key类型实现必须计算hashcode方法&#xff0c;默认这个方法是对象的地址。接…

【应用层】Http协议总结

文章目录 一、续->Http协议的学习 1.http请求中的get方法和post方法 2.http的状态码 3.http的报头 4.长链接 5.cookie&#xff08;会话保持&#xff09;总结 继续上一篇的内容&#xff1a; 上一篇的最后我们讲到了web根目录&#xff0c;知道…

使用Docker部署EMQX

原文链接&#xff1a;http://www.ibearzmblog.com/#/technology/info?id9dd5bf4159d07f6a4e69a6b379ce4244 前言 在物联网中&#xff0c;大多通信协议使用的都是MQTT&#xff0c;而EMQX是基于 Erlang/OTP 平台开发的 MQTT 消息服务器&#xff0c;它的优点很多&#xff0c;我…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(12)-Fiddler设置IOS手机抓包,你知多少???

1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求&#xff0c;也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求&#xff0c;比如 iPhone、iPad 和 MacBook 等苹…

【BMC】OpenBMC使用基础(WSL2版本)

代码准备 OpenBMC是一个开源的项目&#xff0c;用于开发BMC固件。官网是https://www.openbmc.org/&#xff0c;不过里面似乎没有什么内容&#xff0c;所以还需要依赖其它的网站&#xff0c;https://github.com/openbmc&#xff0c;在这里可以下载到需要的代码和文档。其主体部…

C#,数值计算——对数正态分布(logarithmic normal distribution)的计算方法与源程序

对数正态分布&#xff08;logarithmic normal distribution&#xff09;是指一个随机变量的对数服从正态分布&#xff0c;则该随机变量服从对数正态分布。对数正态分布从短期来看&#xff0c;与正态分布非常接近。但长期来看&#xff0c;对数正态分布向上分布的数值更多一些。 …

Tailwind CSS:基础使用/vue3+ts+Tailwind

一、理解Tailwind 安装 - TailwindCSS中文文档 | TailwindCSS中文网 Installation - Tailwind CSS 1.1、词义 我们简单理解就是搭上CSS的顺风车&#xff0c;事半功倍。 1.2、Tailwind CSS有以下优势 1. 快速开发&#xff1a;Tailwind CSS 提供了一些现成的 class / 可复用…

ARM裸机-4

1、什么是交叉编译 1.1、两种开发模式 非嵌入式开发&#xff0c;A&#xff08;类&#xff09;机编写&#xff08;源代码&#xff09;、编译得到可执行程序&#xff0c;发布给A&#xff08;类&#xff09;机运行。 嵌入式开发&#xff0c;A&#xff08;类&#xff09;机编写&am…

Spring源码(三)Spring Bean生命周期

Bean的生命周期就是指&#xff1a;在Spring中&#xff0c;一个Bean是如何生成的&#xff0c;如何销毁的 Bean生命周期流程图 1、生成BeanDefinition Spring启动的时候会进行扫描&#xff0c;会先调用org.springframework.context.annotation.ClassPathScanningCandidateCompo…

Qt C++实现Excel表格的公式计算

用Qt的QTableViewQStandardItemModelQStyledItemDelegate实现类似Excel表格的界面&#xff0c;在parser 模块中提供解析表格单元格输入的公式。单元格编辑结束后按回车进行计算和更新显示。 效果如下&#xff1a; 支持的公式计算可以深度嵌套&#xff0c;目前parser模块中仅提…

【Java】零基础上手SpringBoot学习日记(day1)

前言 此帖为本人学习Springboot时的笔记&#xff0c;由于是个接触计算机一年左右的新手&#xff0c;也没有网站开发经验&#xff0c;所以有些地方的理解会比较浅显并且可能会出现错误&#xff0c;望大佬们多多包涵和指正。 Web应用开发 在我的理解中&#xff0c;Web应用的开发…

测试|测试分类

测试|测试分类 文章目录 测试|测试分类1.按照测试对象分类&#xff08;部分掌握&#xff09;2.是否查看代码&#xff1a;黑盒、白盒灰盒测试3.按开发阶段分&#xff1a;单元、集成、系统及验收测试4.按实施组织分&#xff1a;α、β、第三方测试5.按是否运行代码&#xff1a;静…

Mysql sql优化

目录 目的 目标 explain 优化 避免使用select * 用union all代替union 小表驱动大表&#xff08;in与exists&#xff09; 批量操作 多使用limit in中值太多 不使用%前缀模糊查询 不在where子句中进行表达式操作 避免隐式类型转换 联合索引遵守最左前缀法则 inne…

【Spring Boot 源码学习】走近 AutoConfigurationImportSelector

AutoConfigurationImportSelector 源码解析 引言主要内容1. ImportSelector 接口2. DeferredImportSelector 接口3. AutoConfigurationImportSelector 功能概述 总结 引言 上篇博文我们了解了 EnableAutoConfiguration 注解&#xff0c;其中真正实现自动配置功能的核心实现者 …

细讲TCP三次握手四次挥手(二)

TCP/IP 协议族 应用层 应用层( application-layer &#xff09;的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程&#xff08;进程&#xff1a;主机中正在运行的程序&#xff09;间的通信和交互的规则。 对于不同的网络应用需要不同的应用层协议…