http://www.cocoachina.com/ios/20151023/13860.html

2015-10-6更新:适配 Swift2.0

如有需要,可以通过pjin.elvin@gmail.com发私信或联系我。

注:使用GIF动态图片只是一种可行的方式达到该效果,并非唯一解决方案。我个人更倾向于通过视频播放器的方式来实现视频背景效果,然而通过GIF图片仍然是一个可行的选项。实施步骤直接跳转到下面的"工作前准备"。

如果你使用过iOS版本的Spotify ,你会注意到在这款应用的新版本中,他们使用了一个播放的视频作为app启动的背景。相对于静态的图片背景来说,这是一个相当酷的设计。如果你还没有见过这类设计,可以瞄一下我做的最终结果:

仅仅为了让你觉得有趣,我在从柏林到格拉茨的火车上拍下了这个轨道的慢移视频

于是我开始着手重新创建一个编程的实践,来达到相同的效果。那么问题来了:怎样实现?我首先想到的是,创建一个视频播放器并且让这个视频文件在背景视图上重复播放。但是我还要放其他控件到视图上面,而且我也不需要视频的声音。

然后我想到了GIF文件。现在的问题是:要怎么样把一个GIF放到一个视图上去?据我所知,UIImageView和UIImage都不支持GIF动画。尽管UIImageView可以通过添加多张图片和动画结合的方式来实现,我们真的需要从视频中截取大量的图片并把所有的这些图片全都添加到工程中吗?这样制作视频的工作准备未免太复杂了。那还有什么支持GIF呢?答案是UIWebView。

工作前准备:处理视频

准备一个你想作为背景播放的视频。有无数的软件和网页应用可以用来把视频转换为GIF图片,如果你想得到最佳效果,需要把它们裁剪为iPhone的屏幕大小

有一个非常好的指南来教你怎样制作,更多的资源你也可以从Google获取。这里我用的是一个叫做 GIF Brewery的软件。这个软件也有一篇非常详细的指南页,非常简单易上手。

把GIF添加到工程中

跟添加其他文件一样,直接把GIF文件拖到你工程的导航目录中。

开始编写代码

我会使用Objective-C和Swift来展示如何达到目的。所有的代码都写在默认加载的viewController中的viewDidLoad 里。

1.创建一个GIF的文件路径,用来读取你添加的GIF文件。

Objective-C:

1
2
3
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"railway" ofType:@"gif"];
 
NSData *gif = [NSData dataWithContentsOfFile:filePath];

Swift:

1
2
3
let filePath = NSBundle.mainBundle().pathForResource("railway", ofType: "gif")
 
let gif = NSData(contentsOfFile: filePath!)

2. 创建一个UIWebView并且把GIF转换成的NSData形式作为它的数据源。由于需要把它作为背景,因此frame尺寸应该根据iPhone的屏幕尺寸设定。同时,UIWebView类似于scrollview,你需要设置它的userInteractionEnabled 属性设为NO。然后把UIWebView添加到主视图上去。

Objective-C:

1
2
3
4
5
6
7
UIWebView *webViewBG = [[UIWebView alloc] initWithFrame:self.view.frame];
 
