iOS-视频播放器的简单封装 封装视频播放器,首先需要了解视频播放器的实现,iOS9之前可以使用MediaPlayer来进行视频的播放,iOS9之后系统推荐使用AVFoundation框架实现视频的播放...如果仅仅是播放视频两者的使用都非常简单,但是相比MediaPlayer,AVPlayer对于视频播放的可控制性更强一些,可以通过自定义的一些控件来实现视频的播放暂停等等。...因此这里使用AVPlayer的视频播放。 封装视频播放器,首先需要实现视频播放器,然后再去考虑怎样封装可以让以后自己使用起来方便快捷。...CLAVPlayerView的结构 CLAVPlayerView的布局很简单,重点在于约束的添加和控件层次关系,添加约束只要自己挨个细心添加就没有问题,需要注意控件的层次关系,从上图中可以看出四个控件是分先后顺序平行添加在...简单封装 此时已经实现了播放器基本的功能,接下来考虑如何封装能使我们使用起来更加方便,其实我们已经将大部分封装完成,接下来需要做的就是提供简单易用的接口,使外部可以轻松调用实现播放器。
FFmpeg_allluckly.cn.png Mac编译ffmpeg获取FFmpeg-iOS ffmpeg的H.264解码 由上俩篇文章,我们已经对ffmpeg有了一定的了解和应用了,接下来让我们一起学习怎么利用...在推流之前我们需搭建一个本地的nginx推流服务器用来测试。 主要参考的这篇文章 iOS直播app(推流篇)在这里不做过多的阐述,有兴趣的朋友可以跟着做一做。...得到的推流服务器地址如下 rtmp://localhost:1991/liveApp/room 如果先前已经做过Mac编译ffmpeg获取FFmpeg-iOS这一步的话,不需要再继续下载ffmpeg。...下面进入我们的代码阶段即可。...\n"); return; } return; } 运行app的时候用VLC播放器打开我们的推流地址即可看到推流效果。
/* *参数说明: *opts: {'可选参数'} **method: 请求方式:GET/POST,默认值:'GET'; **url: 发送请求的地址, 默认值: 当前页地址...false,默认值:true; **contentType: HTTP头信息,默认值:'application/x-www-form-urlencoded'; **success: 请求成功后的回调函数...; **error: 请求失败后的回调函数; */ function ajax(opts){ //一、设置默认参数 defaults = { url...=23', cache: false, success: function (data){ alert('返回数据是:' + data); } }); 关于ajax缓存 只要是URL相同的GET...请求,浏览器会使用缓存(当然还要看服务器的Cache-Control/Expires/Last-Modified/ETag头的设置)。
/* *参数说明: *opts: {'可选参数'} **method: 请求方式:GET/POST,默认值:'GET'; **url: 发送请求的地址, 默认值: 当前页地址...false,默认值:true; **contentType: HTTP头信息,默认值:'application/x-www-form-urlencoded'; **success: 请求成功后的回调函数...; **error: 请求失败后的回调函数; */ function ajax(opts){ //一、设置默认参数 defaults = { url..., cache: false, success: function (data){ alert('返回数据是:' + data); } }); 关于ajax缓存 只要是URL相同的GET...请求,浏览器会使用缓存(当然还要看服务器的Cache-Control/Expires/Last-Modified/ETag头的设置)。
[瀑布流.gif] 功能描述:WSLWaterFlowLayout 是在继承于UICollectionViewLayout的基础上封装的带头脚视图的瀑布流控件。...前言 :近几个月一直在忙公司的ChinaDaily和国务院项目,没有抽出时间来写简书,现在终于算是告一段落了,抽出时间来更一篇 实现:主要是重写父类的几个涉及布局属性的方法,在对应的布局属性方法中根据需求自定义视图布局属性信息...详情看示例 /** 初始化 生成每个视图的布局信息*/ -(void)prepareLayout; /** 决定一段区域所有cell和头尾视图的布局属性*/ -(NSArray<UICollectionViewLayoutAttributes...下面是WSLWaterFlowLayout.h中的属性方法和代理方法,含义注释的还算清晰: typedef enum { WSLVerticalWaterFlow = 0, /** 竖向瀑布流...、头脚视图的大小、行列数以及间距都可以在对应样式的代理方法中自定义,然后设置为UICollectionView的自动流水布局样式,并结合UICollectionView的用法使用,详情看示例 WSLWaterFlowLayout
一: 封装的好处 1.1 可以降低网络请求方法与Controller(控制器)的耦合度,即使网络使用的第三方框架发生不兼容、错误等问题从而想换框架时,也不用到每个控制器里面改代码(50、60页面会改到想哭...1.2 建立独立的工具类,方便管理。 1.3 优化代码结构。...三:创建封装类 创建FBYHomeService类继承NSObject .h代码 // // FBYHomeService.h // agreePay // // Created by fbyon...//调出请求头 manager.requestSerializer = [AFJSONRequestSerializer serializer]; //将token封装入请求头...Nullable task, NSError * _Nonnull error) { failure(404); }]; } }@end 四:封装类的使用
//封装一个ajax函数 // 参数约定: // url 必须 // method 可选, 默认是 get // data 可选, 可以是字符串, 也可以是对象( 键值对...) // fn 处理响应回来的数据, 函数需要有参数, 即响应回来的数据 function ajax( options ){ //定义参数 var url=options.url...data=options.data || null, fn=options.fn || null //首先转换data参数 var tmp=[]; //如果传入的是字符串...,不需要处理,如果传入的是一个键值对,转换成字符串 if(data !
瀑布流.gif 功能描述:WSLWaterFlowLayout 是在继承于UICollectionViewLayout的基础上封装的带头脚视图的瀑布流控件。...前言 :近几个月一直在忙公司的ChinaDaily和国务院项目,没有抽出时间来写简书,现在终于算是告一段落了,抽出时间来更一篇 实现:主要是重写父类的几个涉及布局属性的方法,在对应的布局属性方法中根据需求自定义视图布局属性信息...详情看示例 /** 初始化 生成每个视图的布局信息*/ -(void)prepareLayout; /** 决定一段区域所有cell和头尾视图的布局属性*/ -(NSArray<UICollectionViewLayoutAttributes...下面是WSLWaterFlowLayout.h中的属性方法和代理方法,含义注释的还算清晰: typedef enum { WSLVerticalWaterFlow = 0, /** 竖向瀑布流...、头脚视图的大小、行列数以及间距都可以在对应样式的代理方法中自定义,然后设置为UICollectionView的自动流水布局样式,并结合UICollectionView的用法使用,详情看示例 WSLWaterFlowLayout
基本所有APP都少不了,开始写APP,可能首先就是从登录开始 我也一样,我手上有一个封装了所有账户体系相关接口的SDK,运行良好但也遇到一些烦心事,就拿登录来说说吧。...首先有如下相关封装,很常见,也无需太多解释: import Foundation public typealias Response = (_ json: String?...这个时候我又开始怀念第一版的接口了,其实这很容易解决,只要一个整型枚举,然后把多出来的参数设置为可选,虽然使用的时候会有点奇怪,但是很好的解决了问题。...私有类型转换的方法的封装,使得所有其他方法可以快速转换,关于@available(swift 10.0) 意思就是说只有Swift 版本10.0只后才可以使用。。...当然,如果你只是在自己的混编APP内部封装一些接口,那一套接口应该是比较好的,如果你的是SDK,同时你也不是很怕麻烦,像我这样写也许会有一些意外的收获。
这个问题相信做iOS的都知道答案。 在我们的日常开发中,经常会用到各种已经封装好的库,比如支付宝、微信SDK等等中的库,这些库可以给我们的开发带来很大的便利。...有的时候,由于工作的需要,我们需要对自己的项目进行封装,生成库,方便别人的使用。在这里就边参考好点的博客,边总结一下我们经常看到的.framework。 那什么是“库”呢? ...“库”是共享程序代码的一种方式!同行总结的这句话很简单也很好的说明了它的作用! 一般的分为“静态库”和“动态库”。 “静态库”和“动态库”有什么区别?...我们再里面简单的添加了一个ShowNSlog的类,并且我们添加了一个 FrameWorkTest.boundle文件,看看我们在这个类里面写了什么内容: #import "ShowNSLog.h" @...{ return @"zhouzhou.jpg"; } @end 接下来对我们的这个.framework静态库进行一些简单的设置,如下图所示:
判断浏览器是否支持localStorge 判断浏览器是否为无痕模式 简单的json 编码 //存储localStorge function setLocalStorage(key,obj){ if
背景 最近遇到了一个需要使用独占锁来保证业务正确性的场景,鉴于服务本身也会使用到 redis 缓存,可以直接利用 redis 提供的锁支持。...使用上下文管理器 手动获取并释放锁的使用方法比较繁琐,并且忘记调用acquire方法或因为业务逻辑异常导致acquire方法没有成功调用的风险。...封装 我们可以使用functools.partial函数,对 redis 的 lock 使用进行一些简单的封装。...(由prefix和key组合而来)、超时时间、等待时间和使用的 redis 实例。...在具体的业务场景中,可以使用functools.partial函数定义更个性化的锁。 在这个示例中,我们定义了一个a_lock函数,指定了锁的名称前缀为A,超时时间为 60 秒。
在开发过程中,自定义控件使用的频率非常高,接下来简单对自定义控件做个小结 View的封装 如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部的子控件创建封装起来,不让外界看见 外界可以传入对应的数据模型给...view,view拿到模型数据后给内部子控件设置对应的数据 代码封装 新建一个继承UIView的类 在initWithFrame:方法中添加子控件(也可以使用懒加载) 重写模型属性set方法,在set方法中设置模型属性到子控件上...view.imageData = imageData; view.frame = CGRectMake(shopX, shopY, imageW, imageH); [bgView addSubview:view]; xib封装...[NSString stringWithFormat:@"%@",imageData.icon]]; self.label.text = imageData.name; } @end 两种方法封装...而用xib相对于比较死板,但是更简单,更方便 自定义UIView时,如果该View一直一个样式,推荐使用xib,简单方便 而子控件经常随着父控件变化而变化,推荐使用纯代码,灵活多变
最近终于比较有空了,可以写点自己的东西了,看到弹幕好好玩就跟着写了一个简单的弹幕效果,可自动追加评论,可暂停,可循环,可随机出现,效果如下,是不是瞬间觉得有弹幕的评论高大上了?...最终效果图 其中 BullerView就是弹幕的视图,继承UIView,每一条弹幕都是一个BullerView,这里默认实现的是3个弹道(可以自己修改)。 如何让弹幕动起来呢?...利用动画options的UIViewAnimationOptionCurveLinear枚举,该枚举表示时间曲线函数,匀速 __block CGRect frame = self.frame; [UIView...,这是根据 v = s/t,时间相同的情况下,距离越长,速度越快。...BulletManager是管理弹幕的数据源,开始啊,结束啊 Demo地址:https://github.com/huicongfu/BarrageDemo
像工作中使用的第三方SDK基本上都是闭源的,因为公司不能把自己的机密泄露出去。所以当需要给别人提供SDK但不让他们知道代码的实现时就需要封装成静态库。...步骤 创建工程,最好是起名为 xxxDemo 例如 AXKitDemo,然后新建一个 target 名为 AXKit,并把原来的工程改名为 AXKit。...在 framework 中创建需要封装的类,写好代码。 在 Build Setting 里更改参数,Math-O Type 为 Static Library。...在 Build Phases -> Headers 里将需要暴露出来的头文件从 Project 移动到 Public。 添加一个 Aggregate 的 target,并添加运行脚本。...目的是把编译出来的真机版和模拟器版的 framework 合并。 模拟器编译一下,真机编译一下,然后 Aggregate 编译一下,然后在项目的 Products 文件夹里就有了最终生成的静态库。
iOS中导入外部文件,一种是将源码导入,一种是导入静态库,有很多第三方库都是以静态库的形式提供给我们使用的,如何制作一个静态库呢?...MyStaticLibrary.h" @implementation MyStaticLibrary -(void)myLog{ NSLog(@"myLog"); } @end 二、生成静态库文件: 这里需要将设备选成IOS...我们需要在Peoject->Code Signing ->Code Signing Identity 改成IOS Developer ? 再次编译,成功。...然后你会看到,Products中的.a文件由红色编程了黑色。我们右键show in finder,就可以看到编译成功的静态库文件了。...这时,我们的静态库文件就做好了。 三、静态库文件的使用: 将.a和.h文件导入工程,在需要的文件中导入头文件,即可使用。 专注技术,热爱生活,交流技术,也做朋友。
导入 MediaPlayer.framework - (void)viewDidLoad { [super viewDidLoad]; NSStrin...
本文重点介绍在Vue项目中简单封装Axios Vue推荐我们使用Axios,vue-resource在Vue2.0后就不再更新,本文对Axios的用法不做过多的介绍,只是在项目上简单封装及使用,如果有需要了解的...axios 2 引用 因为axios不是Vue的插件,所以不能使用use方式 import axios from 'axios' 3 封装的原因 其实axios用法很简单,请求方式也是支持的很全面...,为什么我们要再次封装呢,通常我们的项目会有很多页面,同时也会有很多接口,请求方式也是会有很多种,如果不统一封装,后期修改会很繁琐,也不容易维护和迭代。...4 分析 既然要封装,那我们肯定要考虑的比较全面,把项目中用到的可能性都要考虑进来,所以我们从以下几方面考虑: 请求是否需要设置请求头(一般可能需要设置token) 请求方式(get、post、delete...liRequest('get', '/user/page','params',query) post请求,需要参数及token liRequest('post', '/user/page', query) 简单的罗列几种写法
领取专属 10元无门槛券
手把手带您无忧上云