Compare commits

...

95 Commits

Author SHA1 Message Date
edwinQQQ
cd9c2ea15a 优化 XPRoomMessageContainerView 和 XPRoomMessageTableViewCell,改进消息处理逻辑,增加行高预计算方法,减少不必要的视图更新,提升性能和用户体验。同时,调整 UITableView 的约束更新方式,确保更高效的布局管理。 2025-08-21 19:22:20 +08:00
edwinQQQ
b9de95b4e6 移除 XPRoomViewController 和 RoomAnimationView 中的调试代码,提升代码整洁性和可维护性。 2025-08-21 18:54:04 +08:00
edwinQQQ
1bfc989fe9 移除 RoomAnimationView 中的调试背景色设置,提升代码整洁性和可维护性。 2025-08-21 18:25:46 +08:00
edwinQQQ
09a2b2f02b 优化 XPRoomPresenter、XPRoomViewController 和 XPMessageRemoteExtModel,移除冗余代码,增强 NIM 聊天室成员信息获取逻辑,新增房间类型和模式属性,提升代码可维护性和用户体验。同时,重构定时器管理和消息发送逻辑,确保功能的稳定性和一致性。 2025-08-21 18:23:18 +08:00
edwinQQQ
49975b5dc1 优化 AdvertiseModel 和 XPRoomViewController,移除不必要的注释,新增上麦请求弹窗定时器,增强消息处理逻辑,提升代码可维护性和用户体验。同时,更新本地化字符串,支持新的上麦邀请功能。 2025-08-21 16:36:46 +08:00
edwinQQQ
267650759c 新增 versionType 属性以支持新旧版本兼容,更新 XPRoomPresenter 和 XPMessageRemoteExtModel,优化 micButton 处理逻辑,增强消息发送功能的稳定性和可维护性。 2025-08-20 19:06:49 +08:00
edwinQQQ
0b89480a77 优化 RoomAnimationView 和 PIGiftBravoGiftBroadcastView 的内存管理,新增动画控制方法以提升用户体验。更新了连击视图的清理逻辑,确保资源的正确释放,避免内存泄漏。同时,新增 NetImageView 的取消加载功能,增强图片加载的灵活性和性能。重构相关方法以支持新的逻辑流程,提升代码可维护性和可读性。 2025-08-20 18:07:34 +08:00
edwinQQQ
e0466700b5 新增手势优化和触摸区域缓存管理模块,提升了 Banner 交互性能和用户体验。新增 GestureOptimizer 和 TouchAreaCacheManager,分别负责手势识别优化和触摸区域信息缓存。更新 RoomAnimationView 和 BravoGiftBannerView,集成新模块以优化手势处理逻辑,确保更流畅的用户交互。同时,重构相关方法以支持新的逻辑流程,提升代码可维护性和可读性。 2025-08-20 16:37:48 +08:00
edwinQQQ
be52c53b2f 新增 BannerScheduler 模块,统一管理 V2 Banner 的播放队列和状态,优化了 Banner 播放逻辑,支持优先级排序、状态控制和代理模式。更新 RoomAnimationView,集成 BannerScheduler,重构了 Banner 添加和播放逻辑,提升了代码可维护性和用户体验。同时,新增 BannerScheduler 的单元测试,确保功能的正确性和稳定性。 2025-08-20 14:19:32 +08:00
edwinQQQ
aeb9fcd30e 新增 micButton 状态表格文档,详细记录了 micButton 在不同用户状态下的显示和可用性,以及状态变化的关键时序和同步机制。同时,新增 GiftComboManager 线程优化总结文档,优化了线程处理和网络请求逻辑,提升了代码性能和可维护性。更新了 CountdownRingView 和 GiftComboView 的内存管理和状态处理逻辑,确保资源的正确释放和避免内存泄漏。 2025-08-19 19:33:26 +08:00
edwinQQQ
6d4061bea5 优化 AppDelegate+ThirdConfig 中 NIMSDK 配置,确保生产环境启用 HTTPS,新增 CDN 统计回调和最小时间间隔设置,提升代码可维护性和功能完整性。同时,重构 GiftComboManager,新增后台处理队列和网络处理队列,优化定时器和请求处理逻辑,确保 UI 回调在主线程执行,增强用户体验和代码可读性。 2025-08-19 16:33:22 +08:00
edwinQQQ
83e26bdbae 重构 GiftComboManager,移除 giftComboQueue,新增 networkQueue 和 uiQueue,优化队列处理逻辑,提升代码可维护性和可读性。同时,更新相关方法以支持新的队列结构,确保连击效果的准确处理。 2025-08-19 15:30:39 +08:00
edwinQQQ
c551146afd 优化 GiftComboManager 接口,移除废弃方法并统一配置流程,提升代码可维护性和可读性。同时,更新 XPRoomViewController 和 XPSendGiftView 中的状态检查逻辑,确保连击状态的准确性。新增 GiftComboManager 调用方更新总结文档,记录了接口变更和优化效果。 2025-08-19 14:39:27 +08:00
edwinQQQ
961edefe4a 新增连击计数逻辑修正总结文档,详细记录了连击计数的修正目标、发现的问题及其根源,主要修改内容包括 GiftComboManager、GiftComboView 和 XPSendGiftView 的接口优化和逻辑调整,确保连击计数基于 API 成功回调,提升了用户体验和代码可维护性。同时,更新了相关方法以支持新的逻辑流程和状态管理。 2025-08-19 14:12:51 +08:00
edwinQQQ
f1daa16e59 更新 Podfile 中 NIMSDK_LITE 版本至 '~> 10.9.40',并在多个文件中新增日志记录功能以优化连击消息处理,增强调试能力。同时,新增连击计数重置通知和相关方法,提升用户体验和代码可维护性。 2025-08-18 19:02:47 +08:00
edwinQQQ
9688e4413b 新增 GiftComboManager 及相关模块的重构,优化了连击功能的接口,建立了清晰的分层架构,统一了并发模型,提升了可维护性和可测试性。同时,新增了 GiftComboConfig、GiftComboTransport 和 GiftComboUIAdapter 模块,简化了接口并提供了更好的错误处理机制,确保向后兼容性。 2025-08-18 16:24:45 +08:00
edwinQQQ
79f6f45bc1 新增礼物动画处理日志记录功能,优化了 GiftAnimationManager 和 GiftComboManager 中的连击计数逻辑,确保连击计数的有效性和准确性。同时,增强了日志输出,便于调试和监控动画处理状态,提升用户体验。 2025-08-18 14:01:57 +08:00
edwinQQQ
3f97b0293e 新增 Banner 手势优化实施总结文档,记录了在 RoomAnimationView 中对 banner 手势系统的优化过程,包括手势识别器的重新设计、区域划分逻辑、tap 手势处理逻辑及交互区域检查等。同时,优化了多个视图中的通知处理逻辑,确保手势事件的准确传递与处理,提升用户交互体验。 2025-08-15 19:34:25 +08:00
edwinQQQ
84e146277a 在 RoomAnimationView 中新增触摸事件处理逻辑,确保在没有 banner 显示或 banner 容器不可见时不接收触摸事件,提升用户交互体验。同时,优化了 banner 区域的触摸点检测逻辑,增强代码可读性。 2025-08-15 11:41:45 +08:00
edwinQQQ
5192d58b07 优化 NIMSDK 和 SudSDK 的初始化逻辑,新增从配置中获取 appKey 和 appId 的功能,提升代码灵活性和可维护性。同时,修正 sudKey 的属性名称以保持一致性。 2025-08-14 18:48:47 +08:00
edwinQQQ
cd4710ecf6 优化公共房间管理器的进入逻辑,新增延迟进入公共房间的功能以改善用户体验。同时,移除 RoomAnimationView 中的调试视图相关代码,提升代码整洁性和可维护性。 2025-08-14 18:36:23 +08:00
edwinQQQ
edf844c1e8 新增公共房间管理器的初始化逻辑,并在登录和信息补全成功后调用初始化方法;在相关文件中引入公共房间管理器的头文件以支持新功能。同时,优化了公共房间管理器的状态检查和日志输出,提升代码可读性和功能性。 2025-08-14 18:04:38 +08:00
edwinQQQ
b1e46f6d28 fix(消息容器): 修复多语言文本截断问题并优化布局
统一文本布局策略,修复阿拉伯语、中文等文本显示不全问题
优化约束逻辑,移除冗余计算,提升性能
添加测试用例验证多语言文本布局
2025-08-14 17:56:56 +08:00
edwinQQQ
2a99d2238f feat(文本布局): 统一文本尺寸计算并支持RTL文本
- 使用YYTextLayout统一处理所有文本尺寸计算,提高RTL文本精度
- 根据文本方向自动配置截断类型(RTL文本使用Start,LTR使用End)
- 移除阿拉伯文本的额外高度调整,依赖YYTextLayout的精确计算
- 新增测试类验证纯阿拉伯文本、混合文本和长文本的布局效果
- 添加README文档说明统一文本布局的实现细节和优势
2025-08-14 14:06:35 +08:00
edwinQQQ
3da0148ad1 在多个视图的 dismissBanner 方法中新增日志输出,以便于调试和监控动画完成状态;在 RoomAnimationView 中新增 ensureDebugViewsExist 方法,确保调试视图的存在并优化调试信息的输出;在 inserBannerModelToQueue 方法中添加参数验证和调试信息,提升代码的可读性和调试能力。 2025-08-13 18:16:46 +08:00
edwinQQQ
9206b4be45 优化公共房间管理器的消息处理逻辑,新增 handleFirst_106 方法以处理特定类型的消息转发,提升代码可读性和功能性。同时,移除冗余代码,确保代码整洁性。 2025-08-13 17:21:48 +08:00
edwinQQQ
2867c7ddb5 新增公共房间消息转发通知常量,并在相关管理器和视图控制器中实现消息转发逻辑,优化公共房间消息处理流程,提升代码可读性和功能性。 2025-08-12 18:50:43 +08:00
edwinQQQ
505472b073 在 RoomAnimationView.m 中新增对 MSRoomOnLineView 的引用,并优化了手势识别逻辑,以支持对该视图的直接交互。此更改提升了用户体验和代码的可读性。 2025-08-12 18:50:36 +08:00
edwinQQQ
64cfb1b10e 更新Banner区域手势系统,新增区域化手势识别,优化用户交互体验;调整Banner高度,确保适配性;移除冗余代码,提升代码整洁性和可维护性;更新相关文档以支持新手势系统的集成和使用。 2025-08-12 17:44:32 +08:00
edwinQQQ
9b2ebb796f 更新公共房间管理器的日志输出,改为使用消息的原始附件内容;优化动画播放逻辑,使用 switch 语句替代多个 if-else 语句以提高可读性;移除与守护星球相关的消息处理逻辑,确保代码整洁性;更新多个本地化字符串文件,移除与守护星球相关的条目,确保语言支持的一致性。 2025-08-12 14:51:13 +08:00
edwinQQQ
6fd831ff42 删除与星级厨房相关的所有图像资源及其配置文件,包括 room_star_kitchen.imageset 及其内容;在 AttachmentModel.h 中移除与星级厨房相关的枚举值,确保代码整洁性;更新多个本地化字符串文件,移除与 XPRoomStarKitchenBannerView 相关的条目,确保语言支持的一致性。 2025-08-12 14:07:38 +08:00
edwinQQQ
259ac3e2d3 删除与房间塔罗相关的图像资源及其配置文件,包括 room_tarrow_banner_bg 和 room_tarrow_banner_h5_bg 的所有内容;在 NIMSDKManager.h 和 NIMSDKManager.m 中添加空行以提升代码可读性;更新多个本地化字符串文件,移除与 XPRoomTarrowBannerView 相关的条目,确保语言支持的一致性。 2025-08-12 13:53:12 +08:00
edwinQQQ
446e172939 新增飘屏组件分析文档和新Banner组件架构设计,详细描述了飘屏组件的共同特征、抽象方案及其优势,提供了基类和子类的设计方案,增强了代码的可维护性和扩展性。同时,更新了相关文档以支持新架构的集成和使用。 2025-08-12 11:16:28 +08:00
edwinQQQ
c0bc29486f 新增连击状态管理功能,包含强制重置连击状态的方法和应用生命周期保护;在 XPSendGiftView 和 GiftComboManager 中实现相关逻辑,确保 UI 状态与连击状态一致;注册通知以处理连击状态的强制重置,增强用户体验和系统稳定性。 2025-08-11 14:51:57 +08:00
edwinQQQ
1fb6cadabf 新增公共房间管理器 PublicRoomManager,负责管理用户进入公共聊天房间的逻辑;在 ClientConfig.m 中添加对公共房间管理器的配置更新通知;在多个文件中集成公共房间管理器,确保用户信息更新和状态管理的正确性;更新相关文档以提供使用指南和集成说明。 2025-08-08 17:01:59 +08:00
edwinQQQ
e3dfd8cb0a Version update 2025-07-15 14:59:56 +08:00
edwinQQQ
96c44cb032 删除阿拉伯语首充相关图像资源及其配置文件;在 UIImage+Utils.m 中优化语言图像处理逻辑,新增对葡萄牙语的支持;在多个文件中添加对葡萄牙语的支持,包括本地化字符串和 InfoPlist 配置;更新 UI 组件以适应新的语言设置,确保用户界面的一致性和可用性。 2025-07-15 14:35:05 +08:00
edwinQQQ
16f9041ba9 chore: 更新 .gitignore 文件,移除不必要的包文件类型;新增邮箱验证码登录流程和 OAuth/Ticket 认证系统 API 文档;更新勋章相关逻辑,优化用户信息获取失败处理;调整勋章展示逻辑,支持多等级高亮功能。 2025-07-14 17:37:10 +08:00
edwinQQQ
99db078b62 feat(勋章): 新增多等级高亮功能并优化勋章展示逻辑
refactor(勋章排行): 重构排行榜分页加载和刷新逻辑

