美文网首页小知识点好东西iOS开发
iOS基于FreeStreamer的仿网易云音乐(2)

iOS基于FreeStreamer的仿网易云音乐(2)

作者: QuintGao | 来源:发表于2018-05-21 11:20 被阅读25次

前言

前面写过一篇iOS基于FreeStreamer的仿网易云音乐播放器,主要实现了音乐的播放功能。
这篇文章是对前面功能的完善

主要实现的内容有:

 1、专辑详情页
 2、歌手详情页

虽然找了很多方法及查询了很多资料,但是效果还是没有网易云音乐那么好。不过基本功能都还是实现了。

demo中用到了分页显示的框架WMPageController,首页及歌手详情页都用到了这个框架,这里感谢作者的杰作。

效果图

专辑详情页 歌手详情页

实现

由于专辑详情页实现是比较简单的,这里主要说一下歌手详情页的实现,这里的实现也是通过下载别人的demo,然后通过研读、使用、调试最终才实现的。

歌手详情页初看比较简单,如果没有底部分页的左右滑动,用一个tableview就能实现,但其实并没有想象的那么简单。

下面是歌手详情页的整体结构图:


图做的不好,将就看吧

实现时主要遇到的问题就是

 1、子控制器中的tableView上下滑动与主控制器中的tableView上下滑动冲突
 2、WMPageController中的UIScrollview左右滑动与主控制器中的tableView上下滑动冲突

解决办法就是监听UIScrollview的滑动,在mainTableView和子控制器的tableview中处理即可,废话不多说,上代码

一、上下滑动冲突解决

// 主控制器中tableview滑动监听处理
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // 当前偏移量
    CGFloat offsetY = scrollView.contentOffset.y;
    // 临界点
    CGFloat criticalPoint = [self.mainTableView rectForSection:0].origin.y - NAVBAR_HEIGHT;
    
    // 利用contentOffset处理内外层tableView的滑动冲突
    // 滑动到达临界点时固定mainTableView的位置
    if (offsetY >= criticalPoint) {
        scrollView.contentOffset = CGPointMake(0, criticalPoint);
        self.isCriticalPoint = YES;
    }else {
        self.isCriticalPoint = NO;
    }
    
    if (self.isCriticalPoint) {
        [kNotificationCenter postNotificationName:@"EnterCriticalPoint" object:@{@"canScroll": @1}];
        self.isCanScroll = NO;
    }else {
        if (!self.isCanScroll) {
            self.mainTableView.contentOffset = CGPointMake(0, criticalPoint);
        }
    }
}
// 子控制器中tableview滑动监听处理(基类中处理)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (!_canScroll) {
        [scrollView setContentOffset:CGPointZero];
    }
    
    CGFloat offsetY = scrollView.contentOffset.y;
    if (offsetY <= 0) {
        [kNotificationCenter postNotificationName:@"LeaveCriticalPoint" object:@{@"canScroll":@1}];
    }
}

二、左右滑动冲突解决

创建继承自WMPageController的子类GKPageController,实现如何方法:

#pragma mark - UIScrollViewDelegate
// 解决左右滑动与上下滑动的冲突
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    [super scrollViewWillBeginDragging:scrollView];
    
    [kNotificationCenter postNotificationName:@"HorizontalScroll" object:@{@"canScroll":@"0"}];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    [super scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
    
    [kNotificationCenter postNotificationName:@"HorizontalScroll" object:@{@"canScroll":@"1"}];
}

在主控制器中接收通知,控制mainTableView是否可以滑动即可。

最后

上面就是歌手详情页的基本实现了,如果您觉得不够清晰,请到github下载最新的demo,如果喜欢的话还请点一波star。
下面附上github链接GKWYMusic

相关文章

网友评论

  • 宋进锋:if (value > self.controlView.bufferProgress) {
    [kPlayer setPlayerProgress:self.controlView.bufferProgress];
    }else{
    [kPlayer setPlayerProgress:value];
    }
    你看看在这是不是应该加个判断,当拖动进度大于缓冲进度的话,就指定倒当前缓冲进度的最大值
  • 宋进锋:问你个问题哈,当我的音乐文件在1小时时长时。我拖动进度条超过目前缓存进度,会出现ACMP4AACBaseDecoder.cpp:1346:ProduceOutputBufferList(: '01 B9 00 00 01 68 00 00 01 63 00 00 01 5A 00 00 01 69 00 00 01 65 00 00 01 69 00 00 01 )的错误,这时候进度条会继续走,走到总时长后,不重新归零。你试出来这种问题没有

本文标题:iOS基于FreeStreamer的仿网易云音乐(2)

本文链接:https://www.haomeiwen.com/subject/zozxjftx.html