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

PTCMS仿蜻蜓听书小说网站源码蓝色版 带采集规则+详细安装教程.zip 立即下载

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

最新用空闲时间写了一下喜马拉雅FM这款APP。

干货效果演示

多音频下载、本地播放功能演示


LocalDownload.gif

网络音频播放效果演示


PlayDetail.gif

效果演示

推荐页面效果


recom.gif

分类页面效果


cate.gif

广播页面效果


radio.gif

榜单页面效果


Rank.gif

主播页面效果


Anchor.gif

订阅听页面效果


Dingyue.gif

下载听页面效果


xiazai.gif

我的页面效果


Mine.gif

分析

  • 发现tab中有五个小分类,分别对应五个页面,所有在“发现”的控制器中使用了UIPageViewController来控制五个子控制器。
    +从Charles抓出来的接口来看,“推荐”页面一共调用了三个接口,分别请求了推荐、热门、直播的内容,所以在这里选择了Reactivecocoa来实现接口的并发访问
- (void)refreshDataSource {       

    @weakify(self);
    RACSignal *signalRecommend = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        @strongify(self);
        [self requestRecommendList:^{
            [subscriber sendNext:nil];
        }];
        return nil;
    }];    

    RACSignal *signalHotAndGuess = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        @strongify(self);
        [self requestHotAndGuessList:^{
            [subscriber sendNext:nil];
        }];
        return nil;
    }];

    RACSignal *signalLiving = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> 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;
}
  • 2016.09.09这次主要是完成了榜单页面和主播页面,榜单页面没有什么特别的东西,主播页面主要使用UICollectionView实现三个cell等分整个屏幕,以实现每个section里面的自动布局。如果想实现无边界的布局,需要重写一下系统的UICollectionViewFlowLayout布局类,否则总是会有一小块边界被显示出来
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
    //解决issue
    NSArray* attributes = [[NSArray alloc] initWithArray:[super layoutAttributesForElementsInRect:rect] copyItems:YES];
    for(NSInteger i = 1,max = attributes.count; i < max; i++) {
        UICollectionViewLayoutAttributes *currentLayoutAttributes = attributes[i];
        UICollectionViewLayoutAttributes *prevLayoutAttributes = attributes[i - 1];
        NSInteger maximumSpacing = 0;
        NSInteger origin = CGRectGetMaxX(prevLayoutAttributes.frame);
        if(origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize.width) {
            CGRect frame = currentLayoutAttributes.frame;
            frame.origin.x = origin + maximumSpacing;
            currentLayoutAttributes.frame = frame;
        }
    }
    return attributes;
}

注意,在获取父类的layoutAttributes数组的时候一定要选择copy,否则会报一个issue

2016-09-09 10:20:10.687 XMLYFM[1453:240776] Logging only once for UICollectionViewFlowLayout cache mismatched frame
2016-09-09 10:20:10.688 XMLYFM[1453:240776] UICollectionViewFlowLayout has cached frame mismatch for index path <NSIndexPath: 0xc000000000200116> {length = 2, path = 1 - 1} - cached value: {{106, 415}, {106.66666666666667, 162.53968253968256}}; expected value: {{106.5, 415}, {106.66666666666667, 162.53968253968256}}
2016-09-09 10:20:10.688 XMLYFM[1453:240776] This is likely occurring because the flow layout subclass XMLYAnchorFlowLayout is modifying attributes returned by UICollectionViewFlowLayout without copying them
  • 在我的github上有我一年多以前写的一个通过重写UICollectionViewLayout实现瀑布流的小demo,大家有兴趣可以去看看

  • 在“下载听”页面中有一个显示当前已占用空间和可用空间的功能,关于计算当前可用空间我这里有一个函数,可以直接拿去用。不谢

    static int64_t XMLYDiskSpaceFree() {
      NSError *error = nil;
      NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error];
      if (error) return -1;
      int64_t space =  [[attrs objectForKey:NSFileSystemFreeSize] longLongValue];
      if (space < 0) space = -1;
      return space;
    }
  • 在“我的”页面中有一个下拉放大的效果,网上有很多实现的方法,我这里用了一个很简单的方法,在UITableView上增加一个子视图,作为真正的头部视图,遮盖掉tableHeaderView,在ScrollView滚动的时候,改变子视图的大小就行了。