fix(会话): 优化官方账号判断逻辑和跳转处理

style(UI): 调整勋章排行榜和游戏菜单UI布局

chore: 更新Podfile配置和bitcode框架列表
2025-07-03 19:35:17 +08:00
edwinQQQ
e32e5653fd change page item limit 2025-07-03 18:04:56 +08:00
edwinQQQ
8a096239da 新增 next-chat.mdc 文件以定义对话上下文的规则;在 Assets.xcassets 中添加多个图像资源及其对应的 Contents.json 文件;更新 AttachmentModel.h 中的枚举值以修正飘屏消息类型;在 SessionViewController.h 和 SessionViewController.m 中添加 userInfo 属性并调整相关逻辑;在 SessionListViewController.h 和 SessionListViewController.m 中优化会话列表的展示逻辑;在多个模型和视图文件中进行小幅调整以提升代码可读性和一致性。 2025-07-02 15:52:48 +08:00
edwinQQQ
f0dad8886f 更新 MedalsModel.h 和 MedalsModel.m,新增 expireDateString 方法以格式化过期时间;在 MedalsCollectionViewCell.m 和 MedalsCyclePagerCell.m 中优化 MP4 和图片的显示逻辑,增强降级处理;在 MedalsDetailView.m 中更新勋章显示逻辑,使用新的 URL 优先级;在 MedalsLevelIndicatorView.h 和 MedalsLevelIndicatorView.m 中新增重置等级指示器的方法;在 MedalsWearingControlCollectionViewCell.m 和 MedalsWearingListCollectionViewCell.m 中实现新的显示逻辑,支持 MP4 和图片的降级处理;在 NSString+Utils.h 和 NSString+Utils.m 中新增图片格式验证方法,提升代码健壮性和可读性。 2025-06-27 19:56:03 +08:00
edwinQQQ
0d6570a086 更新 .vscode/settings.json 文件,新增拼写检查词汇 "Defalut" 和 "MAXFLOAT";在 XPRoomSendTextView.m 中调整约束逻辑,确保 editTextFiled 和 imageButton 的布局正确;在 XPRoomMessageTableViewCell.m 中优化消息内容标签的约束,确保气泡和内容标签的布局一致性,增强代码可读性和健壮性。 2025-06-27 16:15:12 +08:00
edwinQQQ
f52af5d620 更新 YUMIHtmlUrl.h 和 YUMIHtmlUrl.m,新增首充相关的 URL 类型和路径;在 FeedBackViewController.h 和 FeedBackViewController.m 中,调整属性类型为强引用以增强内存管理;重构 FeedBackViewController 的视图设置逻辑,添加子视图的初始化方法以提高代码可读性;移除不再使用的 FeedBackViewController.xib 文件,优化项目结构;在 XPGiftBarView.h 和 XPGiftBarView.m 中,移除首充按钮相关代码,替换为新的首充视图逻辑;更新 XPWebViewController.h 和 XPWebViewController.m,调整 webview 属性为可写以支持动态更新;在 FirstRechargeManager.m 中,优化首充状态检查逻辑,确保在调试模式下始终显示首充信息。 2025-06-27 11:33:16 +08:00
edwinQQQ
86094da26f 添加首充管理功能,新增 FirstRechargeManager 和相关模型以支持首充监控;在多个模块中集成首充监控逻辑,确保在登录和页面加载时正确启动和停止监控;移除不再使用的首充相关代码,优化代码结构和可读性。 2025-06-26 11:08:21 +08:00
edwinQQQ
6f59274ca0 更新 XPRoomMessageParser.m,优化房间表情属性创建逻辑,简化代码结构;新增 createImageAttribute:size: 方法以支持自定义图像大小,增强代码可读性和灵活性;调整图像处理逻辑,确保在不同条件下正确展示表情图像,保持代码一致性。 2025-06-25 15:22:09 +08:00
edwinQQQ
e01148a3a9 更新 pi_area_info.json,新增突尼斯地区信息;更新 Assets.xcassets 中的 Contents.json,修复幸运数字图像的文件名;移除多个文件中的调试代码以优化勋章展示逻辑,保持代码结构一致性;在 XPRoomFaceTool.m 中改进表情文件加载路径和错误处理,增强代码健壮性;在 XPRoomFaceViewController.m 中添加消息发送错误日志;更新 XPRoomMessageContainerView.m 和 XPRoomMessageParser.m,调整索引类型以提高代码一致性。 2025-06-25 14:29:23 +08:00
edwinQQQ
1190e0f6d9 更新 XPMineUserInfoHeaderView.m,调整勋章显示逻辑,允许最多显示 10 个勋章;在 UserRoomCardViewController.m 中新增 UserRoomCardMedalCell 以支持勋章的展示,优化勋章区域的高度计算和更新逻辑,保持代码结构一致性。 2025-06-24 18:50:45 +08:00
edwinQQQ
c5d966317b 更新 XPMineUserInfoHeaderView.m,新增 UIScrollView 作为勋章展示的容器,调整勋章 StackView 的布局逻辑以适应 ScrollView,更新勋章显示方法以处理勋章的内容尺寸,保持代码结构一致性。 2025-06-24 17:10:11 +08:00
edwinQQQ
6573c0f6fe 更新 XPMineUserInfoHeaderView.m,新增 medalsStackView 和 medalMP4Views 属性以支持勋章展示逻辑;添加 medalsHeight 方法计算勋章高度;实现 setupMedalsArea 方法以配置勋章视图;更新 updateMedalsDisplay 方法以处理勋章的 MP4 和图片展示,保持代码结构一致性。同时,更新 .vscode/settings.json 文件以添加拼写检查词汇。 2025-06-24 16:45:26 +08:00
edwinQQQ
7810057542 更新 MedalsViewController.m,移除调试代码以优化勋章展示逻辑;在 XPMineUserInfoHeaderView.m 中新增 medalsStackView 和 userMedals 属性以支持用户勋章的显示;在 UserInfoModel.m 中更新 medalsPic 属性以增强模型的兼容性,保持代码结构一致性。 2025-06-24 15:42:56 +08:00
edwinQQQ
059305d3df 更新 MedalsViewController.m,新增其他用户勋章的显示逻辑,包括 MP4 播放和图片展示,优化相关方法以提升用户体验,保持代码结构一致性。同时,更新 MedalsWearingControlCollectionViewCell.m,移除调试背景颜色设置,保持代码整洁。 2025-06-24 15:01:33 +08:00
edwinQQQ
a15d6b34ed 更新 MedalsRankViewController.m,添加勋章排行视图的点击手势和回调处理,优化用户交互体验,保持代码结构一致性。 2025-06-23 19:09:45 +08:00
edwinQQQ
6d0122f3d1 更新 MedalsViewController.m,调整背景约束和底部勋章列表高度以适应不同显示类型,优化底部背景图像的拉伸处理,保持代码结构一致性。 2025-06-23 18:57:05 +08:00
edwinQQQ
286e68b5e3 更新 MedalsCyclePagerCell 和 MedalsViewController 以优化勋章展示和自动轮播功能,调整可见性管理逻辑,确保在视图切换时正确处理播放状态,保持代码结构一致性。 2025-06-23 18:43:17 +08:00
edwinQQQ
c0500397b6 删除不再使用的资源文件,包括多个图像集和其对应的 Contents.json 文件,更新 MedalsModel.h 和 MedalsModel.m 以支持使用勋章的类型,新增 MedalsCyclePagerCell 组件以优化勋章展示,保持代码结构一致性。 2025-06-23 16:36:39 +08:00
edwinQQQ
f62af24c48 更新勋章相关模型和视图,添加对使用勋章的支持,优化可见性管理和状态更新逻辑,保持代码结构一致性。 2025-06-23 15:55:11 +08:00
edwinQQQ
a72c010b56 新增勋章 VIP 控制相关的资源,包括 medals_control_vip4、medals_control_vip6、medals_control_vip7 和 medals_control_vip9 的 Contents.json 文件及其对应的 vip@3x.png 图片,保持代码结构一致性。 2025-06-23 14:29:08 +08:00
edwinQQQ
143ad115bc 新增勋章排行相关的 UI 组件,包括 MedalsRankViewController、MedalsRankTopView 和 MedalsRankListCell,更新 MedalsViewController 以支持展示其他用户的勋章信息,优化相关逻辑以提升用户体验,保持代码结构一致性。 2025-06-20 18:44:20 +08:00
edwinQQQ
4c76813273 新增勋章相关的 UI 组件,包括 MedalsWearingViewController、MedalsWearingControlCollectionViewCell 和 MedalsWearingListCollectionViewCell,更新相关逻辑以支持勋章的使用状态管理和展示,保持代码结构一致性。 2025-06-19 19:22:56 +08:00
edwinQQQ
da8d88347e 更新 Api+Medals.m 中的请求路径为 "medal/square",修改 MedalsViewController.m 中的导航栏标题以支持勋章广场,新增本地化字符串 "20.20.61_text_10" 以表示勋章广场,保持代码结构一致性。 2025-06-19 14:09:36 +08:00
edwinQQQ
06fecf1bf4 调整 MedalsDetailView.m 中的高度约束以适应内容,优化 MedalsLevelIndicatorView.m 中的图片视图创建和加载逻辑,新增缓存图片 URL 属性以支持延迟加载,确保代码结构一致性。 2025-06-19 11:49:25 +08:00
edwinQQQ
c978a8c355 优化 UIImage+Utils.m 中的灰度图像处理逻辑,调整 MedalsLevelIndicatorView.m 中的图片视图约束和间距,更新图像加载逻辑以使用裁剪后的图像,保持代码结构一致性。 2025-06-19 11:28:07 +08:00
edwinQQQ
a0fc15fefd 更新 MedalsCollectionViewCell 和 MedalsDetailView 以支持带图片的等级指示器,新增 MedalsLevelIndicatorType 枚举以区分指示器类型,优化手势识别功能,确保用户体验流畅,保持代码结构一致性。 2025-06-18 19:47:39 +08:00
edwinQQQ
c1b9dd3d9f 新增手势识别功能以处理背景和内容区域的点击事件,确保用户体验流畅。重写 removeFromSuperview 方法以停止 MP4 播放并释放资源,添加 dealloc 方法以确保资源正确释放,保持代码结构一致性。 2025-06-18 19:00:01 +08:00
edwinQQQ
887bb19056 新增 MedalsDetailView 和 MedalsLevelIndicatorView 组件,更新 MedalsCollectionViewCell 以支持 MP4 播放控制和可见性管理,优化相关逻辑以提升用户体验,保持代码结构一致性。 2025-06-18 18:31:13 +08:00
edwinQQQ
413b2c6944 新增等级指示器视图和容器视图,更新 MedalsCollectionViewCell 以集成等级指示器功能,支持等级选择回调。更新 .vscode/settings.json 文件以包含新组件 QGVAP 的配置,保持代码结构一致性。 2025-06-18 17:11:13 +08:00
edwinQQQ
89d9b57dea 更新 Podfile 以注释掉不再使用的 ZLCollectionViewFlowLayout 依赖,同时新增勋章相关功能,包括勋章使用、广场、排行和管理列表的 API 方法,新增 MedalsModel、MedalsPresenter 和 MedalsViewController 相关文件,保持代码结构一致性。新增勋章相关的 UI 组件和本地化字符串支持。 2025-06-18 16:28:13 +08:00
edwinQQQ
8c0276a208 优化数组操作,新增 NSMutableArray 的安全方法,包括安全移除、插入和替换对象,确保在索引超出范围时不发生崩溃。更新相关文件以使用新方法,保持代码结构一致性。 2025-06-16 17:30:20 +08:00
edwinQQQ
68ce148abb 新增勋章相关功能,包括勋章使用、广场、排行和管理列表的 API 方法,更新 Api+Mine.h 和 Api+Mine.m 文件以支持新功能。同时,新增 BaseModelVo.h 和 BaseModelVo.m 文件以定义勋章相关数据模型,并在 UserInfoModel.h 中引入 BaseModelVo。保持代码结构一致性。 2025-06-11 15:00:02 +08:00
edwinQQQ
4416e9f9c8 新增 VIP 和转账功能的 URL 路径,更新相关文件以使用 XPWebViewController 替代 VIPCenterViewController,保持代码结构一致性。调整公屏礼物消失的显示内容。 2025-06-11 11:27:00 +08:00
edwinQQQ
6e814f76cb 移除与 Agora 相关的 SDK 代码和引用,更新 Podfile 以删除不再使用的依赖项,调整房间初始化逻辑以使用 TRTC 引擎。保持代码结构一致性。 2025-06-10 16:07:59 +08:00
edwinQQQ
443e1a4332 新增分享功能的多个方法,包括提取 URL 和剩余字符串、强制关闭分享弹窗,以及分享内容的构建逻辑。更新 ShareProvider 类以支持新的初始化方法和不同分享类型的内容提供。保持代码结构一致性。 2025-06-09 16:39:32 +08:00
edwinQQQ
8dab721de9 在 SessionListViewController 中添加了对最近会话的日志输出。在 LuckyGiftWinningBannerView 和 BravoGiftBannerView 中引入了可配置的显示时间,注释掉了不再使用的代码。在 XPRoomFunctionContainerView 中优化了 hitTest 方法以增强用户交互体验,确保子视图的点击响应逻辑更加清晰。更新了 MicroView 中的表情加载逻辑,增加了对下载失败情况的处理。保持代码结构一致性。 2025-06-09 15:52:34 +08:00
edwinQQQ
5985b5701e 新增排行榜功能,更新 YUMIHtmlUrl.h 和 YUMIHtmlUrl.m 文件以支持新路径 kRankV2,调整 XPNewHomeViewController.m 中的相关逻辑以使用新排行榜链接,更新 XPMineUserInfoViewController.m 和 XPMineUserInfoHeaderView.m 文件以修复用户信息展示。保持代码结构一致性。 2025-06-03 11:00:10 +08:00
edwinQQQ
5ff62bafee 优化房间退出逻辑,更新退出事件处理,修复房间类型判断。更新分享功能以支持内容参数。调整游戏状态处理,重置当前游戏ID。 2025-05-29 11:50:00 +08:00
edwinQQQ
ca25ed14ac 新增搜索视图的 UITextFieldDelegate 实现,优化搜索逻辑,添加 isReturnKey 属性以区分回车触发的搜索。更新 GiftComboManager 和 HttpRequestHelper 中的错误处理逻辑,修复条件判断中的错误。移除不再使用的代码。版本号更新至1.0.28.2。 2025-05-27 16:02:11 +08:00
edwinQQQ
e5c8baad34 更新版本号至1.0.28.1,移除调试代码,新增隐私信息文件,优化房间消息处理逻辑,增加网络检测相关功能,调整部分接口参数,修复UI问题,更新本地化字符串,更新 SUD SDK 2025-05-26 15:24:31 +08:00
edwinQQQ
c765e78ec6 更新资源文件,替换部分图片文件名,调整图片内容,更新版本号至1.0.28。增加新的图片资源并删除不再使用的图片文件。 2025-05-23 14:43:39 +08:00
edwinQQQ
95e3e2601f 新增自定义麦位布局和房间麦位选择视图,优化房间用户界面,更新本地化字符串,调整部分UI组件约束。版本号更新至20.20.65。 2025-05-22 18:04:39 +08:00
edwinQQQ
0d01b1e6e9 更新事件中心模块,新增 HomeBannerInfoModel 相关功能,优化事件列表数据处理,调整时间选择器逻辑,修复部分 UI 问题,更新本地化字符串。版本号更新至20.20.64。 2025-05-22 11:50:53 +08:00
edwinQQQ
298a7e80c4 优化内购交易重试机制,增加交易重试次数记录,完善后台任务处理,更新相关API接口,调整UI组件约束,修复部分UI问题,更新本地化字符串。版本号更新至20.20.63。 2025-05-21 18:59:32 +08:00
edwinQQQ
b688962559 更新事件创建功能,新增金钱加载接口,优化事件时长选择器,调整UI组件约束,修复部分UI问题,更新本地化字符串。增加删除事件功能的提示确认。版本号更新至20.20.62。 2025-05-20 18:49:04 +08:00
edwinQQQ
353491f56f 更新活动中心模块,新增事件配置模型及相关API接口,优化事件列表展示,修复部分UI问题,更新本地化字符串,调整部分UI组件。删除不再使用的视图控制器。版本号更新至20.20.61。 2025-05-19 19:27:53 +08:00
edwinQQQ
a99e650d45 新增活动详情页相关功能,包括事件模型、API接口、UI组件及相关资源文件。更新版本号至20.20.60。 2025-05-15 16:24:43 +08:00
edwinQQQ
bd2e5e380f 增加选择房间 vc 2025-05-12 18:53:42 +08:00
edwinQQQ
2c5a1a289e 创建事件 create event UI 2025-05-12 17:37:58 +08:00
edwinQQQ
ffdfa121f9 新增 JoyPlay 游戏支持 2025-05-08 17:10:54 +08:00
AI Health Developer
07ebee2fc1 修正部分体验问题; 房间表情新增 api; 房间表情新增 svga 支持以及持久化缓存 2025-05-07 19:30:50 +08:00
AI Health Developer
69863a91ff feat(EventCenter): 添加活动中心模块
新增活动中心模块,包括官方活动、活动广场和我的活动三个页面。支持活动列表展示、倒计时功能及创建活动按钮。优化了页面切换和UI交互体验。
2025-05-06 16:45:34 +08:00
AI Health Developer
a9538c61ff 修正表情播放问题 2025-04-28 18:28:59 +08:00
AI Health Developer
41aae87dd6 修改 UI 需求和问题 2025-04-28 14:52:00 +08:00
AI Health Developer
ff365e8ae4 修正审核问题,适配后端修改 2025-04-25 15:54:30 +08:00
AI Health Developer
40311a1d85 完成 1.0.26 需求 2025-04-21 13:52:13 +08:00
AI Health Developer
2caa476640 temp save 2025-04-11 10:46:17 +08:00
745 changed files with 56850 additions and 14229 deletions

