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. 定时运行某个php文件的bat文件

    1.bat C:\phpStudy\php54n\php.exe -q D:\WWW\wdysp.zhuwangkj.com\wap\user_ABCD_grade.php pwd=6666sqwdw ...

  2. 深入浅出 Java Concurrency (12): 锁机制 part 7 信号量(Semaphore)[转]

    Semaphore 是一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放 ...

  3. gitlab merge request

    分支提了mr之后, 又有commit 不用重新提mr,mr中会自动更新 要保证项目下的.git目录中有hooks这个目录(如果是从github迁移到gitlab的项目, 可能没有这个目录, 导致mr不 ...

  4. jeecms 前台拦截器的研究与改造

    jeecms 前台拦截器的研究与改造 2013年12月24日 15:23:35 xinfei0803 阅读数 3511   jeecms出发点是面向大众的,具有前台开发性,也就是说,即时是未登录(游客 ...

  5. compareTo)--list 根据某字段排序

    Collections.sort(actList, new Comparator<Act>() { @Override public int compare(Act o1, Act o2) ...

  6. IO流 复制文件及文件夹

    package io; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; im ...

  7. 解决import javafx.geometry.Point2D无法导入的问题

    windows->preferences->java->compiler->errors/warning->deprecated and restricted API-& ...

  8. 入门servlet:request获取请求体数据

    @WebServlet("/RequestDemo5") public class RequestDemo5 extends HttpServlet { protected voi ...

  9. Web三大组件之控制器组件Servlet(转载)

    Servlet:主要用于处理客户端传来的请求,并返回响应.获取请求数据>处理请求>完成响应 过程:客户端发送请求----HTTP服务器接收请求,HTTP服务器只负责解析静态HTML界面,其 ...

  10. leetcode 839 Similar String Groups

    题目 Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that ...