[webViewBG loadData:gif MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
 
webViewBG.userInteractionEnabled = NO;
 
[self.view addSubview:webViewBG];

Swift:

1
2
3
4
5
6
7
let webViewBG = UIWebView(frame: self.view.frame)
 
webViewBG.loadData(gif!, MIMEType: "image/gif", textEncodingName: String(), baseURL: NSUrl())
 
webViewBG.userInteractionEnabled = false;
 
self.view.addSubview(webViewBG)

3.可选:我还需要添加其他按钮到背景上,因此我使用了另一个黑色的过滤视图,alpha值设为0.05,覆盖到UIWebView上。这样可以淡出背景视图,同时让按钮和按钮的标题更突出。

Objective-C:

1
2
3
4
5
6
7
UIView *filter = [[UIView alloc] initWithFrame:self.view.frame];
 
filter.backgroundColor = [UIColor blackColor];
 
filter.alpha = 0.05;
 
[self.view addSubview:filter];

Swift:

1
2
3
4
5
6
7
8
9
Let filter = UIView()
 
filter.frame = self.view.frame
 
filter.backgroundColor = UIColor.blackColor()
 
filter.alpha = 0.05
 
self.view.addSubview(filter)

4.添加其他你需要添加的,完成!

总结:

完整工程可以从我的GitHub下载和使用。示例中使用的GIF文件也在里面。以上可能并非最好的解决方式,欢迎共同探讨。

这是我博客的第一篇文章,很高兴能够开始写博客了。我会继续分享一些日常中创新性和值得分享的设计和编程技巧。欢迎在Medium 和 Twitter上关注我。

利用UIWebView打造一个炫酷的视频背景视图(OC & Swift)的更多相关文章

  1. 2019基于Hexo快速搭建个人博客,打造一个炫酷博客(1)-奥怪的小栈

    本文转载于:奥怪的小栈 这篇文章告诉你如何在2019快速上手搭建一个像我一样的博客:基于HEXO+Github搭建.并完成SEO优化,打造一个炫酷博客. 本站基于HEXO+Github搭建.所以你需要 ...

  2. 教你用canvas打造一个炫酷的碎片切图效果

    前言 今天分享一个炫酷的碎片式切图效果,这个其实在自己的之前的博客上有实现过,本人觉得这个效果还是挺炫酷的,这次还是用我们的canvas来实现,代码量不多,但有些地方还是需要花点时间去理解的,需要点数 ...

  3. 如何利用GitHub设计一个炫酷的个人网站(含代码)

    1.在开始制作之前我们先预览一下我的网站吧! 1.方式一: 由于是手机版的所以用手机访问下面的链接体验比较好一点: https://tom-shushu.github.io/MyWeb.github. ...

  4. 2019Hexo博客Next主题深度美化 打造一个炫酷博客(2)-奥怪的小栈

    219/8/1 更新 本文转载于:奥怪的小栈 这篇文章告诉你在搭建好博客后,面对网上千篇一律的美化教程怎么才能添加自己独特点,使人眼前一亮. 本站基于HEXO+Github搭建. 所以你需要准备好HE ...

  5. canvas的进阶 - 学习利用canvas做一个炫酷的倒计时功能

    先给大家贴一张图片,因为我不会上传视频( ̄□ ̄||) ,请大家谅解了~  如果有知道怎么上传视频的大神还请指点指点 ^_^ ~ 然后看一下代码: html部分 :  <!DOCTYPE html ...

  6. 百度前端技术学院2018笔记 之 利用 CSS animation 制作一个炫酷的 Slider

    前言 题目地址 利用 CSS animation 制作一个炫酷的 Slider 思路整理 首先页面包含三种东西 一个是type为radio的input其实就是单选框 二是每个单选框对应的label 三 ...

  7. 一个炫酷的Actionbar效果

    今天在网上看到一个炫酷的Actionbar效果,一个老外做的DEMO,目前很多流行的app已经加入了这个效果. 当用户初始进入该界面的时候,为一个透明的 ActiionBar ,这样利用充分的空间显示 ...

  8. 使用CoordinatorLayout打造各种炫酷的效果

    使用CoordinatorLayout打造各种炫酷的效果 自定义Behavior -- 仿知乎,FloatActionButton隐藏与展示 NestedScrolling 机制深入解析 一步步带你读 ...

  9. 一个炫酷的flash网站模板

    这是一个炫酷的flash欧美网站模板,它包括首页,公司简介,留言等五个页面,界面转换非常的炫酷!他还有时间.全屏.背景音乐开关的功能!有兴趣的朋友可以看看!贴几张网站图片给大家看看! 下载后直接找到s ...

随机推荐

  1. Linux 命令之head, tail, tr, sort, uniq, grep

    head [filename] head -n 11 [filename] -> First 11 lines head -c 20 [filename] -> First 20 char ...

  2. 前端存取cookie

    1.存cookie document.cookie="user_phone="+loginMake1Value;//存手机号码cookie//'user_phone'为cookie ...

  3. qml获取实际渲染的字体

    当设置qml的Text元素的字体时,如果系统中不存在设置的字体,qml会根据匹配算法自动选取系统中存在的一种字体.比如:设置font.family: "微软雅黑",但系统中根本没有 ...

  4. 1.开始Springboot 基本配置和helloworld

    1 pom.xml 首先引入两个xml节点 <!--这里面继承了springboot很多相关依赖--> <parent> <groupId>org.springfr ...

  5. python 中文乱码问

    在本文中,以'哈'来解释作示例解释所有的问题,“哈”的各种编码如下: 1. UNICODE (UTF8-16),C854: 2. UTF-8,E59388: 3. GBK,B9FE. 一.python ...

  6. PHP苹果推送实现(APNS)

    以下资料网上收集整理得来 1.在ios dev center制作相关证书和文件用客户端实现(不再赘述,网上很多,) 网上教程: http://blog.csdn.net/lizhenning87/ar ...

  7. golang中函数类型

    今天看Martini文档,其功能列表提到完全兼容http.HandlerFunc接口,就去查阅了Go: net/http的文档,看到type HandlerFunc这部分,顿时蒙圈了.由于之前学习的时 ...

  8. 关于node中 require 和 ES6中export 、export default的总结

    nodejs中 require 方法的加载规则 方法的加载规则 1. 优先从缓存中加载 2. 核心模块 3. 路径形式的模块 4. 第三方模块 一.优先从缓存中加载 main.js:执行加载a.js模 ...

  9. php静态变量问题

    <?php$a=0; function test(){ static $a=0; $a+=1; echo $a; }test(); test(); ?>1.static是与销毁时间有关,与 ...

  10. 在VUE中实现打印

    1.安装 npm install vue-print-nb --save 2.在mian.js中引入 import Print from 'vue-print-nb' Vue.use(Print); ...