1
.bevel/VERSION Normal file
View File

@@ -0,0 +1 @@
1.3.0

0
.bevel/do_not_share/.env Normal file
View File

File diff suppressed because it is too large Load Diff

Binary file not shown.

1
.bevel/do_not_share/port Normal file
View File

@@ -0,0 +1 @@
57817

View File

@@ -0,0 +1 @@
# this functions like a .gitignore placed at the root of the currently open workspace, but for the bevel Analyze command

View File

@@ -0,0 +1,75 @@
{
"supportedFileExtensions": {
"COBOL": [
".cbl",
".cob",
".ccp",
".cobol",
".cpy",
".cpb",
".cblcpy",
".mf"
],
"CSharp": [
".cs"
],
"Kotlin": [
".kt",
".kts"
],
"TypeScript": [
".ts",
".tsx"
],
"JavaScript": [
".js",
".jsx"
],
"Python": [
".py"
],
"Ruby": [
".rb"
],
"Java": [
".java"
],
"Go": [
".go"
],
"Rust": [
".rs"
],
"Scala": [
".scala"
],
"Swift": [
".swift"
],
"C": [
".c",
".h"
],
"Cpp": [
".cpp",
".h",
".hpp"
],
"Perl": [
".pl",
".pm",
".pod"
],
"PHP": [
".php"
],
"Pascal": [
".pas",
".dfm",
".inc"
],
"Dart": [
".dart"
]
}
}