1.创建子视图

- (XMLYMineHeaderView *)headerView {
    if(!_headerView) {
        //真正的头部视图
        _headerView = [[XMLYMineHeaderView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 288)];
        //设置tableHeaderView的大小与头视图相同
        self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 288)];
        //将头部视图作为UITableView子视图,遮盖掉原来的tableHeaderView
        [self.tableView addSubview:_headerView];
    }
    return _headerView;
}

2.TableView滚动时调整headerView的大小

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat offsetY = scrollView.contentOffset.y;
    if (offsetY <= 0) {
        self.headerView.frame = CGRectMake(offsetY / 2.0, offsetY, kScreenWidth - offsetY, 288 - offsetY);
    }
}

3.将headerView的frame计算放在layoutSubViews方法中,这样每一次改变headerView的frame,此方法都会走一遍,从而随之调整子视图的位置。但是千万不要把复杂位置计算放在里面

- (void)layoutSubviews { // height 288
    [super layoutSubviews];


    CGFloat hspace = (self.frame.size.width - kScreenWidth) / 2.0f;
    CGFloat centx = self.frame.size.width / 2.0f;

    //背景视图
    self.backImageView.frame = CGRectMake(hspace, 0, kScreenWidth, self.frame.size.height);
    self.alphaView.frame = CGRectMake(hspace, 0, kScreenWidth, self.frame.size.height);

    //节目管理
    self.managerButton.frame = CGRectMake(centx - 10 - 104.0f, self.frame.size.height - 36.0 - 37.0f, 104.0f, 37.0f);

    //录音按钮
    self.recordButton.frame = CGRectMake(centx + 10, self.managerButton.frame.origin.y, 104.0f, 37.0f);

    //子标题 
    self.subTitleLabel.frame = CGRectMake(centx - 150.0f, self.recordButton.frame.origin.y - 24.0f - 15.0f, 300, 15);

    //点击登录按钮
    self.userNameButton.frame = CGRectMake(centx - 100.0f, self.subTitleLabel.frame.origin.y - 10 - 18.0, 200.0f, 18.0f);

    self.avatarImageView.frame = CGRectMake(centx - 45.0, self.userNameButton.frame.origin.y - 10 - 90.0, 90, 90);

    //设置按钮
    self.settingButton.frame = CGRectMake(12 + hspace, self.avatarImageView.frame.origin.y - 20, 20, 20);

}

欢迎大家关注我的微信公众号


qrcode_for_gh_c3cd7518dd64_1280.jpg
模仿喜马拉雅 FM 作者HansRove,源码XiMaLaYa-by-HansRove-,仿做喜马拉雅, 对AVFoundation框架的一次尝试 软件环境: iOS9.1硬件环境: Mac OS X 10.11开发工具: Xcode7.1 项目描述: 模板是“喜马拉雅FM”,因为很喜欢这个软件的风格和内容,当时这款软件参杂着太多的广告以及推广。所以打算通过抓包,并Json解析出数据,进而使用自己搭建的界面完成视听播放功能, UI也算是高仿“喜马拉雅FM”.但部分内容在原来基础上做了相应的修改。 功能概述: 0、音频播放:这是最基础的模块,提供用户收听各类声音、专辑及电台主播。 1、发现听:实时动态的信息展示页,每天的音频热门信息和音频专辑集数的更新;展示给用户声音分类和电台及网络主播相应的推荐页供用户选择交互。 2、定制听:记录用户关注的声音(专辑)、主播和电台以及收听历史,并推荐近几天热门声音。 3、下载听:记录用户下载记录并对用户下载过的声音进行分类展示。 4、搜索功能:根据热词提供展示,用户可以搜索主播、电台、声音或专辑。 项目所用技术及框架:【纯代码+故事板】项目使用MVVM模式搭建 1、二次封装AFNetworking与MJExtension进行数据请求与解析; 2、使用Masonry实现纯代码布局,使用MJRefresh实现下拉刷新上拉加载; 3、大量使用自定义Cell、自定义Button、自定义View来实现多控件封装方便布局使用; 4、使用AVFundation实现在线音频播放。并自定义播放器外观以及进度条配置; 项目收获: 1、对MVVM模式的使用更加熟练,设计模式的了解及掌握为未来开发少走了许多弯路; 2、熟悉JSON数据解析,对数据处理有一定的了解,特别是掌握了MJExtension框架的原理及写法; 3、通知中心及单例模式的使用,减低了代码的耦合性; 4、纯代码跳转Storyboard或者Xib使用更加熟练;封装了好多自定义视图,方便布局。 立即下载

