前言
前面写过一篇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
网友评论
[kPlayer setPlayerProgress:self.controlView.bufferProgress];
}else{
[kPlayer setPlayerProgress:value];
}
你看看在这是不是应该加个判断,当拖动进度大于缓冲进度的话,就指定倒当前缓冲进度的最大值