View File

@@ -0,0 +1,5 @@
{
"selectedLLM": "AZURE_OPENAI",
"endpoint": "https://[CUSTOM ORGANIZATION LINK].cognitiveservices.azure.com",
"deploymentName": "gpt-4o-mini"
}

View File

@@ -0,0 +1,7 @@
---
description:
globs:
alwaysApply: false
---
本次对话的上下文已经太长了,我打算关掉并重新开一个新的会话。
你有什么想对你的继任者说的,以便它能更好的理解你当前的工作并顺利继续?

6
.gitignore vendored
View File

@@ -82,12 +82,6 @@ iOSInjectionProject/
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.war
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

View File

45
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,45 @@
{
"cSpell.ignoreWords": [
"DJDKMIMOM",
"Strongify",
"Weakify",
"instancetype",
"nonatomic"
],
"cSpell.words": [
"autoreleasepool",
"Autoresizing",
"BGMP",
"Bugly",
"Commont",
"Contol",
"CPSVGA",
"Defalut",
"erban",
"exper",
"Headwear",
"HWDMP",
"ifndef",
"Interitem",
"kindof",
"MAXFLOAT",
"Moli",
"MSRTL",
"NIMSDK",
"Nonnull",
"NSEC",
"NSURL",
"objc",
"Offical",
"Podfile",
"Procotol",
"QGVAP",
"Subview",
"subviews",
"Superview",
"Uids",
"XNDJTDD"
],
"C_Cpp.errorSquiggles": "disabled",
"bevel.java": "/Users/edwinqqq/.trae/extensions/bevel-software.bevel-1.3.0-universal/backend/amazon-corretto-17.jdk/Contents/Home/bin/java"
}

26
DOC/log.txt Normal file
View File

@@ -0,0 +1,26 @@
-[XPRoomViewController dealloc] [Line 314]🔄 XPRoomViewController: 清理 RoomAnimationView
-[RoomAnimationView removeItSelf] [Line 193]<5D><> RoomAnimationView: 开始销毁
-[RoomAnimationView cleanupAllSubviews] [Line 239] 清理所有子视图
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: BravoGiftBannerView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: BravoGiftWinningFlagView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: BravoGiftWinningFlagView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: BravoGiftWinningFlagView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: BravoGiftWinningFlagView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: BravoGiftWinningFlagView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: NetImageView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: NetImageView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: NetImageView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: NetImageView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: NetImageView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: NetImageView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 250]<5D><> 标记移除视图: NetImageView (从容器: XPRoomAnimationHitView)
-[RoomAnimationView cleanupAllSubviews] [Line 265]🔄 所有子视图清理完成
-[RoomAnimationView removeItSelf] [Line 220]<5D><> 清理 BannerScheduler
-[RoomAnimationView cleanupGestureRecognizers] [Line 3690]🔄 清理手势识别器
-[RoomAnimationView cleanupGestureRecognizers] [Line 3713]🔄 手势识别器清理完成
-[RoomAnimationView cleanupCacheManagers] [Line 3717]🔄 清理缓存管理器
-[RoomAnimationView cleanupCacheManagers] [Line 3730]🔄 缓存管理器清理完成
-[RoomAnimationView removeNotificationObservers] [Line 3743]🔄 移除通知监听
-[RoomAnimationView removeNotificationObservers] [Line 3753]🔄 通知监听移除完成
-[RoomAnimationView removeItSelf] [Line 235]<5D><> RoomAnimationView: 销毁完成
-[RoomAnimationView playBroveBanner:]_block_invoke [Line 752]🔄 BravoGiftBannerView complete 回调被调用