相关推荐

802.11ax 的OFDMA资源分配详解

802.11ax 引入的最重要的技术就是OFDMA。OFDMA中引入了RU(资源块)概念,也就是20Mhz/40Mhz/80Mhz/160Mhz的带宽可以切割成不同尺寸的RU,分配给不同的用户使用,这样就大大提高了频谱资源的利用率。 常见的RU尺寸有26/52/102/242/484/996,单位是子载波,每个子载波是78.125Khz,这样20Mhz的带宽可以划分为如下图所示的不同RU大小。 按照11ax规范的要求,上下行的数据传输都可以由AP来统一调度,这样上下行的OFDM...

weixin_43408952的博客 1万+

高仿喜马拉雅 Android 客户端,单 activity 多 fragme 组件化架构,欢迎 star,不喜勿喷

Zhumulangma 项目地址:TanZhiL/Zhumulangma 简介: 高仿喜马拉雅 Android 客户端,单 activity 多 fragme 组件化架构,欢迎 star,不喜勿喷???? 更多:作者提 Bug 标签: ### 注意:请将 lib_common 下 manifest 中喜马拉雅 key 替换为自己的,不然会提示访问超过限制. 本项目仅提供...

未来很长,但我会努力的走下去。 656

Python 爬虫实战:爬取股票数据做 K 线图可视化

摘要:本文介绍基于Python的股票数据爬取与K线图可视化全流程技术方案。通过Requests库抓取东方财富网股票数据,使用Pandas进行清洗处理,并利用mplfinance库实现专业K线图绘制。文章详细讲解了数据爬取接口分析、反爬策略配置、K线图绘制方法(包含基础K线图和带均线的进阶版本),以及核心统计指标计算。该方案可应用于股票价格趋势分析,为投资决策提供数据支持,同时强调了数据使用的合规性和技术优化方向。

2503_91057718的博客 2049

【免费下载】 喜马拉雅xm文件转mp3工具:轻松管理你的音频资源

喜马拉雅xm文件转mp3工具:轻松管理你的音频资源 【下载地址】喜马拉雅xm文件转mp3工具 本仓库提供了一个方便的工具,用于将喜马拉雅下载的xm文件批量转换为mp3格式。无论你是想要在其他设备上播放这些音频文件,还是希望节省存储空间,这个工具都能帮助你轻松完成转换任务。 ...

gitblog_09787的博客 1805

YOLOv5改进 | 注意力篇 | iRMB倒置残差块注意力机制(轻量化注意力机制,附二次创新)

本文给家大家带来的改进机制是iRMB,其是在论文Rethinking Mobile Block for Efficient Attention-based Models种提出,论文提出了一个新的主干网络EMO(后面我也会教大家如何使用该主干,本文先教大家使用该文中提出的注意力机制)。其主要思想是将轻量级的CNN架构与基于注意力的模型结构相结合(有点类似ACmix)我将iRMB和C2f结合,然后也将其用在了检测头种进行尝试三种结果进行对比,针对的作用也不相同,但是无论那种实验均有一定涨点效果。

Snu77的博客 2571

汽车电子RTOS--AUTOSAR OS

