199 lines
5.8 KiB
Objective-C
199 lines
5.8 KiB
Objective-C
//
|
|
// TouchAreaCacheManager.m
|
|
// YuMi
|
|
//
|
|
// Created by AI Assistant on 2025/1/13.
|
|
//
|
|
|
|
#import "TouchAreaCacheManager.h"
|
|
|
|
@implementation CachedTouchArea
|
|
|
|
- (instancetype)initWithBanner:(id)banner
|
|
bounds:(CGRect)bounds
|
|
interactiveBounds:(CGRect)interactiveBounds {
|
|
if (self = [super init]) {
|
|
_banner = banner;
|
|
_bounds = bounds;
|
|
_interactiveBounds = interactiveBounds;
|
|
_lastUpdateTime = [[NSDate date] timeIntervalSince1970];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (NSString *)description {
|
|
return [NSString stringWithFormat:@"CachedTouchArea: banner=%@, bounds=%@, interactiveBounds=%@, lastUpdate=%.2f",
|
|
self.banner, NSStringFromCGRect(self.bounds), NSStringFromCGRect(self.interactiveBounds), self.lastUpdateTime];
|
|
}
|
|
|
|
@end
|
|
|
|
@interface TouchAreaCacheManager ()
|
|
|
|
// 使用实例变量而不是重新声明属性
|
|
{
|
|
NSMutableDictionary *_bannerBoundsCache;
|
|
NSMutableArray *_interactiveAreas;
|
|
BOOL _cacheEnabled;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation TouchAreaCacheManager
|
|
|
|
#pragma mark - Singleton
|
|
|
|
+ (instancetype)sharedManager {
|
|
static TouchAreaCacheManager *instance = nil;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^{
|
|
instance = [[TouchAreaCacheManager alloc] init];
|
|
});
|
|
return instance;
|
|
}
|
|
|
|
#pragma mark - Initialization
|
|
|
|
- (instancetype)init {
|
|
if (self = [super init]) {
|
|
_bannerBoundsCache = [NSMutableDictionary dictionary];
|
|
_interactiveAreas = [NSMutableArray array];
|
|
_cacheEnabled = YES;
|
|
|
|
NSLog(@"🎯 TouchAreaCacheManager: 初始化完成");
|
|
}
|
|
return self;
|
|
}
|
|
|
|
#pragma mark - Public Methods
|
|
|
|
- (void)updateBannerBounds:(CGRect)bounds
|
|
interactiveBounds:(CGRect)interactiveBounds
|
|
forBanner:(id)banner {
|
|
if (!_cacheEnabled || !banner) {
|
|
return;
|
|
}
|
|
|
|
NSString *bannerKey = [NSString stringWithFormat:@"%p", banner];
|
|
CachedTouchArea *cachedArea = [[CachedTouchArea alloc] initWithBanner:banner
|
|
bounds:bounds
|
|
interactiveBounds:interactiveBounds];
|
|
|
|
// 更新缓存
|
|
_bannerBoundsCache[bannerKey] = cachedArea;
|
|
|
|
// 更新可交互区域列表
|
|
[self updateInteractiveAreas];
|
|
|
|
NSLog(@"🎯 TouchAreaCacheManager: 更新 Banner 缓存 - Key: %@, Bounds: %@, Interactive: %@",
|
|
bannerKey, NSStringFromCGRect(bounds), NSStringFromCGRect(interactiveBounds));
|
|
}
|
|
|
|
- (BOOL)isPointInInteractiveArea:(CGPoint)point {
|
|
if (!_cacheEnabled) {
|
|
return NO;
|
|
}
|
|
|
|
// 使用缓存快速检查
|
|
for (CachedTouchArea *cachedArea in _interactiveAreas) {
|
|
if (CGRectContainsPoint(cachedArea.interactiveBounds, point)) {
|
|
NSLog(@"🎯 TouchAreaCacheManager: 命中缓存 - 点 %@ 在可交互区域内", NSStringFromCGPoint(point));
|
|
return YES;
|
|
}
|
|
}
|
|
|
|
NSLog(@"🎯 TouchAreaCacheManager: 缓存未命中 - 点 %@ 不在可交互区域内", NSStringFromCGPoint(point));
|
|
return NO;
|
|
}
|
|
|
|
- (nullable id)bannerAtPoint:(CGPoint)point {
|
|
if (!_cacheEnabled) {
|
|
return nil;
|
|
}
|
|
|
|
// 使用缓存快速查找
|
|
for (CachedTouchArea *cachedArea in _interactiveAreas) {
|
|
if (CGRectContainsPoint(cachedArea.interactiveBounds, point)) {
|
|
NSLog(@"🎯 TouchAreaCacheManager: 找到 Banner - 点 %@ 对应的 Banner: %@",
|
|
NSStringFromCGPoint(point), cachedArea.banner);
|
|
return cachedArea.banner;
|
|
}
|
|
}
|
|
|
|
NSLog(@"🎯 TouchAreaCacheManager: 未找到 Banner - 点 %@", NSStringFromCGPoint(point));
|
|
return nil;
|
|
}
|
|
|
|
- (void)removeBannerFromCache:(id)banner {
|
|
if (!banner) {
|
|
return;
|
|
}
|
|
|
|
NSString *bannerKey = [NSString stringWithFormat:@"%p", banner];
|
|
CachedTouchArea *removedArea = _bannerBoundsCache[bannerKey];
|
|
|
|
if (removedArea) {
|
|
[_bannerBoundsCache removeObjectForKey:bannerKey];
|
|
[self updateInteractiveAreas];
|
|
|
|
NSLog(@"🎯 TouchAreaCacheManager: 移除 Banner 缓存 - Key: %@", bannerKey);
|
|
}
|
|
}
|
|
|
|
- (void)clearCache {
|
|
[_bannerBoundsCache removeAllObjects];
|
|
[_interactiveAreas removeAllObjects];
|
|
|
|
NSLog(@"🎯 TouchAreaCacheManager: 清空所有缓存");
|
|
}
|
|
|
|
- (NSString *)cacheStatistics {
|
|
NSMutableString *stats = [NSMutableString string];
|
|
[stats appendFormat:@"TouchAreaCacheManager 统计信息:\n"];
|
|
[stats appendFormat:@"- 缓存启用状态: %@\n", _cacheEnabled ? @"启用" : @"禁用"];
|
|
[stats appendFormat:@"- 缓存的 Banner 数量: %ld\n", (long)_bannerBoundsCache.count];
|
|
[stats appendFormat:@"- 可交互区域数量: %ld\n", (long)_interactiveAreas.count];
|
|
|
|
if (_bannerBoundsCache.count > 0) {
|
|
[stats appendString:@"- 缓存的 Banner 详情:\n"];
|
|
for (NSString *key in _bannerBoundsCache.allKeys) {
|
|
CachedTouchArea *area = _bannerBoundsCache[key];
|
|
[stats appendFormat:@" [%@] %@\n", key, area.description];
|
|
}
|
|
}
|
|
|
|
return stats;
|
|
}
|
|
|
|
- (void)debugPrintCache {
|
|
NSLog(@"🎯 TouchAreaCacheManager 调试信息:");
|
|
NSLog(@"%@", [self cacheStatistics]);
|
|
}
|
|
|
|
#pragma mark - Private Methods
|
|
|
|
- (void)updateInteractiveAreas {
|
|
[_interactiveAreas removeAllObjects];
|
|
|
|
// 重新构建可交互区域列表
|
|
for (CachedTouchArea *cachedArea in _bannerBoundsCache.allValues) {
|
|
if (!CGRectIsEmpty(cachedArea.interactiveBounds)) {
|
|
[_interactiveAreas addObject:cachedArea];
|
|
}
|
|
}
|
|
|
|
NSLog(@"🎯 TouchAreaCacheManager: 更新可交互区域列表 - 数量: %ld", (long)_interactiveAreas.count);
|
|
}
|
|
|
|
#pragma mark - Public Properties
|
|
|
|
- (NSMutableDictionary *)bannerBoundsCache {
|
|
return _bannerBoundsCache;
|
|
}
|
|
|
|
- (NSMutableArray *)interactiveAreas {
|
|
return _interactiveAreas;
|
|
}
|
|
|
|
@end
|