View File

@@ -0,0 +1,471 @@
# 新Banner组件架构设计
## 设计概述
基于对现有7种Banner组件的深度分析设计一套统一的Banner组件架构包含父类、子类、数据模型和用户反馈机制。
## 现有组件分析总结
### 共同UI结构模式
| 组件 | 背景 | 头像 | 标题/内容 | 礼物图标 | 操作按钮 | 动画效果 |
|------|------|------|-----------|----------|----------|----------|
| RoomHighValueGiftBannerAnimation | ✓ | ✓ | ✓ | ✓ | ✓ | SVGA |
| CPGiftBanner | ✓ | ✓✓(双人) | ✓ | ✓ | - | POP |
| BravoGiftBannerView | ✓ | ✓ | ✓ | ✓ | - | SVGA |
| LuckyPackageBannerView | ✓ | ✓ | ✓ | - | ✓ | POP |
| LuckyGiftWinningBannerView | ✓ | ✓ | ✓ | - | ✓ | POP |
| GameUniversalBannerView | ✓ | ✓ | ✓ | ✓ | ✓ | SVGA |
| PIUniversalBannerView | ✓ | - | ✓ | - | ✓ | SVGA |
### 共同数据模式
- AttachmentModel作为数据源
- 专用ViewModel进行数据解析
- 完成回调机制
- 用户交互跳转
## 架构设计
### 1. 基础父类设计
```objc
// YMBaseBannerView.h
#import <UIKit/UIKit.h>
#import "YMBannerDataProtocol.h"
#import "YMBannerDelegate.h"
NS_ASSUME_NONNULL_BEGIN
@class AttachmentModel, YMBaseBannerViewModel;
typedef NS_ENUM(NSUInteger, YMBannerType) {
YMBannerTypeHighValueGift, // 高价值礼物
YMBannerTypeCPGift, // CP礼物
YMBannerTypeBravoGift, // Bravo超级礼物
YMBannerTypeLuckyPackage, // 幸运红包
YMBannerTypeLuckyWinning, // 幸运中奖
YMBannerTypeGameUniversal, // 通用游戏
YMBannerTypeUniversal // 通用飘屏
};
typedef NS_ENUM(NSUInteger, YMBannerAnimationType) {
YMBannerAnimationTypeSlide, // 滑动动画
YMBannerAnimationTypeFade, // 淡入淡出
YMBannerAnimationTypeBounce, // 弹跳效果
YMBannerAnimationTypeCustom // 自定义动画
};
@interface YMBaseBannerView : UIView
#pragma mark - 核心属性
@property (nonatomic, assign, readonly) YMBannerType bannerType;
@property (nonatomic, strong) AttachmentModel *attachment;
@property (nonatomic, strong) YMBaseBannerViewModel *viewModel;
@property (nonatomic, weak) id<YMBannerDelegate> delegate;
#pragma mark - UI组件 (子类可选择使用)
@property (nonatomic, strong, readonly) UIView *containerView;
@property (nonatomic, strong, readonly) UIImageView *backgroundImageView;
@property (nonatomic, strong, readonly) NetImageView *avatarImageView;
@property (nonatomic, strong, readonly) NetImageView *secondAvatarImageView; // CP双头像
@property (nonatomic, strong, readonly) UILabel *titleLabel;
@property (nonatomic, strong, readonly) UILabel *subtitleLabel;
@property (nonatomic, strong, readonly) UILabel *contentLabel;
@property (nonatomic, strong, readonly) NetImageView *iconImageView;
@property (nonatomic, strong, readonly) UIButton *actionButton;
@property (nonatomic, strong, readonly) SVGAImageView *svgaView;
#pragma mark - 动画配置
@property (nonatomic, assign) YMBannerAnimationType animationType;
@property (nonatomic, assign) CGFloat showDuration;
@property (nonatomic, assign) CGFloat stayDuration;
@property (nonatomic, assign) CGFloat hideDuration;
@property (nonatomic, assign) BOOL enableSwipeGesture;
#pragma mark - 回调
@property (nonatomic, copy) void(^onDisplayComplete)(void);
@property (nonatomic, copy) void(^onUserTap)(YMBaseBannerView *banner);
@property (nonatomic, copy) void(^onActionTap)(YMBaseBannerView *banner);
@property (nonatomic, copy) void(^onDismiss)(YMBaseBannerView *banner);
#pragma mark - 状态
@property (nonatomic, assign, readonly) BOOL isDisplaying;
@property (nonatomic, assign, readonly) BOOL isDismissed;
#pragma mark - 类方法
+ (instancetype)bannerWithAttachment:(AttachmentModel *)attachment;
+ (void)displayInView:(UIView *)superView
attachment:(AttachmentModel *)attachment
complete:(void(^)(void))complete;
#pragma mark - 实例方法
- (instancetype)initWithBannerType:(YMBannerType)type;
- (void)configureWithAttachment:(AttachmentModel *)attachment;
- (void)displayInView:(UIView *)superView;
- (void)dismissWithAnimation:(BOOL)animated;
#pragma mark - 子类重写方法
- (Class)viewModelClass; // 返回对应的ViewModel类
- (void)setupUIComponents; // 设置UI组件
- (void)layoutUIComponents; // 布局UI组件
- (void)configureWithViewModel:(YMBaseBannerViewModel *)viewModel; // 配置数据
- (void)performShowAnimation; // 执行显示动画
- (void)performHideAnimation; // 执行隐藏动画
- (void)handleUserTap; // 处理用户点击
- (void)handleActionTap; // 处理操作按钮点击
#pragma mark - 用户反馈
- (void)reportDisplayEvent; // 上报展示事件
- (void)reportClickEvent:(NSString *)action; // 上报点击事件
- (void)reportDismissEvent:(NSString *)reason; // 上报消失事件
@end
NS_ASSUME_NONNULL_END
```
### 2. 基础数据模型
```objc
// YMBaseBannerViewModel.h
#import <Foundation/Foundation.h>
#import "PIBaseModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface YMBaseBannerViewModel : PIBaseModel
#pragma mark - 基础信息
@property (nonatomic, assign) NSInteger roomUid;
@property (nonatomic, assign) NSInteger targetRoomUid;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@property (nonatomic, copy) NSString *content;
#pragma mark - 用户信息
@property (nonatomic, copy) NSString *senderNick;
@property (nonatomic, copy) NSString *senderAvatar;
@property (nonatomic, assign) NSInteger senderUid;
@property (nonatomic, copy) NSString *receiverNick;
@property (nonatomic, copy) NSString *receiverAvatar;
@property (nonatomic, assign) NSInteger receiverUid;
#pragma mark - 视觉资源
@property (nonatomic, copy) NSString *backgroundImageUrl;
@property (nonatomic, copy) NSString *iconImageUrl;
@property (nonatomic, copy) NSString *svgaUrl;
#pragma mark - 交互配置
@property (nonatomic, copy) NSString *actionText;
@property (nonatomic, copy) NSString *skipUrl;
@property (nonatomic, assign) BOOL enableClick;
@property (nonatomic, assign) BOOL enableAction;
#pragma mark - 埋点数据
@property (nonatomic, copy) NSString *eventType;
@property (nonatomic, strong) NSDictionary *trackingData;
@end
NS_ASSUME_NONNULL_END
```
### 3. 代理协议设计
```objc
// YMBannerDelegate.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class YMBaseBannerView;
@protocol YMBannerDelegate <NSObject>
@optional
#pragma mark - 生命周期回调
- (void)bannerWillDisplay:(YMBaseBannerView *)banner;
- (void)bannerDidDisplay:(YMBaseBannerView *)banner;
- (void)bannerWillDismiss:(YMBaseBannerView *)banner;
- (void)bannerDidDismiss:(YMBaseBannerView *)banner;
#pragma mark - 交互回调
- (void)banner:(YMBaseBannerView *)banner didTapWithAction:(NSString *)action;
- (void)banner:(YMBaseBannerView *)banner willNavigateToRoom:(NSInteger)roomUid;
- (void)banner:(YMBaseBannerView *)banner willOpenURL:(NSString *)url;
#pragma mark - 数据回调
- (void)banner:(YMBaseBannerView *)banner didReportEvent:(NSString *)event data:(NSDictionary *)data;
@end
NS_ASSUME_NONNULL_END
```
## 子类设计
### 1. 高价值礼物Banner
```objc
// YMHighValueGiftBannerView.h
#import "YMBaseBannerView.h"
@interface YMHighValueGiftBannerView : YMBaseBannerView
@property (nonatomic, strong, readonly) UILabel *giftNameLabel;
@property (nonatomic, strong, readonly) UILabel *giftCountLabel;
@property (nonatomic, strong, readonly) MarqueeLabel *senderScrollLabel;
@property (nonatomic, strong, readonly) MarqueeLabel *roomNameScrollLabel;
@end
// YMHighValueGiftBannerViewModel.h
@interface YMHighValueGiftBannerViewModel : YMBaseBannerViewModel
@property (nonatomic, copy) NSString *giftName;
@property (nonatomic, assign) NSInteger giftCount;
@property (nonatomic, copy) NSString *giftImageUrl;
@property (nonatomic, assign) NSInteger bgLevel;
@property (nonatomic, copy) NSString *roomTitle;
@end
```
### 2. CP礼物Banner
```objc
// YMCPGiftBannerView.h
#import "YMBaseBannerView.h"
@interface YMCPGiftBannerView : YMBaseBannerView
@property (nonatomic, strong, readonly) UIStackView *cpStackView;
@property (nonatomic, strong, readonly) UILabel *relationLabel;
@end
// YMCPGiftBannerViewModel.h
@interface YMCPGiftBannerViewModel : YMBaseBannerViewModel
@property (nonatomic, copy) NSString *giftImageUrl;
@property (nonatomic, copy) NSString *relationText;
@end
```
### 3. 通用游戏Banner
```objc
// YMGameUniversalBannerView.h
#import "YMBaseBannerView.h"
@interface YMGameUniversalBannerView : YMBaseBannerView
@property (nonatomic, strong, readonly) NetImageView *gameIconView;
@property (nonatomic, assign) NSInteger gameID;
@end
// YMGameUniversalBannerViewModel.h
@interface YMGameUniversalBannerViewModel : YMBaseBannerViewModel
@property (nonatomic, copy) NSString *gameIconUrl;
@property (nonatomic, assign) NSInteger gameID;
@property (nonatomic, copy) NSString *gameTitle;
@end
```
## 用户反馈机制设计
### 1. 反馈管理器
```objc
// YMBannerFeedbackManager.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger, YMBannerFeedbackType) {
YMBannerFeedbackTypeDisplay, // 展示
YMBannerFeedbackTypeClick, // 点击
YMBannerFeedbackTypeAction, // 操作
YMBannerFeedbackTypeDismiss, // 消失
YMBannerFeedbackTypeError // 错误
};
@interface YMBannerFeedbackManager : NSObject
+ (instancetype)shared;
#pragma mark - 事件上报
- (void)reportBannerEvent:(YMBannerFeedbackType)type
banner:(YMBaseBannerView *)banner
data:(NSDictionary *)data;
#pragma mark - 性能监控
- (void)startPerformanceMonitoring:(YMBaseBannerView *)banner;
- (void)endPerformanceMonitoring:(YMBaseBannerView *)banner;
#pragma mark - 错误收集
- (void)reportError:(NSError *)error
banner:(YMBaseBannerView *)banner
context:(NSDictionary *)context;
@end
NS_ASSUME_NONNULL_END
```
### 2. 埋点事件定义
```objc
// YMBannerTrackingEvents.h
extern NSString * const kYMBannerEventDisplay; // banner_display
extern NSString * const kYMBannerEventClick; // banner_click
extern NSString * const kYMBannerEventAction; // banner_action
extern NSString * const kYMBannerEventDismiss; // banner_dismiss
extern NSString * const kYMBannerEventLoadStart; // banner_load_start
extern NSString * const kYMBannerEventLoadEnd; // banner_load_end
extern NSString * const kYMBannerEventError; // banner_error
// 埋点参数Key
extern NSString * const kYMBannerTrackingKeyType; // banner_type
extern NSString * const kYMBannerTrackingKeyRoomUid; // room_uid
extern NSString * const kYMBannerTrackingKeyDuration; // duration
extern NSString * const kYMBannerTrackingKeyAction; // action
extern NSString * const kYMBannerTrackingKeyReason; // reason
```
## 上下文调整说明
### 1. RoomAnimationView.m 调整
#### 1.1 替换现有Banner创建逻辑
```objc
// 原代码
- (void)playRoomGiftBanner:(AttachmentModel *)obj {
[RoomHighValueGiftBannerAnimation display:self.bannerContainer
with:obj
complete:^{
self.isRoomBannerV2Displaying = NO;
[self processNextRoomEffectAttachment];
}];
}
// 新代码
- (void)playRoomGiftBanner:(AttachmentModel *)obj {
YMHighValueGiftBannerView *banner = [YMHighValueGiftBannerView bannerWithAttachment:obj];
banner.delegate = self;
banner.onDisplayComplete = ^{
self.isRoomBannerV2Displaying = NO;
[self processNextRoomEffectAttachment];
};
[banner displayInView:self.bannerContainer];
}
```
#### 1.2 添加代理实现
```objc
#pragma mark - YMBannerDelegate
- (void)banner:(YMBaseBannerView *)banner didReportEvent:(NSString *)event data:(NSDictionary *)data {
[[YMBannerFeedbackManager shared] reportBannerEvent:YMBannerFeedbackTypeDisplay
banner:banner
data:data];
}
- (void)banner:(YMBaseBannerView *)banner willNavigateToRoom:(NSInteger)roomUid {
// 处理房间跳转逻辑
RoomInfoModel *currentRoom = self.hostDelegate.getRoomInfo;
if (currentRoom.uid != roomUid) {
// 执行跨房间跳转
}
}
```
### 2. 项目依赖调整
#### 2.1 新增文件结构
```YuMi/Modules/YMRoom/View/Banner/
├── Base/
│ ├── YMBaseBannerView.h/.m
│ ├── YMBaseBannerViewModel.h/.m
│ └── YMBannerDelegate.h
├── Subclasses/
│ ├── YMHighValueGiftBannerView.h/.m
│ ├── YMCPGiftBannerView.h/.m
│ ├── YMBravoGiftBannerView.h/.m
│ ├── YMGameUniversalBannerView.h/.m
│ └── YMLuckyPackageBannerView.h/.m
├── Manager/
│ └── YMBannerFeedbackManager.h/.m
└── Constants/
└── YMBannerTrackingEvents.h/.m
```
#### 2.2 Podfile依赖更新
```ruby
# 确保动画库版本兼容
pod 'pop', '~> 1.0'
pod 'SVGAPlayer', '~> 2.3'
# 新增性能监控
pod 'YMPerformanceMonitor' # 如果有自定义性能监控库
```
### 3. 配置文件调整
#### 3.1 添加Banner配置
```objc
// YMBannerConfig.h
@interface YMBannerConfig : NSObject
@property (nonatomic, assign) BOOL enablePerformanceMonitoring;
@property (nonatomic, assign) BOOL enableErrorReporting;
@property (nonatomic, assign) CGFloat defaultShowDuration;
@property (nonatomic, assign) CGFloat defaultStayDuration;
@property (nonatomic, assign) CGFloat defaultHideDuration;
+ (instancetype)shared;
@end
```
### 4. 迁移策略
#### 4.1 Phase 1: 基础架构
- 创建基类和协议
- 实现反馈管理器
- 设置基础配置
#### 4.2 Phase 2: 渐进迁移
- 优先迁移使用频率最高的Banner
- 保持向后兼容性
- 添加单元测试
#### 4.3 Phase 3: 优化完善
- 移除旧代码
- 性能优化
- 文档完善
## 总结
这套新的Banner组件架构具备以下优势
1. **统一性**: 提供一致的API和行为模式
2. **扩展性**: 易于添加新的Banner类型
3. **可维护性**: 集中管理动画、埋点和反馈
4. **性能优化**: 统一的资源管理和内存优化
5. **用户体验**: 标准化的交互和反馈机制
通过这套架构可以显著提升Banner组件的开发效率和用户体验质量。

