@@ -324,31 +324,32 @@ + (BOOL)canReportWithRatio:(CGFloat)ratio
324324 BOOL isDataKeyVisible = targetOptions.dataKey ? [[IntersectionObserverReuseManager shareInstance ] isDataKeyVisible: targetOptions.dataKey inScope: containerOptions.scope] : NO ;
325325
326326 // 生命周期发生变化
327- if (containerOptions.measureWhenAppStateChanged ) {
327+ if (containerOptions.measureWhenAppStateChanged && targetOptions. dataKey ) {
328328 UIApplicationState prevApplicationState = [IntersectionObserverManager shareInstance ].previousApplicationState ;
329329 if (prevApplicationState != UIApplicationStateActive &&
330330 UIApplication.sharedApplication .applicationState == UIApplicationStateActive) {
331- // TODO: 先直接返回 YES,这样导致那些那些一开始没曝光的 item 会发送多 isInsecting = NO 的通知
332- // TODO: 如果改为 isInsecting != targetOptions.preInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
333- return YES ; // isInsecting != targetOptions.preInsecting;
331+ // 重新计算,只要是 isInsecting 即可发送事件。如果没有设置 dataKey,回到前台会多发送一次曝光事件,所以屏蔽一下。
332+ if (targetOptions.dataKey ) {
333+ return isInsecting;
334+ }
335+ return NO ;
334336 }
335337 if (prevApplicationState != UIApplicationStateBackground &&
336338 UIApplication.sharedApplication .applicationState == UIApplicationStateBackground) {
337- // TODO: 先直接返回 YES,这样导致那些那些一开始没曝光的 item 会发送多 isInsecting = NO 的通知
338- // TODO: 如果改为 isInsecting != targetOptions.preInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
339- return YES ; // isInsecting != targetOptions.preInsecting ;
339+ // 直接返回 YES 会导致那些那些一开始没曝光的 item 会发送多 isInsecting = NO 的通知
340+ // 如果改为 isInsecting != targetOptions.preInsecting 会导致 cell 不复用的情况切换前后台无法触发事件,所以需要通过 updateOptionsPreProperties:fromOldOptions 同步一下 options,但是还是会存在之前非曝光过的被复用到曝光的时候,isInsecting != targetOptions.preInsecting 为 NO(isInsecting 必定为 NO,没曝光的 item 的 targetOptions.preInsecting 也是 NO),导致当前没有发送 isInsecting = NO 事件,所以最后改成 isDataKeyVisible,但是要求设置 dataKey 才能生效。
341+ return [[IntersectionObserverReuseManager shareInstance ] isDataKeyVisible: targetOptions.dataKey inScope: containerOptions.scope] ;
340342 }
341343 }
342344
343- // TODO: 可视状态发生变化
344- /*
345- if (containerOptions.measureWhenVisibilityChanged) {
345+ // 可视状态发生变化
346+ if (containerOptions.measureWhenVisibilityChanged && targetOptions.dataKey ) {
346347 BOOL targetViewVisible = [self isTargetViewVisible: targetOptions.targetView inContainerView: containerOptions.containerView];
347348 BOOL containerViewVisible = [self isContainerViewVisible: containerOptions.containerView];
348349 if (targetViewVisible != targetOptions.preVisible || containerViewVisible != containerOptions.preVisible ) {
349- return isInsecting != targetOptions.preInsecting;
350+ return isInsecting != targetOptions.preInsecting && ![[IntersectionObserverReuseManager shareInstance ] isDataKeyVisible: targetOptions.dataKey inScope: containerOptions.scope] ;
350351 }
351- }*/
352+ }
352353
353354 // 数据发生变化(或者复用)
354355 if (targetOptions.dataKey && targetOptions.dataKey .length > 0 && ![targetOptions.dataKey isEqualToString: targetOptions.preDataKey]) {
@@ -460,6 +461,19 @@ + (BOOL)isCGRectValidated:(CGRect)rect {
460461 return !CGRectIsNull (rect) && !CGRectIsInfinite (rect) && !isCGRectNaN && !isCGRectInf;
461462}
462463
464+ + (void )updateOptionsPreProperties : (IntersectionObserverTargetOptions *)options
465+ fromOldOptions : (IntersectionObserverTargetOptions *)oldOptions {
466+ if (options && oldOptions) {
467+ options.preRatio = oldOptions.preRatio ;
468+ options.preInsecting = oldOptions.preInsecting ;
469+ options.preVisible = oldOptions.preVisible ;
470+ options.preDataKey = oldOptions.preDataKey ;
471+ options.preData = oldOptions.preData ;
472+ options.preDataKey = oldOptions.preDataKey ;
473+ options.preReuseInsecting = oldOptions.preReuseInsecting ;
474+ }
475+ }
476+
463477@end
464478
465479
0 commit comments