最新用空闲时间高仿了一下喜马拉雅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相关推荐

  1. 高仿喜马拉雅听Android客户端,Zhumulangma

    ### 注意:请将lib_common下manifest中喜马拉雅key替换为自己的,不然会提示访问超过限制. https://github.com/TanZhiL/Zhumulangma 本项目仅 ...

  2. Swift 3 0 高仿喜马拉雅FM

    高仿喜马拉雅FM gitHub: https://github.com/LinXunFeng/LXFFM 说明 基于Swift 3.0 编写而成,运行环境要求: Xcode 8.0 LXFFM 原OC ...

  3. 高仿喜马拉雅FM(第一弹)

    项目地址github:https://github.com/Eastwu5788/XMLYFM 如果您觉得不错,记得给一个star 高仿喜马拉雅FM(第二弹) 本篇文章有点长了,更多的内容在第二弹继续 ...

  4. android仿喜马拉雅APP状态栏,源码分享:高仿喜马拉雅FM

    最新用空闲时间高仿了一下喜马拉雅FM这款APP,目前主要完成了发现栏目中的推荐页面. 效果演示 分析 +发现tab中有五个小分类,分别对应五个页面,所有在"发现"的控制器中使用了U ...

  5. linux源码共享,Android之高仿飞鸽传书热点创建与共享源码

    这两天,无意中看到飞鸽传书这个小东东,然后又突然对他的wifi热点创建与共享比较感兴趣,于是乎把他的APK给反编译了,很蛋疼的还原了一下他的这一小模块代码,感觉效果差不多,所以跟大家分享一下,下面我们 ...

  6. 修改源码自定义SwipeRefreshLayout样式——高仿微信朋友圈下拉刷新

    上一篇文章里把SwipeRefreshLayout的原理简单过了一下,大致了解了其工作原理,不熟悉的可以去看一下:http://blog.csdn.net/u011443509/article/det ...

  7. android仿疯狂猜图源码,Android开发实现高仿优酷的客户端图片左右滑动切换功能实例【附源码下载】...

    本文实例讲述了Android开发实现高仿优酷的客户端图片左右滑动切换功能.分享给大家供大家参考,具体如下: 本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和 ...

  8. 扫描二维码研究总结(高仿微信扫一扫,轻松实现定制扫描界面)

    在正文之前说点题外话,加上这篇我已经写了3篇博客了,其实我写博客的初衷不是想证明自己有多牛,并且我也只是从事安卓开发只有半年时间的小渣,但是不想成为大牛的渣不是好渣,所以我想通过博客把工作学习中遇到的 ...

  9. 远古守卫/cocos2d-x 源码/塔防游戏/高仿王国保卫战

    下载地址:下载地址 本源码高度模仿IOS游戏王国保卫战,由国外IOS商业开发教程网站raywenderlich内部工程师制作,有非常完整的关卡设计,战斗流程,长达12个关卡,各种敌兵,怪物,箭塔,炮塔 ...

最新文章

  1. Bloomberg开源面向OCaml的JavaScript后端BuckleScript
  2. SAP QM QE02 修改检验结果,报错 -No characteristics were found–
  3. 从零开始学OpenDaylight(碳版本)之三:Hello示例
  4. python小游戏源码-导弹发射小游戏——Python源代码
  5. 从事数据科学前必须知道的五件事儿
  6. 什么是缓存一致性问题?如何解决呢?
  7. 手把手教你理解卷积神经网络
  8. 20165231 2017-2018-2 《Java程序设计》第8周学习总结
  9. HDFS文件和HIVE表的一些操作
  10. pb 数据窗口下拉表
  11. 华北电力大学微型计算机,华北电力大学 微机原理与应用
  12. 学会PDF转Word,PDF编辑不再是问题!
  13. 华为Smartkit CRU和FRU工具使用教程
  14. 代码评审工具Rietveld平台搭建(windowsLinux均可)
  15. 获取图片外链的方法--网易相册
  16. TLF80511TC 是一款线性低压差稳压器—科时进商城
  17. Robust Classification with Convolutional Prototype Learning
  18. PTA 奇数值结点链表 超详细
  19. 100G QSFP28 CLR4单模光模块的介绍及对比
  20. html增加语音朗读功能,给wordpress主题添加上语音播放文章内容文本朗读功能

热门文章

  1. JAVA解析APK:读取apk的应用名称、包名、版本号、图标、大小等信息
  2. 【VC】 swscanf_s 函数使用,方便快捷的转换数据格式
  3. 超火的情感视频短视频账号,赚钱的路子有多野?
  4. 燕山大学计算机辅助设计三级项目报告,计算机辅助设计(燕山大学)
  5. 微信接入js-sdk-获取地理位置,打开微信内置地图
  6. 简易的自动抢购脚本,适用于各种限购产品,你懂得!
  7. 用android studio实现倒计时,AndroidStudio项目制作倒计时模块
  8. Python现在越来越大众化了,你学到哪了?
  9. 全国省市区json数据
  10. 男人就该对自己狠一点