1616
1717@interface IntersectionObserverContainerOptions (Utils)
1818
19- @property (nonatomic , assign ) BOOL previousVisible ;
19+ @property (nonatomic , assign ) BOOL preVisible ;
2020
2121@end
2222
2323
2424@interface IntersectionObserverTargetOptions (Utils)
2525
26- @property (nonatomic , assign ) CGFloat previousRatio ;
27- @property (nonatomic , assign ) BOOL previousInsecting ;
28- @property (nonatomic , assign ) BOOL previousVisible ;
29- @property (nonatomic , copy ) NSString *previousDataKey ;
30- @property (nonatomic , copy ) NSDictionary *previousData ;
31- @property (nonatomic , assign ) BOOL previousFixedInsecting ;
26+ @property (nonatomic , assign ) CGFloat preRatio ;
27+ @property (nonatomic , assign ) BOOL preInsecting ;
28+ @property (nonatomic , assign ) BOOL preVisible ;
29+ @property (nonatomic , copy ) NSString *preDataKey ;
30+ @property (nonatomic , copy ) NSDictionary *preData ;
31+ @property (nonatomic , assign ) BOOL preReuseInsecting ;
3232
3333@end
3434
@@ -77,22 +77,27 @@ + (void)measureWithObserver:(IntersectionObserver *)observer forTargetView:(UIVi
7777 CGFloat ratio = [[calcResult objectForKey: @" ratio" ] doubleValue ];
7878 CGRect viewportTargetRect = [[calcResult objectForKey: @" viewportTargetRect" ] CGRectValue ];
7979 CGRect intersectionRect = [[calcResult objectForKey: @" intersectionRect" ] CGRectValue ];
80- if (ratio < 0 ) continue ;
8180
82- // previousFixedInsecting 是为了一个 view 被复用很多次都没有曝光的情况下,会一直发送 isInsecting = NO 的事件,例如 delayReport 并且快速滚动的时候
83- if (options.dataKey && options.dataKey .length > 0 && ![options.dataKey isEqualToString: options.previousDataKey] &&
84- options.previousInsecting && options.previousFixedInsecting ) {
81+ if (ratio < 0 ) {
82+ continue ;
83+ }
84+
85+ // preReuseInsecting 是为了结局一个 view 被复用很多次都没有曝光的情况下,会一直发送 isInsecting = NO 的事件,例如 delayReport 并且快速滚动的时候
86+ if (options.dataKey && options.dataKey .length > 0 &&
87+ ![options.dataKey isEqualToString: options.preDataKey] &&
88+ options.preInsecting &&
89+ options.preReuseInsecting ) {
8590 IntersectionObserverEntry *entry =
8691 [IntersectionObserverEntry initEntryWithTargetView: curTargetView
87- dataKey: options.previousDataKey
88- data: options.previousData
92+ dataKey: options.preDataKey
93+ data: options.preData
8994 boundingClientRect: viewportTargetRect
9095 intersectionRatio: ratio
9196 intersectionRect: intersectionRect
9297 isInsecting: NO
9398 rootBounds: containerView.bounds
9499 time: floor ([NSDate date ].timeIntervalSince1970 * 1000 )];
95- options.previousFixedInsecting = NO ;
100+ options.preReuseInsecting = NO ;
96101 [reusedEntries addObject: entry];
97102 [[IntersectionObserverReuseManager shareInstance ] addReusedDataKey: entry.dataKey toScope: scope];
98103 }
@@ -125,25 +130,27 @@ + (void)measureWithObserver:(IntersectionObserver *)observer forTargetView:(UIVi
125130 [hideEntries addObject: entry];
126131 }
127132 if (!delayReportEntry) {
128- options.previousInsecting = isInsecting;
129- options.previousFixedInsecting = isInsecting;
130- options.previousDataKey = options.dataKey ;
131- options.previousData = options.data ;
133+ // 更新各种 pre 值
134+ options.preInsecting = isInsecting;
135+ options.preReuseInsecting = isInsecting;
136+ options.preDataKey = options.dataKey ;
137+ options.preData = options.data ;
132138 if (containerOptions.measureWhenVisibilityChanged ) {
133- options.previousVisible = [self isTargetViewVisible: curTargetView inContainerView: containerView];
139+ options.preVisible = [self isTargetViewVisible: curTargetView inContainerView: containerView];
134140 }
135141 }
136142 }
137143
138- // 非 canReport 也要更新
144+ // 非 canReport 也要更新 preRatio
139145 if (!delayReportEntry) {
140- options.previousRatio = ratio;
146+ options.preRatio = ratio;
141147 }
142148 }
143149
150+ // 更新 pre 值
144151 if (!delayReport) {
145152 if (containerOptions.measureWhenVisibilityChanged ) {
146- containerOptions.previousVisible = [self isContainerViewVisible: containerView];
153+ containerOptions.preVisible = [self isContainerViewVisible: containerView];
147154 }
148155 }
149156
@@ -249,20 +256,19 @@ + (void)delayMeasureWithObserver:(IntersectionObserver *)observer
249256 time: floor ([NSDate date ].timeIntervalSince1970 * 1000 )];
250257 [filterEntries addObject: entry];
251258
252- options.previousInsecting = isInsecting;
253- options.previousFixedInsecting = isInsecting;
254- options.previousDataKey = options.dataKey ;
255- options.previousData = options.data ;
259+ options.preRatio = ratio;
260+ options.preInsecting = isInsecting;
261+ options.preReuseInsecting = isInsecting;
262+ options.preDataKey = options.dataKey ;
263+ options.preData = options.data ;
256264
257265 if (containerOptions.measureWhenVisibilityChanged ) {
258- options.previousVisible = [self isTargetViewVisible: targetView inContainerView: containerView];
266+ options.preVisible = [self isTargetViewVisible: targetView inContainerView: containerView];
259267 }
260-
261- options.previousRatio = ratio;
262268 }
263269
264270 if (containerOptions.measureWhenVisibilityChanged ) {
265- containerOptions.previousVisible = [self isContainerViewVisible: containerView];
271+ containerOptions.preVisible = [self isContainerViewVisible: containerView];
266272 }
267273
268274 if (filterEntries.count > 0 ) {
@@ -323,14 +329,14 @@ + (BOOL)canReportWithRatio:(CGFloat)ratio
323329 if (prevApplicationState != UIApplicationStateActive &&
324330 UIApplication.sharedApplication .applicationState == UIApplicationStateActive) {
325331 // TODO: 先直接返回 YES,这样导致那些那些一开始没曝光的 item 会发送多 isInsecting = NO 的通知
326- // TODO: 如果改为 isInsecting != targetOptions.previousInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
327- return YES ; // isInsecting != targetOptions.previousInsecting ;
332+ // TODO: 如果改为 isInsecting != targetOptions.preInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
333+ return YES ; // isInsecting != targetOptions.preInsecting ;
328334 }
329335 if (prevApplicationState != UIApplicationStateBackground &&
330336 UIApplication.sharedApplication .applicationState == UIApplicationStateBackground) {
331337 // TODO: 先直接返回 YES,这样导致那些那些一开始没曝光的 item 会发送多 isInsecting = NO 的通知
332- // TODO: 如果改为 isInsecting != targetOptions.previousInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
333- return YES ; // isInsecting != targetOptions.previousInsecting ;
338+ // TODO: 如果改为 isInsecting != targetOptions.preInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
339+ return YES ; // isInsecting != targetOptions.preInsecting ;
334340 }
335341 }
336342
@@ -339,13 +345,13 @@ + (BOOL)canReportWithRatio:(CGFloat)ratio
339345 if (containerOptions.measureWhenVisibilityChanged) {
340346 BOOL targetViewVisible = [self isTargetViewVisible:targetOptions.targetView inContainerView:containerOptions.containerView];
341347 BOOL containerViewVisible = [self isContainerViewVisible:containerOptions.containerView];
342- if (targetViewVisible != targetOptions.previousVisible || containerViewVisible != containerOptions.previousVisible ) {
343- return isInsecting != targetOptions.previousInsecting ;
348+ if (targetViewVisible != targetOptions.preVisible || containerViewVisible != containerOptions.preVisible ) {
349+ return isInsecting != targetOptions.preInsecting ;
344350 }
345351 }*/
346352
347353 // 数据发生变化(或者复用)
348- if (targetOptions.dataKey && targetOptions.dataKey .length > 0 && ![targetOptions.dataKey isEqualToString: targetOptions.previousDataKey ]) {
354+ if (targetOptions.dataKey && targetOptions.dataKey .length > 0 && ![targetOptions.dataKey isEqualToString: targetOptions.preDataKey ]) {
349355 if (isInsecting) {
350356 return !isDataKeyVisible;
351357 } else {
@@ -355,12 +361,12 @@ + (BOOL)canReportWithRatio:(CGFloat)ratio
355361
356362 // 前后 ratio 变化
357363 if ([self isInsectingWithRatio: ratio containerOptions: containerOptions targetOptions: targetOptions] !=
358- [self isInsectingWithRatio: targetOptions.previousRatio containerOptions: containerOptions targetOptions: targetOptions]) {
364+ [self isInsectingWithRatio: targetOptions.preRatio containerOptions: containerOptions targetOptions: targetOptions]) {
359365 return YES ;
360366 }
361367
362368 // 是否达到某个 ratio
363- return [self lastMatchThreshold: containerOptions.thresholds ratio: ratio] != [self lastMatchThreshold: containerOptions.thresholds ratio: targetOptions.previousRatio ];
369+ return [self lastMatchThreshold: containerOptions.thresholds ratio: ratio] != [self lastMatchThreshold: containerOptions.thresholds ratio: targetOptions.preRatio ];
364370}
365371
366372+ (BOOL )isContainerViewVisible : (UIView *)containerView {
@@ -457,76 +463,76 @@ + (BOOL)isCGRectValidated:(CGRect)rect {
457463@end
458464
459465
460- static char kAssociatedObjectKey_UtilsContainerPreviousVisible ;
466+ static char kAssociatedObjectKey_UtilsContainerPreVisible ;
461467
462468@implementation IntersectionObserverContainerOptions (Utils)
463469
464- - (void )setPreviousVisible : (BOOL )previousVisible {
465- objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsContainerPreviousVisible , @(previousVisible ), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
470+ - (void )setPreVisible : (BOOL )preVisible {
471+ objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsContainerPreVisible , @(preVisible ), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
466472}
467473
468- - (BOOL )previousVisible {
469- return [objc_getAssociatedObject (self , &kAssociatedObjectKey_UtilsContainerPreviousVisible ) boolValue ];
474+ - (BOOL )preVisible {
475+ return [objc_getAssociatedObject (self , &kAssociatedObjectKey_UtilsContainerPreVisible ) boolValue ];
470476}
471477
472478@end
473479
474480
475- static char kAssociatedObjectKey_UtilsPreviousRatio ;
476- static char kAssociatedObjectKey_UtilsPreviousInsecting ;
477- static char kAssociatedObjectKey_UtilsPreviousFixedInsecting ;
478- static char kAssociatedObjectKey_UtilsPreviousVisible ;
479- static char kAssociatedObjectKey_UtilsPreviousDataKey ;
480- static char kAssociatedObjectKey_UtilsPreviousData ;
481+ static char kAssociatedObjectKey_UtilsPreRatio ;
482+ static char kAssociatedObjectKey_UtilsPreInsecting ;
483+ static char kAssociatedObjectKey_UtilsPreReuseInsecting ;
484+ static char kAssociatedObjectKey_UtilsPreVisible ;
485+ static char kAssociatedObjectKey_UtilsPreDataKey ;
486+ static char kAssociatedObjectKey_UtilsPreData ;
481487
482488@implementation IntersectionObserverTargetOptions (Utils)
483489
484- - (void )setPreviousRatio : (CGFloat)previousRatio {
485- objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreviousRatio , @(previousRatio ), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
490+ - (void )setPreRatio : (CGFloat)preRatio {
491+ objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreRatio , @(preRatio ), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
486492}
487493
488- - (CGFloat)previousRatio {
489- return [objc_getAssociatedObject (self , &kAssociatedObjectKey_UtilsPreviousRatio ) doubleValue ];
494+ - (CGFloat)preRatio {
495+ return [objc_getAssociatedObject (self , &kAssociatedObjectKey_UtilsPreRatio ) doubleValue ];
490496}
491497
492- - (void )setPreviousInsecting : (BOOL )previousInsecting {
493- objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreviousInsecting , @(previousInsecting ), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
498+ - (void )setPreInsecting : (BOOL )preInsecting {
499+ objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreInsecting , @(preInsecting ), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
494500}
495501
496- - (BOOL )previousInsecting {
497- return [objc_getAssociatedObject (self , &kAssociatedObjectKey_UtilsPreviousInsecting ) boolValue ];
502+ - (BOOL )preInsecting {
503+ return [objc_getAssociatedObject (self , &kAssociatedObjectKey_UtilsPreInsecting ) boolValue ];
498504}
499505
500- - (void )setPreviousFixedInsecting : (BOOL )previousFixedInsecting {
501- objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreviousFixedInsecting , @(previousFixedInsecting ), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
506+ - (void )setPreReuseInsecting : (BOOL )preReuseInsecting {
507+ objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreReuseInsecting , @(preReuseInsecting ), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
502508}
503509
504- - (BOOL )previousFixedInsecting {
505- return [objc_getAssociatedObject (self , &kAssociatedObjectKey_UtilsPreviousFixedInsecting ) boolValue ];
510+ - (BOOL )preReuseInsecting {
511+ return [objc_getAssociatedObject (self , &kAssociatedObjectKey_UtilsPreReuseInsecting ) boolValue ];
506512}
507513
508- - (void )setPreviousVisible : (BOOL )previousVisible {
509- objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreviousVisible , @(previousVisible ), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
514+ - (void )setPreVisible : (BOOL )preVisible {
515+ objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreVisible , @(preVisible ), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
510516}
511517
512- - (BOOL )previousVisible {
513- return [objc_getAssociatedObject (self , &kAssociatedObjectKey_UtilsPreviousVisible ) boolValue ];
518+ - (BOOL )preVisible {
519+ return [objc_getAssociatedObject (self , &kAssociatedObjectKey_UtilsPreVisible ) boolValue ];
514520}
515521
516- - (void )setPreviousDataKey : (NSString *)previousDataKey {
517- objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreviousDataKey , previousDataKey , OBJC_ASSOCIATION_COPY_NONATOMIC );
522+ - (void )setPreDataKey : (NSString *)preDataKey {
523+ objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreDataKey , preDataKey , OBJC_ASSOCIATION_COPY_NONATOMIC );
518524}
519525
520- - (NSString *)previousDataKey {
521- return objc_getAssociatedObject (self, &kAssociatedObjectKey_UtilsPreviousDataKey );
526+ - (NSString *)preDataKey {
527+ return objc_getAssociatedObject (self, &kAssociatedObjectKey_UtilsPreDataKey );
522528}
523529
524- - (void )setPreviousData : (NSDictionary *)previousData {
525- objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreviousData , previousData , OBJC_ASSOCIATION_COPY_NONATOMIC );
530+ - (void )setPreData : (NSDictionary *)preData {
531+ objc_setAssociatedObject (self, &kAssociatedObjectKey_UtilsPreData , preData , OBJC_ASSOCIATION_COPY_NONATOMIC );
526532}
527533
528- - (NSDictionary *)previousData {
529- return objc_getAssociatedObject (self, &kAssociatedObjectKey_UtilsPreviousData );
534+ - (NSDictionary *)preData {
535+ return objc_getAssociatedObject (self, &kAssociatedObjectKey_UtilsPreData );
530536}
531537
532538@end
0 commit comments