View File

@@ -0,0 +1,80 @@
# 飘屏组件分析文档
## 概述
本文档详细分析了项目中在 `RoomAnimationView.m``bannerContainer` 中展示的所有飘屏类型及其触发逻辑。
## 飘屏展示机制
- **展示容器**: `bannerContainer` (XPRoomAnimationHitView)
- **位置**: 视图层级最顶层,距离顶部导航栏高度
- **尺寸**: 屏幕宽度 × 180px 高度
- **管理机制**: 统一队列管理,按优先级顺序播放
## 飘屏类型详细表格
| 序号 | 飘屏名称 | 类名 | 触发消息类型 | 处理方法 | 业务场景 | 功能描述 |
|-----|---------|------|-------------|---------|----------|---------|
| 1 | 高价值礼物飘屏 | RoomHighValueGiftBannerAnimation | Custom_Message_Sub_Gift_ChannelNotify | playRoomGiftBanner: | 礼物系统 | 展示高价值礼物的全服广播 |
| 2 | CP礼物飘屏 | CPGiftBanner | Custom_Message_Sub_CP_Gift | playCPGiftBanner: | CP系统 | 展示CP相关礼物特效 |
| 3 | Bravo超级礼物飘屏 | BravoGiftBannerView | Custom_Message_Sub_Super_Gift_Banner | playBroveBanner: | 超级礼物 | 展示Bravo超级礼物效果 |
| 4 | 幸运红包飘屏 | LuckyPackageBannerView | Custom_Message_Sub_LuckyPackage | playLuckyPackageBanner: | 红包系统 | 展示房间红包,支持跨房间跳转 |
| 5 | 幸运礼物中奖飘屏 | LuckyGiftWinningBannerView | Custom_Message_Sub_Super_Gift_Winning_Coins_ALL_Room | playLuckyWinningBanner: | 中奖系统 | 展示全服中奖信息 |
| 6 | 通用游戏飘屏 | GameUniversalBannerView | Custom_Message_Sub_General_Floating_Screen_One_Room<br/>Custom_Message_Sub_General_Floating_Screen_All_Room | playGameBanner: | 游戏系统 | 展示游戏相关飘屏,支持跳转 |
| 7 | 塔罗飘屏 | XPRoomTarrowBannerView | Custom_Message_Sub_Tarot_Advanced<br/>Custom_Message_Sub_Tarot_Intermediate | createTarotBannerAnimation: | 塔罗活动 | 展示塔罗相关活动信息 |
| 8 | 星厨房飘屏 | XPRoomStarKitchenBannerView | Custom_Message_Sub_Star_Kitchen_FullScreen | createStarKitchenBannerAnimation: | 厨房活动 | 展示星厨房活动 |
| 9 | 夺宝精灵飘屏 | - | Custom_Message_Sub_Treasure_Fairy_Draw_Gift_L4<br/>Custom_Message_Sub_Treasure_Fairy_Draw_Gift_L5<br/>Custom_Message_Sub_Treasure_Fairy_Convert_L1/L2/L3 | createTreasureFairyBannerAnimation: | 夺宝活动 | 展示夺宝精灵高等级奖励 |
| 10 | 主播小时榜飘屏 | XPRoomAnchorRankBannerView | Custom_Message_Sub_Anchor_Hour_Rank | 创建主播排行榜飘屏 | 排行榜 | 展示主播小时榜信息 |
| 11 | 通用H5飘屏 | XPRoomTarrowBannerView | Custom_Message_Sub_Common_H5_Novice<br/>Custom_Message_Sub_Common_H5_Advanced | createCommonH5BannerAnimation: | H5活动 | 展示通用H5活动飘屏 |
| 12 | 通用飘屏 | PIUniversalBannerView | 多种消息类型 | createGeneralFloatingScreenAnimation: | 通用展示 | 提供通用飘屏展示能力 |
## 队列管理机制
### 核心属性
- **队列数组**: `roomBannertModelsQueueV2` (NSMutableArray)
- **状态标记**: `isRoomBannerV2Displaying` (BOOL)
### 处理流程
1. **消息接收**: 调用 `inserBannerModelToQueue:` 将消息加入队列
2. **优先级排序**: 调用 `sortBannerQueue` 按消息类型的second值排序数值越小优先级越高
3. **顺序播放**: 调用 `processNextRoomEffectAttachment` 逐个播放
4. **播放完成**: 每个飘屏播放完成后,设置 `isRoomBannerV2Displaying = NO` 并处理下一个
### 优先级规则
飘屏按 `AttachmentModel.second` 值进行排序,确保重要消息优先展示。
## 消息类型分类
### 礼物相关
- Custom_Message_Sub_Gift_ChannelNotify (32)
- Custom_Message_Sub_CP_Gift
- Custom_Message_Sub_Super_Gift_Banner (1066)
### 红包/福袋相关
- Custom_Message_Sub_LuckyPackage (607)
- Custom_Message_Sub_Super_Gift_Winning_Coins_ALL_Room (1063)
### 游戏相关
- Custom_Message_Sub_General_Floating_Screen_One_Room (1071)
- Custom_Message_Sub_General_Floating_Screen_All_Room (1072)
### 活动相关
- Custom_Message_Sub_Tarot_Advanced (714)
- Custom_Message_Sub_Tarot_Intermediate (713)
- Custom_Message_Sub_Star_Kitchen_FullScreen (1042)
- Custom_Message_Sub_Treasure_Fairy_* (9700系列)
### 排行榜相关
- Custom_Message_Sub_Anchor_Hour_Rank (891)
### 通用相关
- Custom_Message_Sub_Common_H5_* (1100系列)

