美文网首页小知识点好东西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