YOUPAIOCBarrageCell.m 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. //
  2. // YOUPAIOCBarrageCell.m
  3. // TestApp
  4. //
  5. // Created by QMTV on 2017/8/21.
  6. // Copyright © 2017年 LFC. All rights reserved.
  7. //
  8. #import "YOUPAIOCBarrageCell.h"
  9. @interface YOUPAIOCBarrageCell()<UIGestureRecognizerDelegate>
  10. @end
  11. @implementation YOUPAIOCBarrageCell
  12. - (instancetype)init {
  13. self = [super init];
  14. if (self) {
  15. _trackIndex = -1;
  16. UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(youpaiftapClick)];
  17. tapGes.delegate = self;
  18. [self addGestureRecognizer:tapGes];
  19. }
  20. return self;
  21. }
  22. -(void)youpaiftapClick
  23. {
  24. if(self.Clickblock)
  25. {
  26. self.Clickblock();
  27. }
  28. }
  29. - (void)prepareForReuse {
  30. [self.layer removeAnimationForKey:kBarrageAnimation];
  31. _barrageDescriptor = nil;
  32. if (!_idle) {
  33. _idle = YES;
  34. }
  35. _trackIndex = -1;
  36. }
  37. - (void)setBarrageDescriptor:(YOUPAIOCBarrageDescriptor *)barrageDescriptor {
  38. _barrageDescriptor = barrageDescriptor;
  39. }
  40. - (void)youpaifclearContents {
  41. self.layer.contents = nil;
  42. }
  43. - (void)youpaifconvertContentToImage {
  44. }
  45. - (void)sizeToFit {
  46. CGFloat height = 0.0;
  47. CGFloat width = 0.0;
  48. for (CALayer *sublayer in self.layer.sublayers) {
  49. CGFloat maxY = CGRectGetMaxY(sublayer.frame);
  50. if (maxY > height) {
  51. height = maxY;
  52. }
  53. CGFloat maxX = CGRectGetMaxX(sublayer.frame);
  54. if (maxX > width) {
  55. width = maxX;
  56. }
  57. }
  58. if (width == 0 || height == 0) {
  59. CGImageRef content = (__bridge CGImageRef)self.layer.contents;
  60. if (content) {
  61. UIImage *image = [UIImage imageWithCGImage:content];
  62. width = image.size.width/[UIScreen mainScreen].scale;
  63. height = image.size.height/[UIScreen mainScreen].scale;
  64. }
  65. }
  66. self.bounds = CGRectMake(0.0, 0.0, width, height);
  67. }
  68. - (void)removeSubViewsAndSublayers {
  69. NSEnumerator *viewEnumerator = [self.subviews reverseObjectEnumerator];
  70. UIView *subView = nil;
  71. while (subView = [viewEnumerator nextObject]){
  72. [subView removeFromSuperview];
  73. }
  74. NSEnumerator *layerEnumerator = [self.layer.sublayers reverseObjectEnumerator];
  75. CALayer *sublayer = nil;
  76. while (sublayer = [layerEnumerator nextObject]){
  77. [sublayer removeFromSuperlayer];
  78. }
  79. }
  80. - (void)youpaifaddBorderAttributes {
  81. if (self.barrageDescriptor.borderColor) {
  82. self.layer.borderColor = self.barrageDescriptor.borderColor.CGColor;
  83. }
  84. if (self.barrageDescriptor.borderWidth > 0) {
  85. self.layer.borderWidth = self.barrageDescriptor.borderWidth;
  86. }
  87. if (self.barrageDescriptor.cornerRadius > 0) {
  88. self.layer.cornerRadius = self.barrageDescriptor.cornerRadius;
  89. }
  90. }
  91. - (void)youpaifaddBarrageAnimationWithDelegate:(id<CAAnimationDelegate>)animationDelegate {
  92. }
  93. - (void)youpaifupdateSubviewsData {
  94. }
  95. - (void)youpaiflayoutContentSubviews {
  96. }
  97. - (CAAnimation *)barrageAnimation {
  98. return [self.layer animationForKey:kBarrageAnimation];
  99. }
  100. //add by leo 动画点击效果
  101. - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event {
  102. CGRect presentingRect =self.frame;
  103. //如果不在动画中则presentationLayer为空,在动画中就需要实时的判断点击是否点中动画中的动画
  104. if (self.layer.presentationLayer) {
  105. presentingRect =self.layer.presentationLayer.frame;
  106. }
  107. CGPoint superPoint = [self convertPoint:point toView:self.superview];
  108. BOOL isInside =CGRectContainsPoint(presentingRect, superPoint);
  109. return isInside;
  110. }
  111. -(id)hitTest:(CGPoint)point withEvent:(UIEvent *)event
  112. {
  113. if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil;
  114. // 2. 判断点在不在当前控件
  115. if ([self pointInside:point withEvent:event] == NO)
  116. return nil;
  117. // 3.从后往前遍历自己的子控件
  118. NSInteger count = self.subviews.count;
  119. for (NSInteger i = count - 1; i >= 0; i--) {
  120. UIView *childView = self.subviews[i];
  121. // 把当前控件上的坐标系转换成子控件上的坐标系
  122. CGPoint childP = [self convertPoint:point toView:childView];
  123. UIView *fitView = [childView hitTest:childP withEvent:event];
  124. if (fitView) { // 寻找到最合适的view
  125. return fitView;
  126. }
  127. }
  128. // 循环结束,表示没有比自己更合适的view
  129. return self;
  130. }
  131. @end