View File

@@ -0,0 +1,203 @@
# 飘屏组件抽象分析
## 分析概述
基于对项目中12种飘屏组件的深入分析发现这些组件存在高度相似的设计模式和实现结构具备抽象出统一父类的条件。
## 现状分析
### 共同特征
经过代码分析,发现所有飘屏组件都具有以下共同特征:
#### 1. 统一的类方法签名模式
大部分Banner类都采用了相似的类方法签名
``` objc
+ (void)display:(UIView *)superView
with:(AttachmentModel *)attachment
complete:(void(^)(void))complete;
// 或者带房间信息的版本
+ (void)display:(UIView *)superView
inRoomUid:(NSInteger)roomUid
with:(AttachmentModel *)attachment
complete:(void(^)(void))complete
exitCurrentRoom:(void(^)(void))exit;
```
#### 2. 共同的内部属性结构
```objc
@property (nonatomic, strong) SomeViewModel *model; // 数据模型
@property (nonatomic, strong) UIImageView *backgroundImageView; // 背景图片
@property (nonatomic, copy) void(^completeDisplay)(void); // 完成回调
@property (nonatomic, copy) void(^exitCurrentRoom)(void); // 退房回调
@property (nonatomic, assign) NSInteger currentRoomUid; // 当前房间ID
```
#### 3. 相似的动画流程
- 从屏幕右侧滑入 (x = KScreenWidth)
- 短暂停留展示
- 滑出屏幕或淡出
- 执行完成回调
#### 4. 统一的数据处理模式
- 都依赖 `AttachmentModel` 作为数据源
- 都创建对应的ViewModel进行数据解析
- 都继承自 `PIBaseModel`
#### 5. 相似的UI组件
- 背景图片视图
- 用户头像
- 文本标签
- 可选的SVGA动画视图
- 可选的交互按钮
## 抽象方案设计
### 建议的基类结构: `BaseRoomBannerView`
```objc
@interface BaseRoomBannerView : UIView
#pragma mark - 核心属性
@property (nonatomic, strong) AttachmentModel *attachment;
@property (nonatomic, strong) PIBaseModel *viewModel;
@property (nonatomic, assign) NSInteger currentRoomUid;
@property (nonatomic, assign) NSInteger targetRoomUid;
#pragma mark - UI组件
@property (nonatomic, strong) UIView *containerView;
@property (nonatomic, strong) UIImageView *backgroundImageView;
@property (nonatomic, strong) NetImageView *avatarImageView;
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UILabel *subTitleLabel;
@property (nonatomic, strong) UIButton *actionButton;
@property (nonatomic, strong) SVGAImageView *svgaView;
#pragma mark - 动画配置
@property (nonatomic, assign) CGFloat showDuration;
@property (nonatomic, assign) CGFloat stayDuration;
@property (nonatomic, assign) CGFloat hideDuration;
@property (nonatomic, assign) BOOL useSlideAnimation;
@property (nonatomic, assign) BOOL useFadeAnimation;
#pragma mark - 回调
@property (nonatomic, copy) void(^completeDisplay)(void);
@property (nonatomic, copy) void(^exitCurrentRoom)(void);
@property (nonatomic, copy) void(^didTapBanner)(NSInteger roomID);
#pragma mark - 类方法
+ (instancetype)createWithAttachment:(AttachmentModel *)attachment
inRoomUid:(NSInteger)roomUid
complete:(void(^)(void))complete
exitCurrentRoom:(void(^)(void))exit;
+ (void)display:(UIView *)superView
with:(AttachmentModel *)attachment
complete:(void(^)(void))complete;
+ (void)display:(UIView *)superView
inRoomUid:(NSInteger)roomUid
with:(AttachmentModel *)attachment
complete:(void(^)(void))complete
exitCurrentRoom:(void(^)(void))exit;
#pragma mark - 实例方法
- (void)setupWithAttachment:(AttachmentModel *)attachment;
- (void)showInSuperView:(UIView *)superView;
- (void)performShowAnimation;
- (void)performHideAnimation;
#pragma mark - 子类重写方法
- (Class)viewModelClass; // 返回对应的ViewModel类
- (void)setupUI; // 设置UI布局
- (void)configureWithModel:(PIBaseModel *)model; // 配置数据
- (void)customizeAnimation; // 自定义动画
- (void)handleTapAction; // 处理点击事件
@end
```
### 抽象优势分析
#### 1. 代码复用率提升
- 消除重复的动画逻辑
- 统一的数据处理流程
- 共享的UI组件管理
#### 2. 维护成本降低
- 集中管理动画参数
- 统一的回调处理机制
- 标准化的生命周期管理
#### 3. 扩展性增强
- 新增飘屏类型只需继承基类
- 便于添加通用功能(如埋点、性能监控)
- 支持主题切换等全局功能
#### 4. 一致性保证
- 统一的动画效果和时长
- 标准化的交互行为
- 一致的视觉表现
### 实现策略
#### 阶段一:创建基类
1. 提取共同属性和方法
2. 实现通用动画逻辑
3. 定义子类接口规范
#### 阶段二:重构现有类
1. 逐步迁移现有Banner类继承基类
2. 移除重复代码
3. 保持向后兼容
#### 阶段三:优化和扩展
1. 添加性能监控
2. 实现主题支持
3. 统一埋点逻辑
### 潜在挑战
#### 1. 兼容性问题
- 现有代码的重构风险
- 不同Banner的特殊需求差异
- 第三方依赖的适配
#### 2. 性能考虑
- 基类功能过于复杂可能影响性能
- 内存占用的优化
- 动画性能的平衡
#### 3. 维护复杂度
- 基类变更可能影响所有子类
- 需要详细的文档和测试
- 团队学习成本
## 结论
**建议进行抽象**:项目中的飘屏组件具有高度的相似性,抽象出基类能够显著提升代码质量和开发效率。建议采用渐进式重构策略,先创建基类和接口规范,再逐步迁移现有实现,确保系统稳定性的同时实现架构优化。
## 优先级建议
1. **高优先级**:创建 `BaseRoomBannerView` 基类
2. **中优先级**重构使用频率最高的Banner类
3. **低优先级**:添加扩展功能和优化
通过这种抽象设计,能够在保持现有功能完整性的同时,为未来的功能扩展和维护奠定良好的架构基础。