AUTOSAR OS(AUTomotive Open System ARchitecture Operating System)是AUTOSAR(汽车开放系统架构)标准中的一个重要组件,它是一个专门为汽车电子控制单元(ECU)设计的实时操作系统(RTOS)。AUTOSAR OS旨在提供一个标准化的软件平台,以促进不同供应商和汽车制造商之间的组件复用和协同开发,提高软件质量和降低成本。

MHD0815的博客 1799

【离线版下载】喜马拉雅XM转MP3工具:免费一键批量转换xm音频的完整指南

「喜马拉雅xm文件转mp3工具」是一个免费的开源小工具,专门把喜马拉雅客户端下载下来的 xm 音频批量转成标准 mp3 格式。一条命令拉起、选文件、出结果,专治"文件出了喜马拉雅就打不开"的麻烦。适合通勤听书用户、车机党,以及想统一管理本地音频资源的人。 ## xm 文件为什么"出了喜马拉雅就用不了" 两个最常见的真实场景: - 用喜马拉雅 PC 客户端下载了一整本有声书,拷贝到手机、平板里

gitblog_00295的博客 103

Oracle EBS 寄销/VMI(2)-->采购篇

上篇有一部分设置需要建BPA后,将BPA编号与批准的供应商相关联.     本篇主要是讲的内容:一揽子采购协议-->准标采购订单-->收接入库-->子库转移-->创建冲减通知-->'按接收开票' 自动开票程序 1. PO-->采购订单à采购订单 创建一揽子采购协议,确定物料

陈显平的专栏-Oracle EBS 1万+

108.Android 简单的高仿喜马拉雅TabLayout效果,蚯蚓导航效果,滑动下划线指示器滑动效果

喜马拉雅效果图: 我的效果图: //以下代码实现: //第一步:新建CustomTabLayout类继承HorizontalScrollView,自定义实现TabLayout需要的效果,注意将本类里com.gang.app.myceshi.customtab,是我项目里的包名,全部替换成你自己的。整体代码: /* * Copyright (C) 2015 The Android Open Source Project ...

曹二少的博客 1682

【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知

Docker的监控,可以使用Docker自带的stats命令来获取当前主机上运行中的容器的资源使用情况。 例如:容器的CPU使用率、内存占用、网络IO以及磁盘IO等指标。

景天科技苑 6万+

ue 打包linux程序 在windows系统 2026

ue 打包linux程序 在windows系统 2026

jacke121的专栏 372

Swift高仿喜马拉雅APP之一Charles抓包、图片资源获取等

前言: 距离上一个Swift仿写有妖气漫画项目基本接近尾声的时候,开始着手准备本次Swift高仿喜马拉雅App 的接口抓取和App资源获取工作,本篇文章主要介绍一下抓包工具Carles和图片资源获取工具Apple Configurator 2的使用 目录: *Charles抓包工具抓取数据接口 **Apple Configurator 2获取APP图片资源包 ***LICEcap 录屏工具使...

weixin_34242658的博客 522

JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

【代码】JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 470

高仿喜马拉雅FM(第二弹)

项目地址github:https://github.com/Eastwu5788/XMLYFM 如果您觉得不错,记得给一个star第一期地址:http://www.jianshu.com/p/3f48a1dccf52 如果您觉得不错,记得给一个喜欢,谢谢 之前的第一弹文章比较长,影响了阅读,所以在这里接着介绍我的高仿喜马拉雅APP的基本情况。这次我将软件运行效果放到了后面,将代码的介绍放到了前面

github_35902923的博客 4959

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Swift 3 0 高仿喜马拉雅FM

高仿喜马拉雅FM gitHub: https://github.com/LinXunFeng/LXFFM 说明 基于Swift 3.0 编写而成,运行环境要求: Xcode 8.0 LXFFM 原OC版: github.com/Eastwu5788/… 从原版作者的源代码上学到了很多,十分感谢. 由于只是本人OC转Swift的试练项目,所以有些内容并没有实现,哈哈 效果图 ...

weixin_34247299的博客 169

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

类似于喜马拉雅的php源码,源码分享:高仿喜马拉雅FM

