ios实战-弹幕的实现

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

弹幕是现在比较流行的一个功能,哪哪都有,所以做了个ios - demo分享一下:

https://github.com/Jonear/KSBarrageView

1.用NSTimer做一个定时器

2.随机一个弹道,判断该弹道是否有别的字在跑着

3.如果没有的话,将KSBarrageItemView加入到弹道里

4.然后随机个速度进行动画移动

- (void)postView {
    if (_dataArray && _dataArray.count > 0) {
        int indexPath = random()%(int)((self.frame.size.height)/30);
        int top = indexPath * 30;
         
        UIView *view = [self viewWithTag:indexPath + ITEMTAG];
        if (view && [view isKindOfClass:[KSBarrageItemView class]]) {
            return;
        }
         
        NSDictionary *dict = nil;
        if (_dataArray.count > _curIndex) {
            dict = _dataArray[_curIndex];
            _curIndex++;
        } else {
            _curIndex = 0;
            dict = _dataArray[_curIndex];
            _curIndex++;
        }
         
        for (KSBarrageItemView *view in self.subviews) {
            if ([view isKindOfClass:[KSBarrageItemView class]] && view.itemIndex == _curIndex-1) {
                return;
            }
        }
         
        KSBarrageItemView *item = [[KSBarrageItemView alloc] initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width, top, 10, 30)];
         
        id avatar = [dict objectForKey:@"avatar"];
        NSString *content = [dict objectForKey:@"content"];
        if ([avatar isKindOfClass:[UIImage class]]) {
            [item setAvatarWithImage:avatar withContent:content];
        } else if ([avatar isKindOfClass:[NSString class]]){
            UIImage *image = [UIImage imageNamed:avatar];
            if (image) {
                [item setAvatarWithImage:image withContent:content];
            } else {
                // 这里使用网络图片,请加入sdwebImage库
//                [item setAvatarUrl:avatar withContent:content];
            }
        } else {
            return;
        }
         
        item.itemIndex = _curIndex-1;
        item.tag = indexPath + ITEMTAG;
        [self addSubview:item];
         
        CGFloat speed = 85.;
        speed += random()%20;
        CGFloat time = (item.width+[[UIScreen mainScreen] bounds].size.width) / speed;
         
        [UIView animateWithDuration:time delay:0.f options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionCurveEaseInOut  animations:^{
            item.left = -item.width;
        } completion:^(BOOL finished) {
            [item removeFromSuperview];
        }];
         
    }
}