类似于喜马拉雅的php源码,源码分享:高仿喜马拉雅FM
最新用空闲时间高仿了一下喜马拉雅FM这款APP,目前主要完成了发现栏目中的推荐页面。
效果演示
分析
+发现tab中有五个小分类,分别对应五个页面,所有在“发现”的控制器中使用了UIPageViewController来控制五个子控制器。
+从Charles抓出来的接口来看,“推荐”页面一共调用了三个接口,分别请求了推荐、热门、直播的内容,所以在这里选择了Reactivecocoa来实现接口的并发访问- (void)refreshDataSource {
@weakify(self);
RACSignal *signalRecommend = [RACSignal createSignal:^RACDisposable *(id subscriber) {
@strongify(self);
[self requestRecommendList:^{
[subscriber sendNext:nil];
}];
return nil;
}];
RACSignal *signalHotAndGuess = [RACSignal createSignal:^RACDisposable *(id subscriber) {
@strongify(self);
[self requestHotAndGuessList:^{
[subscriber sendNext:nil];
}];
return nil;
}];
RACSignal *signalLiving = [RACSignal createSignal:^RACDisposable *(id subscriber) {
@strongify(self);
[self requestLiving:^{
[subscriber sendNext:nil];
}];
return nil;
}];
[[RACSignal combineLatest:@[signalRecommend,signalHotAndGuess,signalLiving]] subscribeNext:^(id x) {
@strongify(self);
[(RACSubject *)self.updateContentSignal sendNext:nil];
}];
}
文章转自 耐心_朱迪的简书
+在“推荐”页面中有几个轮播图,仔细观察会发现它的轮播图一直想左转换,所以这里的轮播图片需要做一下特殊处理。以实现无限轮播的效果- (void)setModel:(XMLYFindFocusImagesModel *)model {
_model = model;
[self.adverScrollView removeAllSubViews];
self.adverScrollView.contentSize = CGSizeMake(kScreenWidth * _model.list.count, 150);
//1.向scrollView中增加UIImageView的时候,需要在最后一张图片后面将第一张图片添加上去
for(NSInteger index = 0; index <= _model.list.count; index++) {
//2.如果是最后一张图片,则放置第一张图片
XMLYFindFocusImageDetailModel \*detail = index == _model.list.count ? _model.list.firstObject : [_model.list objectAtIndex:index];
UIImageView \*imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(kScreenWidth \* index, 0, kScreenWidth, 150);
[imageView yy_setImageWithURL:[NSURL URLWithString:detail.pic] options:YYWebImageOptionSetImageWithFadeAnimation];
[self.adverScrollView addSubview:imageView];
}
}
在轮播图滚动动画结束后需要做一下判断,如果当前滚动到了最后一张图片,则立即将scrollView的偏移调整到初始位置,这样一个无限轮播就完成了。- (void)scrollViewDidScroll:(UIScrollView \*)scrollView {
NSInteger curPage = self.adverScrollView.contentOffset.x / kScreenWidth;
if(curPage == self.model.list.count) {
[self.adverScrollView setContentOffset:CGPointMake(0, 0) animated:NO];
}
}
在有轮播图的地方肯定少不了定时器,如果将定时器直接放在cell中,就会因为cell的复用导致定时器出现问题,所有一般是将定时器放在控制器中。但是这样的话也带来一个问题,就是由于定时器的存在,如果要求定时器的生命周期和控制器相同(也就是在控制器dealloc的时候才取消定时器).这样的控制器是无法调用dealloc的,会造成控制器虽然已经退出但是定时器依然在正常工作。所以这里专门为控制器设计了一个定时器的单例帮助类,这样的话就可以在dealloc中去销毁所有的定时器。@interface XMLYFindRecommendHelper : NSObject
#pragma mark - Common
//生成帮助类单例
+ (instancetype)helper;
//销毁所有的定时器
- (void)destoryAllTimer;
#pragma mark - Live
// 开启为直播设置的定时器
- (void)startLiveTimer;
//销毁直播的定时器
- (void)destoryLiveTimer;
#pragma mark - Header
//开启头部的定时器
- (void)startHeadTimer;
//销毁头部的定时器
- (void)destoryHeaderTimer;
@end
在广播页面中,有一个根据当前时间显示不同的问候语的小功能。比如现在是早上6点钟,应该显示“早安*北京”。这里就需要用到NSDateFormatter,但是NSDateFormatter的比较消耗性能,所以我专门写了一个XMLYTimeHelper类来管理所有的时间转换操作。在这个类中对NSDateFormatter做了缓存处理,并使用dispatch_semaphore_t保证了线程安全。//根据字符串生成相应的NSDateFormatter,比如"yyyy-MM-dd HH:mm:ss"
static force_inline NSDateFormatter *XMLYDataCreateFormatter(NSString *string) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
formatter.dateFormat = string;
return formatter;
}
//用户直接调用此方法,传入"yyyy-MM-dd HH:mm:ss"这样的字符串生成NSDateFormatter
static force_inline NSDateFormatter *XMLYDateFormatter(NSString *string) {
//1.检查输入的合法性
if(!string || ![string isKindOfClass:[NSString class]] || string.length == 0) return nil;
//2.初始化单例参数
static CFMutableDictionaryRef cache;
static dispatch_semaphore_t lock;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
cache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
lock = dispatch_semaphore_create(1);
});
//3.加锁
dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
//4.查询当前字符串是否已经存在相应的NSDateformatter
NSDateFormatter *formatter = CFDictionaryGetValue(cache, (__bridge const void *)(string));
//5.解锁
dispatch_semaphore_signal(lock);
//6.如果缓存中没有,则需要重新生成
if(!formatter) {
formatter = XMLYDataCreateFormatter(string);
//7.重新生成成功,存入缓存
if(formatter) {
dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
CFDictionarySetValue(cache, (__bridge const void *)(string), (__bridge const void *)(formatter));
dispatch_semaphore_signal(lock);
}
}
return formatter;
}
类似于喜马拉雅的php源码,源码分享:高仿喜马拉雅FM相关推荐
- 高仿喜马拉雅听Android客户端,Zhumulangma
### 注意:请将lib_common下manifest中喜马拉雅key替换为自己的,不然会提示访问超过限制. https://github.com/TanZhiL/Zhumulangma 本项目仅 ...
- Swift 3 0 高仿喜马拉雅FM
高仿喜马拉雅FM gitHub: https://github.com/LinXunFeng/LXFFM 说明 基于Swift 3.0 编写而成,运行环境要求: Xcode 8.0 LXFFM 原OC ...
- 高仿喜马拉雅FM(第一弹)
项目地址github:https://github.com/Eastwu5788/XMLYFM 如果您觉得不错,记得给一个star 高仿喜马拉雅FM(第二弹) 本篇文章有点长了,更多的内容在第二弹继续 ...
- android仿喜马拉雅APP状态栏,源码分享:高仿喜马拉雅FM
最新用空闲时间高仿了一下喜马拉雅FM这款APP,目前主要完成了发现栏目中的推荐页面. 效果演示 分析 +发现tab中有五个小分类,分别对应五个页面,所有在"发现"的控制器中使用了U ...
- linux源码共享,Android之高仿飞鸽传书热点创建与共享源码
这两天,无意中看到飞鸽传书这个小东东,然后又突然对他的wifi热点创建与共享比较感兴趣,于是乎把他的APK给反编译了,很蛋疼的还原了一下他的这一小模块代码,感觉效果差不多,所以跟大家分享一下,下面我们 ...
- 修改源码自定义SwipeRefreshLayout样式——高仿微信朋友圈下拉刷新
上一篇文章里把SwipeRefreshLayout的原理简单过了一下,大致了解了其工作原理,不熟悉的可以去看一下:http://blog.csdn.net/u011443509/article/det ...
- android仿疯狂猜图源码,Android开发实现高仿优酷的客户端图片左右滑动切换功能实例【附源码下载】...
本文实例讲述了Android开发实现高仿优酷的客户端图片左右滑动切换功能.分享给大家供大家参考,具体如下: 本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和 ...
- 扫描二维码研究总结(高仿微信扫一扫,轻松实现定制扫描界面)
在正文之前说点题外话,加上这篇我已经写了3篇博客了,其实我写博客的初衷不是想证明自己有多牛,并且我也只是从事安卓开发只有半年时间的小渣,但是不想成为大牛的渣不是好渣,所以我想通过博客把工作学习中遇到的 ...
- 远古守卫/cocos2d-x 源码/塔防游戏/高仿王国保卫战
下载地址:下载地址 本源码高度模仿IOS游戏王国保卫战,由国外IOS商业开发教程网站raywenderlich内部工程师制作,有非常完整的关卡设计,战斗流程,长达12个关卡,各种敌兵,怪物,箭塔,炮塔 ...
最新文章
- Bloomberg开源面向OCaml的JavaScript后端BuckleScript
- SAP QM QE02 修改检验结果,报错 -No characteristics were found–
- 从零开始学OpenDaylight(碳版本)之三:Hello示例
- python小游戏源码-导弹发射小游戏——Python源代码
- 从事数据科学前必须知道的五件事儿
- 什么是缓存一致性问题?如何解决呢?
- 手把手教你理解卷积神经网络
- 20165231 2017-2018-2 《Java程序设计》第8周学习总结
- HDFS文件和HIVE表的一些操作
- pb 数据窗口下拉表
- 华北电力大学微型计算机,华北电力大学 微机原理与应用
- 学会PDF转Word,PDF编辑不再是问题!
- 华为Smartkit CRU和FRU工具使用教程
- 代码评审工具Rietveld平台搭建(windowsLinux均可)
- 获取图片外链的方法--网易相册
- TLF80511TC 是一款线性低压差稳压器—科时进商城
- Robust Classification with Convolutional Prototype Learning
- PTA 奇数值结点链表 超详细
- 100G QSFP28 CLR4单模光模块的介绍及对比
- html增加语音朗读功能,给wordpress主题添加上语音播放文章内容文本朗读功能