最新用空闲时间高仿了一下喜马拉雅FM这款APP,目前主要完成了发现栏目中的推荐页面。效果演示分析+发现tab中有五个小分类,分别对应五个页面,所有在“发现”的控制器中使用了UIPageViewController来控制五个子控制器。+从Charles抓出来的接口来看,“推荐”页面一共调用了三个接口,分别请求了推荐、热门、直播的内容,所以在这里选择了Reactivecocoa来实现接口的并发访问-...

weixin_39589394的博客 1055

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

最新用空闲时间高仿了一下喜马拉雅FM这款APP,目前主要完成了发现栏目中的推荐页面。效果演示分析+发现tab中有五个小分类,分别对应五个页面,所有在“发现”的控制器中使用了UIPageViewController来控制五个子控制器。+从Charles抓出来的接口来看,“推荐”页面一共调用了三个接口,分别请求了推荐、热门、直播的内容,所以在这里选择了Reactivecocoa来实现接口的并发访问-...

weixin_31154627的博客 963

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

### 注意:请将lib_common下manifest中喜马拉雅key替换为自己的,不然会提示访问超过限制. https://github.com/TanZhiL/Zhumulangma 本项目仅提供学习参考,不可作为商用. 更新日志: 珠穆朗玛FM 1.0 2019-10.09 友盟分享 珠穆朗玛FM 1.0 2019-09.25 布局优化,避免过渡绘制 完善状态管理,提升用户体验 ...

逝水流年轻染尘的博客 1546

Swift仿写喜马拉雅FM

Linux编程点击右侧关注,免费入门到精通!作者丨 Domohttps://juejin.im/post/5b97743df265da0af21351aa前言:最近抽空面...

<sdffdsfsdfdfs>sfsfsfsdfsdffds</sdfsDS>Fsd 502

**珠穆朗玛FM: 高仿喜马拉雅Android客户端搭建指南**

珠穆朗玛FM: 高仿喜马拉雅Android客户端搭建指南 项目概述 珠穆朗玛FM是一个模仿喜马拉雅Android客户端的开源项目,采用了单Activity多Fragment的组件化架构。该项目由TanZhiL维护,并使用了一系列前沿技术如Retrofit、RxJava等,旨在提供一个高效且易于维护的代码结构。以下是搭建和理解此项目的基本指导。 1. 目录结构及介绍 Zhumulangma/ ├──...

gitblog_00046的博客 308

swift 学习资料

完整App open-source-ios-apps Collaborative List of Open-Source Swift 30 Projects 最新 Swift 3.0 的30个小App,更注重代码规范和架构设计(故胤道长) V2ex-Swift 用 Swift 写的 V2EX 客户端 iBBS-Swift “新手开源一个用Sw...

码农天后的博客 334

iOS学习资源收藏列表

/*****iOS学习视频及资料**********/ http://www.jianshu.com/p/cc40671c5fbc 史上最全iOS 开发工具集合 /*****即时通讯*********/ ChatKit   https://github.com/leancloud/ChatKit-OC   iOS 即时通讯 + 仿微信聊天框架 + 源码

Sunny__CY的博客 516

iOS开发最常用三方库集合Swift版(三方库、插件、博客等等)

Swift学习资料@ SwiftGuide很赞 的Swift学习资料 leetcode一个练习、评估自己水平的代码平台,跟ACM有点类似 完整App@ Swift 30 Projects- 最新 Swift 3.0 的30个小App,更注重代码规范和架构设计(故胤道长) V2ex-Swift- 用 Swift 写的 V2EX 客户端。 iBBS-Swift- “新手开源一个用Swift...

C 3248

TimLiu-iOS项目中的Swift技术资源全解析

TimLiu-iOS项目中的Swift技术资源全解析 【免费下载链接】TimLiu-iOS Tim9Liu9/TimLiu-iOS: 是一个 iOS 开发的学习教程以及示例代码库。适合对 iOS 开发以及想要学习 iOS 开发技术的开发者。 ...

gitblog_00228的博客 434
上一篇: 仿微信ActionSheet
下一篇: 高仿喜马拉雅FM(第二弹)
LeonardWuCn
博客等级 码龄10年 6粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值