View File

@@ -9,7 +9,6 @@ target 'YuMi' do
pod 'FBSDKLoginKit'
pod 'FBSDKCoreKit'
pod 'FBSDKShareKit'
pod 'LineSDKSwift'
# 滑动标签栏
pod 'JXCategoryView'
pod 'JXPagingView/Pager'
@@ -45,20 +44,19 @@ target 'YuMi' do
#上传音乐
pod 'CocoaAsyncSocket',:modular_headers => true
#声网
pod 'AgoraRtcEngine_iOS'
pod 'SSKeychain'
pod 'Base64'
#pop动画
pod 'pop'
#云信
pod 'NIMSDK_LITE'
pod 'NIMSDK_LITE', '~> 10.9.40'
pod 'GKCycleScrollView'
pod 'SVGAPlayer'
pod 'GoogleSignIn'
pod 'mob_linksdk_pro'
pod 'mob_sharesdk'
pod 'mob_sharesdk/ShareSDKPlatforms/Apple'
#pod 'mob_sharesdk/ShareSDKPlatforms/Line'
pod 'mob_sharesdk/ShareSDKExtension'
pod 'UMCommon'
@@ -76,6 +74,7 @@ post_install do |installer|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
config.build_settings['DEBUG_INFORMATION_FORMAT'] = 'dwarf-with-dsym'
config.build_settings['ENABLE_BITCODE'] = 'NO'
xcconfig_path = config.base_configuration_reference.real_path
xcconfig = File.read(xcconfig_path)
xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR")

File diff suppressed because it is too large Load Diff

View File

@@ -27,6 +27,7 @@
#import <UserNotifications/UserNotifications.h>
#import <Bugly/Bugly.h>
#import <UIKit/UIDevice.h>
#import "YuMi-swift.h"
@@ -75,6 +76,7 @@ UIKIT_EXTERN NSString * adImageName;
/**
Bugly
*/
- (void) configBugly {
BuglyConfig *config = [[BuglyConfig alloc] init];
@@ -83,22 +85,25 @@ UIKIT_EXTERN NSString * adImageName;
#ifdef DEBUG
config.debugMode = NO;//YES; // debug
config.channel = [YYUtility getAppSource];
// config.blockMonitorEnable = YES; //
config.reportLogLevel = BuglyLogLevelSilent; // BuglyLogLevelVerbose; //
config.reportLogLevel = BuglyLogLevelWarn;// BuglyLogLevelSilent; // BuglyLogLevelVerbose; //
[Bugly startWithAppId:@"c937fd00f7" config:config];
#else
config.unexpectedTerminatingDetectionEnable = YES; // 退
config.debugMode = NO; // release
config.channel = [YYUtility getAppSource];;
config.blockMonitorEnable = NO; //
config.blockMonitorEnable = YES; //
config.reportLogLevel = BuglyLogLevelWarn; //
NSString *buylyKey = @"8627948559"; // isEnterprise == NO ? @"5334684d86" : @"d65df59a68";
NSString *buylyKey = @"8627948559";
[Bugly startWithAppId:buylyKey config:config];
#endif
}
- (void)configNIMSDK {
// NIMSDK
NSString *appKey = KeyWithType(KeyType_NetEase);
NSString *appKey = [[ClientConfig shareConfig].configInfo nimKey];
if ([NSString isEmpty:appKey]) {
appKey = KeyWithType(KeyType_NetEase);
}
NIMSDKOption *option = [NIMSDKOption optionWithAppKey:appKey];
#ifdef DEBUG
option.apnsCername = @"pikoDevelopPush";
@@ -110,18 +115,28 @@ UIKIT_EXTERN NSString * adImageName;
// NIM SDK
[NIMCustomObject registerCustomDecoder:[[CustomAttachmentDecoder alloc] init]];
[[NIMSDKConfig sharedConfig] setShouldSyncStickTopSessionInfos:YES];
[NIMSDKConfig sharedConfig].shouldConsiderRevokedMessageUnreadCount = YES;
///
[[NIMSDKConfig sharedConfig] setShouldSyncStickTopSessionInfos:YES];
// cdn
[NIMSDKConfig sharedConfig].cdnTrackInterval = 0;
//
[NIMSDKConfig sharedConfig].chatroomMessageReceiveMinInterval = 50;
#ifdef DEBUG
[NIMSDKConfig sharedConfig].enabledHttpsForInfo = NO;
[NIMSDKConfig sharedConfig].enabledHttpsForMessage = NO;
#else
// HTTPS
[NIMSDKConfig sharedConfig].enabledHttpsForInfo = YES;
[NIMSDKConfig sharedConfig].enabledHttpsForMessage = YES;
#endif
}
- (void)configShareSDK {
[PILineLoginManager registerLine];
// [PILineLoginManager registerLine];
[ShareSDK registPlatforms:^(SSDKRegister *platformsRegister) {
///faceBook
@@ -145,12 +160,18 @@ UIKIT_EXTERN NSString * adImageName;
NSArray * emojiArray = dic[@"data"];
NSMutableArray * array = [NSMutableArray array];
for (int i = 0; i < emojiArray.count; i++) {
NSDictionary * dic = [emojiArray objectAtIndex:i];
UIImage * image = [UIImage imageNamed:dic[@"file"]];
QEmotion * info = [[QEmotion alloc] init];
info.identifier = dic[@"id"];
NSDictionary * dic = [emojiArray xpSafeObjectAtIndex:i];
if (dic) {
info.displayName = dic[@"tag"];
info.identifier = dic[@"id"];
}
info.image = image;
info.displayName = dic[@"tag"];
[array addObject:info];
}
//

View File

@@ -78,6 +78,10 @@ void qg_VAP_Logger_handler(VAPLogLevel level, const char* file, int line, const
});
}];
if (@available(iOS 15, *)) {
[[UITableView appearance] setSectionHeaderTopPadding:0];
}
return YES;
}

View File

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

View File

@@ -9,7 +9,7 @@
"scale" : "2x"
},
{
"filename" : "1@3x.png",
"filename" : "1@3x (1).png",
"idiom" : "universal",
"scale" : "3x"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -5,12 +5,11 @@
"scale" : "1x"
},
{
"filename" : "room_sailing_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "room_sailing_bg@3x.png",
"filename" : "4cc1494e9e1f9153726ebc7fb2d5d12ef75635b53fe46-nx2IAX_fw480@3x.png",
"idiom" : "universal",
"scale" : "3x"
}

View File

@@ -5,11 +5,11 @@
"scale" : "1x"
},
{
"filename" : "room_sailiing_enter.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "框@3x.png",
"idiom" : "universal",
"scale" : "3x"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@@ -1,7 +1,6 @@
{
"images" : [
{
"filename" : "room_menu_gift_first_recharge_ar.png",
"idiom" : "universal",
"scale" : "1x"
},
@@ -10,6 +9,7 @@
"scale" : "2x"
},
{
"filename" : "框@3x (2).png",
"idiom" : "universal",
"scale" : "3x"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@@ -5,12 +5,11 @@
"scale" : "1x"
},
{
"filename" : "room_sailing_add@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "room_sailing_add@3x.png",
"filename" : "框@3x (1).png",
"idiom" : "universal",
"scale" : "3x"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "现在@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "框-拷贝1@3x (2).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "框-拷贝1@3x (1).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "框-拷贝1@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "切图 32@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 896 B

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "游戏@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "切图 25@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 948 B

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "切图 25@3x (1).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "组 7158@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "容器@3x (1).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1004 B

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "切图 68@3x (3).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "勾选@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "容器@3x (3).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "容器@3x (2).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 B

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "切图 68@3x (2).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "切图 68@3x (1).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "勾选@3x (1).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "容器@3x (4).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "组 8424@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "容器@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "矩形 3164@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "鸭子@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "切图 31@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "组 8485@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "组 8466@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "2@3x (1).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip@3x (1).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip@3x (2).png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "vip@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Some files were not shown because too many files have changed in this diff Show More