由于我们的需求是在图片上跑弹幕. 而且图片还要点击放大查看.
网上的demo都没法用. 于是就有了以下代码
// BulleView.h
#import "SprayBulleModel.h"
typedef NS_ENUM(NSUInteger, BulletDirection) {
BulletDirectionR2L = 1, // 右向左
BulletDirectionL2R = 2, // 左向右
};
typedef enum : NSUInteger {
MoveStatusStart,
MoveStatusEnter ,
MoveStatusEnd,
} MoveStatus;
@interface BulleView : UIView
@property (nonatomic, assign) NSInteger trajectory; //弹道
@property (nonatomic, assign) BulletDirection direction;
@property (nonatomic, copy) void(^moveStatusBlock)(MoveStatus status); //弹幕状态回调
- (instancetype)initWithParam:(ViewpointModel *)param;
- (void)startAnimation;
- (void)stopAnimation;
@end
// BulleView.m
#import "BulleView.h"
@interface BulleView ()
@property (nonatomic, strong) UIImageView * commentView;
@property (nonatomic, copy) NSString * comment;
@property (nonatomic, copy) NSString * headUrl;
@property (nonatomic, assign) NSInteger groupType;
@end
@implementation BulleView
- (instancetype)initWithParam:(ViewpointModel *)param
{
self = [super init];
if (self) {
self.comment = param.content;
self.headUrl = [NSString stringWithFormat:@"%@%@", param.baseURL, param.headUrl];
self.groupType = param.campType;
[self addSubview:self.commentView];
self.bounds = self.commentView.bounds;
}
return self;
}
#pragma mark ---- start 开始动画
- (void)startAnimation
{
CGFloat screenW = [[UIScreen mainScreen] bounds].size.width;
CGFloat duration = 8.0f;
CGFloat wholeWidth = screenW + CGRectGetWidth(self.bounds);
if (self.moveStatusBlock) {
self.moveStatusBlock(MoveStatusStart);
}
//控制速度
CGFloat speed = wholeWidth / duration;
CGFloat enterDuration = CGRectGetWidth(self.bounds) / speed;
[self performSelector:@selector(enterScreen) withObject:nil afterDelay:enterDuration];
__block CGRect frame = self.fr