Files
peko-ios/YuMi/Modules/YMRoom/View/AnimationView/TouchAreaCacheManager.m

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