From f44942dc721a27e27bc75e3d3a3c9eee9228dcb3 Mon Sep 17 00:00:00 2001 From: liyuhua <15626451870@163.com> Date: Thu, 10 Aug 2023 16:25:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=A3=B0=E9=9F=B3=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- YuMi.xcodeproj/project.pbxproj | 138 ++ .../monents_info_top@2x.png | Bin 968 -> 1129 bytes .../monents_info_top@3x.png | Bin 1473 -> 2239 bytes .../mine_guild_close.imageset/Contents.json | 22 + .../mine_guild_close@2x.png | Bin 0 -> 216 bytes .../mine_guild_close@3x.png | Bin 0 -> 320 bytes .../mine_info_close.imageset/Contents.json | 22 + .../mine_info_close@2x.png | Bin 0 -> 696 bytes .../mine_info_close@3x.png | Bin 0 -> 1182 bytes .../mine_info_paly.imageset/Contents.json | 22 + .../mine_info_paly@2x.png | Bin 0 -> 552 bytes .../mine_info_paly@3x.png | Bin 0 -> 975 bytes .../jm/RecordedSound/Contents.json | 6 + .../Contents.json | 22 + .../mine_recorded_sound_bg@2x.png | Bin 0 -> 13431 bytes .../mine_recorded_sound_bg@3x.png | Bin 0 -> 30719 bytes .../Contents.json | 22 + .../mine_recorded_sound_completed@2x.png | Bin 0 -> 2118 bytes .../mine_recorded_sound_completed@3x.png | Bin 0 -> 2880 bytes .../Contents.json | 22 + .../mine_recorded_sound_completeding@2x.png | Bin 0 -> 2141 bytes .../mine_recorded_sound_completeding@3x.png | Bin 0 -> 2864 bytes .../Contents.json | 22 + .../mine_recorded_sound_del@2x.png | Bin 0 -> 1329 bytes .../mine_recorded_sound_del@3x.png | Bin 0 -> 2384 bytes .../Contents.json | 22 + .../mine_recorded_sound_mic@2x.png | Bin 0 -> 5621 bytes .../mine_recorded_sound_mic@3x.png | Bin 0 -> 9020 bytes .../Contents.json | 22 + .../mine_recorded_sound_recording@2x.png | Bin 0 -> 2405 bytes .../mine_recorded_sound_recording@3x.png | Bin 0 -> 3208 bytes .../Contents.json | 22 + .../mine_recorded_sound_rerecord@2x.png | Bin 0 -> 617 bytes .../mine_recorded_sound_rerecord@3x.png | Bin 0 -> 931 bytes .../Contents.json | 22 + .../mine_recorded_sound_save@2x.png | Bin 0 -> 3250 bytes .../mine_recorded_sound_save@3x.png | Bin 0 -> 4905 bytes .../Contents.json | 22 + .../mine_recorded_sound_start_record@2x.png | Bin 0 -> 2458 bytes .../mine_recorded_sound_start_record@3x.png | Bin 0 -> 3413 bytes .../jm/gift_list_one.imageset/Contents.json | 22 + .../gift_list_one@2x.png | Bin 0 -> 881 bytes .../gift_list_one@3x.png | Bin 0 -> 1573 bytes .../jm/gift_list_three.imageset/Contents.json | 22 + .../gift_list_three@2x.png | Bin 0 -> 1349 bytes .../gift_list_three@3x.png | Bin 0 -> 2397 bytes .../jm/gift_list_two.imageset/Contents.json | 22 + .../gift_list_two@2x.png | Bin 0 -> 1067 bytes .../gift_list_two@3x.png | Bin 0 -> 1856 bytes .../album_reviewing@2x.png | Bin 3878 -> 1966 bytes .../album_reviewing@3x.png | Bin 9626 -> 3934 bytes .../Contents.json | 4 +- .../avatar_reviewing@2x.png | Bin 1972 -> 0 bytes .../avatar_reviewing@3x.png | Bin 3959 -> 0 bytes .../mine_avatar_reviewing@2x.png | Bin 0 -> 567 bytes .../mine_avatar_reviewing@3x.png | Bin 0 -> 805 bytes .../mine_info_tag_del.imageset/Contents.json | 22 + .../mine_info_tag_del@2x.png | Bin 0 -> 234 bytes .../mine_info_tag_del@3x.png | Bin 0 -> 356 bytes .../jm/mine_item_sound.imageset/Contents.json | 22 + .../mine_item_sound@2x.png | Bin 0 -> 3178 bytes .../mine_item_sound@3x.png | Bin 0 -> 5386 bytes .../Contents.json | 22 + .../mine_user_info_head_edit@2x.png | Bin 0 -> 340 bytes .../mine_user_info_head_edit@3x.png | Bin 0 -> 504 bytes .../Contents.json | 22 + .../mine_userinfo_header_bg@2x.png | Bin 0 -> 401 bytes .../mine_userinfo_header_bg@3x.png | Bin 0 -> 776 bytes .../mine_userinfo_header_shadow_bg@2x.png | Bin 950 -> 605 bytes .../mine_userinfo_header_shadow_bg@3x.png | Bin 1908 -> 1539 bytes .../user_card_copy_id.imageset/Contents.json | 22 + .../user_card_copy_id@2x.png | Bin 0 -> 242 bytes .../user_card_copy_id@3x.png | Bin 0 -> 335 bytes .../user_card_copy_id1.imageset/Contents.json | 22 + .../user_card_copy_id1@2x.png | Bin 0 -> 248 bytes .../user_card_copy_id1@3x.png | Bin 0 -> 367 bytes YuMi/CustomUI/TTPopup/View/TTNewAlertView.h | 20 + YuMi/CustomUI/TTPopup/View/TTNewAlertView.m | 118 ++ YuMi/CustomUI/XNDJTDDLoadingTool.h | 6 + YuMi/CustomUI/XNDJTDDLoadingTool.m | 235 +-- YuMi/Modules/YMMine/Api/Api+Mine.h | 25 +- YuMi/Modules/YMMine/Api/Api+Mine.m | 34 + .../Model/UserInfo/XPMineUserInfoTagModel.h | 40 + .../Model/UserInfo/XPMineUserInfoTagModel.m | 21 + .../YMMine/Model/UserInfo/XPSoundCardModel.h | 22 + .../YMMine/Model/UserInfo/XPSoundCardModel.m | 12 + .../YMMine/Model/XPMineUserInfoEditModel.h | 20 +- .../Presenter/XPMineUserInfoEditPresenter.h | 19 +- .../Presenter/XPMineUserInfoEditPresenter.m | 255 +-- .../Presenter/XPMineUserInfoPresenter.h | 13 + .../Presenter/XPMineUserInfoPresenter.m | 44 +- .../Protocol/XPMineUserInfoEditProtocol.h | 13 +- .../YMMine/Protocol/XPMineUserInfoProtocol.h | 26 +- .../XPMineDataGiftCollectionViewCell.h | 21 +- .../XPMineDataGiftCollectionViewCell.m | 142 +- .../MineInfo/XPMineDataGiftTableViewCell.h | 6 +- .../MineInfo/XPMineDataGiftTableViewCell.m | 286 ++-- .../MineInfo/XPMineUserInfoEditMainTagView.h | 17 + .../MineInfo/XPMineUserInfoEditMainTagView.m | 47 + .../XPMineUserInfoEditTableViewCell.h | 10 +- .../XPMineUserInfoEditTableViewCell.m | 552 ++++--- .../Cell/MineInfo/XPMineUserInfoEditTagView.h | 21 + .../Cell/MineInfo/XPMineUserInfoEditTagView.m | 52 + .../Guild/View/XPMineGuildViewController.m | 2 +- .../MineInfo/XPMineUserDataViewController.h | 17 +- .../MineInfo/XPMineUserDataViewController.m | 483 ++++-- .../XPMineUserInfoEditViewController.h | 23 +- .../XPMineUserInfoEditViewController.m | 448 ++++-- .../MineInfo/XPMineUserInfoViewController.h | 7 +- .../MineInfo/XPMineUserInfoViewController.m | 785 ++++++---- .../MineInfo/XPMineUserInfoEditPickView.h | 34 + .../MineInfo/XPMineUserInfoEditPickView.m | 203 +++ .../MineInfo/XPMineUserInfoGiftView.m | 148 +- .../MineInfo/XPMineUserInfoHeaderTagCell.h | 21 + .../MineInfo/XPMineUserInfoHeaderTagCell.m | 51 + .../MineInfo/XPMineUserInfoHeaderTagView.h | 26 + .../MineInfo/XPMineUserInfoHeaderTagView.m | 161 ++ .../MineInfo/XPMineUserInfoHeaderView.h | 32 +- .../MineInfo/XPMineUserInfoHeaderView.m | 1375 +++++++++++------ .../XPMineUserInfoIndividualTagView.h | 26 + .../XPMineUserInfoIndividualTagView.m | 184 +++ .../MineInfo/XPMineUserInfoTagEmptyView.h | 16 + .../MineInfo/XPMineUserInfoTagEmptyView.m | 58 + .../MineInfo/XPMineUserInfoTagFlowLayout.h | 19 + .../MineInfo/XPMineUserInfoTagFlowLayout.m | 65 + .../MineInfo/XPMineUserInfoTagHeadView.h | 20 + .../MineInfo/XPMineUserInfoTagHeadView.m | 146 ++ .../MineInfo/XPMineUserInfoTagItemView.h | 28 + .../MineInfo/XPMineUserInfoTagItemView.m | 118 ++ .../SubViews/MineInfo/XPMineUserInfoTagView.h | 24 + .../SubViews/MineInfo/XPMineUserInfoTagView.m | 135 ++ .../MineInfo/XPMineUserInfoTagViewCell.h | 22 + .../MineInfo/XPMineUserInfoTagViewCell.m | 118 ++ .../XPMineDataSkillDataCollectionViewCell.h | 16 + .../XPMineDataSkillDataCollectionViewCell.m | 145 ++ .../XPMineUserInfoRecordedSoundView.h | 58 + .../XPMineUserInfoRecordedSoundView.m | 525 +++++++ .../View/XPGiftUserDataViewController.h | 21 + .../View/XPGiftUserDataViewController.m | 158 ++ .../View/XPMineUserInfoRecordedSoundVC.h | 17 + .../View/XPMineUserInfoRecordedSoundVC.m | 466 ++++++ .../Modules/YMMine/View/XPMineUserInfoTagVC.h | 25 + .../Modules/YMMine/View/XPMineUserInfoTagVC.m | 140 ++ .../Presenter/XPMonentsLayoutConfig.h | 29 +- .../Presenter/XPMonentsLayoutConfig.m | 367 +++-- .../View/Cell/XPMonentsTableViewCell.m | 4 +- YuMi/Resources/pi_new_loading.svga | Bin 0 -> 176422 bytes YuMi/Structure/MVP/Model/UserInfoModel.h | 17 +- YuMi/Structure/MVP/Model/UserInfoModel.m | 27 +- YuMi/Structure/PrefixHeader.pch | 1 + YuMi/Tools/CountDown/CountDownHelper.h | 26 +- YuMi/Tools/CountDown/CountDownHelper.m | 153 +- YuMi/Tools/File/UploadFile.h | 2 +- YuMi/Tools/File/UploadFile.m | 19 +- YuMi/Tools/SDPhotoBrowser/SDPhotoBrowser.h | 1 + YuMi/Tools/SGYProgressView/SGYProgressView.h | 37 + YuMi/Tools/SGYProgressView/SGYProgressView.m | 112 ++ YuMi/zh-Hans.lproj/Localizable.strings | 73 +- YuMi/zh-Hant.lproj/Localizable.strings | 73 +- 159 files changed, 7877 insertions(+), 2117 deletions(-) create mode 100644 YuMi/Assets.xcassets/jm/Guild/mine_guild_close.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/Guild/mine_guild_close.imageset/mine_guild_close@2x.png create mode 100644 YuMi/Assets.xcassets/jm/Guild/mine_guild_close.imageset/mine_guild_close@3x.png create mode 100644 YuMi/Assets.xcassets/jm/Guild/mine_info_close.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/Guild/mine_info_close.imageset/mine_info_close@2x.png create mode 100644 YuMi/Assets.xcassets/jm/Guild/mine_info_close.imageset/mine_info_close@3x.png create mode 100644 YuMi/Assets.xcassets/jm/Guild/mine_info_paly.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/Guild/mine_info_paly.imageset/mine_info_paly@2x.png create mode 100644 YuMi/Assets.xcassets/jm/Guild/mine_info_paly.imageset/mine_info_paly@3x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_bg.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_bg.imageset/mine_recorded_sound_bg@2x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_bg.imageset/mine_recorded_sound_bg@3x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completed.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completed.imageset/mine_recorded_sound_completed@2x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completed.imageset/mine_recorded_sound_completed@3x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completeding.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completeding.imageset/mine_recorded_sound_completeding@2x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completeding.imageset/mine_recorded_sound_completeding@3x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_del.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_del.imageset/mine_recorded_sound_del@2x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_del.imageset/mine_recorded_sound_del@3x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_mic.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_mic.imageset/mine_recorded_sound_mic@2x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_mic.imageset/mine_recorded_sound_mic@3x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_recording.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_recording.imageset/mine_recorded_sound_recording@2x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_recording.imageset/mine_recorded_sound_recording@3x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_rerecord.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_rerecord.imageset/mine_recorded_sound_rerecord@2x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_rerecord.imageset/mine_recorded_sound_rerecord@3x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_save.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_save.imageset/mine_recorded_sound_save@2x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_save.imageset/mine_recorded_sound_save@3x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_start_record.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_start_record.imageset/mine_recorded_sound_start_record@2x.png create mode 100644 YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_start_record.imageset/mine_recorded_sound_start_record@3x.png create mode 100644 YuMi/Assets.xcassets/jm/gift_list_one.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/gift_list_one.imageset/gift_list_one@2x.png create mode 100644 YuMi/Assets.xcassets/jm/gift_list_one.imageset/gift_list_one@3x.png create mode 100644 YuMi/Assets.xcassets/jm/gift_list_three.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/gift_list_three.imageset/gift_list_three@2x.png create mode 100644 YuMi/Assets.xcassets/jm/gift_list_three.imageset/gift_list_three@3x.png create mode 100644 YuMi/Assets.xcassets/jm/gift_list_two.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/gift_list_two.imageset/gift_list_two@2x.png create mode 100644 YuMi/Assets.xcassets/jm/gift_list_two.imageset/gift_list_two@3x.png delete mode 100644 YuMi/Assets.xcassets/jm/mine_avatar_reviewing.imageset/avatar_reviewing@2x.png delete mode 100644 YuMi/Assets.xcassets/jm/mine_avatar_reviewing.imageset/avatar_reviewing@3x.png create mode 100644 YuMi/Assets.xcassets/jm/mine_avatar_reviewing.imageset/mine_avatar_reviewing@2x.png create mode 100644 YuMi/Assets.xcassets/jm/mine_avatar_reviewing.imageset/mine_avatar_reviewing@3x.png create mode 100644 YuMi/Assets.xcassets/jm/mine_info_tag_del.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/mine_info_tag_del.imageset/mine_info_tag_del@2x.png create mode 100644 YuMi/Assets.xcassets/jm/mine_info_tag_del.imageset/mine_info_tag_del@3x.png create mode 100644 YuMi/Assets.xcassets/jm/mine_item_sound.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/mine_item_sound.imageset/mine_item_sound@2x.png create mode 100644 YuMi/Assets.xcassets/jm/mine_item_sound.imageset/mine_item_sound@3x.png create mode 100644 YuMi/Assets.xcassets/jm/mine_user_info_head_edit.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/mine_user_info_head_edit.imageset/mine_user_info_head_edit@2x.png create mode 100644 YuMi/Assets.xcassets/jm/mine_user_info_head_edit.imageset/mine_user_info_head_edit@3x.png create mode 100644 YuMi/Assets.xcassets/jm/mine_userinfo_header_bg.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/mine_userinfo_header_bg.imageset/mine_userinfo_header_bg@2x.png create mode 100644 YuMi/Assets.xcassets/jm/mine_userinfo_header_bg.imageset/mine_userinfo_header_bg@3x.png create mode 100644 YuMi/Assets.xcassets/jm/user_card_copy_id.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/user_card_copy_id.imageset/user_card_copy_id@2x.png create mode 100644 YuMi/Assets.xcassets/jm/user_card_copy_id.imageset/user_card_copy_id@3x.png create mode 100644 YuMi/Assets.xcassets/jm/user_card_copy_id1.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/jm/user_card_copy_id1.imageset/user_card_copy_id1@2x.png create mode 100644 YuMi/Assets.xcassets/jm/user_card_copy_id1.imageset/user_card_copy_id1@3x.png create mode 100644 YuMi/CustomUI/TTPopup/View/TTNewAlertView.h create mode 100644 YuMi/CustomUI/TTPopup/View/TTNewAlertView.m create mode 100644 YuMi/Modules/YMMine/Model/UserInfo/XPMineUserInfoTagModel.h create mode 100644 YuMi/Modules/YMMine/Model/UserInfo/XPMineUserInfoTagModel.m create mode 100644 YuMi/Modules/YMMine/Model/UserInfo/XPSoundCardModel.h create mode 100644 YuMi/Modules/YMMine/Model/UserInfo/XPSoundCardModel.m create mode 100644 YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditMainTagView.h create mode 100644 YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditMainTagView.m create mode 100644 YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTagView.h create mode 100644 YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTagView.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoEditPickView.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoEditPickView.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagCell.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagCell.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagView.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagView.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoIndividualTagView.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoIndividualTagView.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagEmptyView.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagEmptyView.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagFlowLayout.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagFlowLayout.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagHeadView.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagHeadView.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagItemView.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagItemView.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagView.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagView.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagViewCell.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagViewCell.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/XPMineDataSkillDataCollectionViewCell.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/XPMineDataSkillDataCollectionViewCell.m create mode 100644 YuMi/Modules/YMMine/View/SubViews/XPMineUserInfoRecordedSoundView.h create mode 100644 YuMi/Modules/YMMine/View/SubViews/XPMineUserInfoRecordedSoundView.m create mode 100644 YuMi/Modules/YMMine/View/XPGiftUserDataViewController.h create mode 100644 YuMi/Modules/YMMine/View/XPGiftUserDataViewController.m create mode 100644 YuMi/Modules/YMMine/View/XPMineUserInfoRecordedSoundVC.h create mode 100644 YuMi/Modules/YMMine/View/XPMineUserInfoRecordedSoundVC.m create mode 100644 YuMi/Modules/YMMine/View/XPMineUserInfoTagVC.h create mode 100644 YuMi/Modules/YMMine/View/XPMineUserInfoTagVC.m create mode 100644 YuMi/Resources/pi_new_loading.svga create mode 100644 YuMi/Tools/SGYProgressView/SGYProgressView.h create mode 100644 YuMi/Tools/SGYProgressView/SGYProgressView.m diff --git a/YuMi.xcodeproj/project.pbxproj b/YuMi.xcodeproj/project.pbxproj index 1a2d79d4..922d48a3 100644 --- a/YuMi.xcodeproj/project.pbxproj +++ b/YuMi.xcodeproj/project.pbxproj @@ -252,6 +252,28 @@ 23E9EA792A8385CC00B792F2 /* XPTreasureFairyGiftView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA772A8385CB00B792F2 /* XPTreasureFairyGiftView.m */; }; 23E9EA7C2A83977400B792F2 /* MessageContentTreasureFairyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA7B2A83977400B792F2 /* MessageContentTreasureFairyView.m */; }; 23E9EA7F2A839B2F00B792F2 /* MessageTreasureFairyModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA7E2A839B2F00B792F2 /* MessageTreasureFairyModel.m */; }; + 23E9EA842A84B6FD00B792F2 /* XPMineUserInfoTagModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA802A84B6FC00B792F2 /* XPMineUserInfoTagModel.m */; }; + 23E9EA852A84B6FD00B792F2 /* XPSoundCardModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA832A84B6FD00B792F2 /* XPSoundCardModel.m */; }; + 23E9EA882A84B75900B792F2 /* XPMineUserInfoHeaderTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA862A84B75900B792F2 /* XPMineUserInfoHeaderTagView.m */; }; + 23E9EA8B2A84B9BD00B792F2 /* XPMineUserInfoTagFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA8A2A84B9BD00B792F2 /* XPMineUserInfoTagFlowLayout.m */; }; + 23E9EA8E2A84BC9000B792F2 /* XPMineUserInfoHeaderTagCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA8D2A84BC9000B792F2 /* XPMineUserInfoHeaderTagCell.m */; }; + 23E9EA912A84BD5B00B792F2 /* XPMineUserInfoIndividualTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA8F2A84BD5B00B792F2 /* XPMineUserInfoIndividualTagView.m */; }; + 23E9EA942A84BE4800B792F2 /* XPGiftUserDataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA922A84BE4800B792F2 /* XPGiftUserDataViewController.m */; }; + 23E9EA972A84C37000B792F2 /* XPMineUserInfoRecordedSoundVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA952A84C37000B792F2 /* XPMineUserInfoRecordedSoundVC.m */; }; + 23E9EA9A2A84C39700B792F2 /* XPMineUserInfoRecordedSoundView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA992A84C39700B792F2 /* XPMineUserInfoRecordedSoundView.m */; }; + 23E9EA9E2A84C42B00B792F2 /* SGYProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA9D2A84C42B00B792F2 /* SGYProgressView.m */; }; + 23E9EAA12A84C53900B792F2 /* TTNewAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EA9F2A84C53800B792F2 /* TTNewAlertView.m */; }; + 23E9EAA32A84C80300B792F2 /* pi_new_loading.svga in Resources */ = {isa = PBXBuildFile; fileRef = 23E9EAA22A84C80300B792F2 /* pi_new_loading.svga */; }; + 23E9EAA62A84C97C00B792F2 /* XPMineUserInfoTagVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EAA52A84C97C00B792F2 /* XPMineUserInfoTagVC.m */; }; + 23E9EAAD2A84C9B800B792F2 /* XPMineUserInfoTagItemView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EAA82A84C9B700B792F2 /* XPMineUserInfoTagItemView.m */; }; + 23E9EAAE2A84C9B800B792F2 /* XPMineUserInfoTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EAAA2A84C9B700B792F2 /* XPMineUserInfoTagView.m */; }; + 23E9EAAF2A84C9B800B792F2 /* XPMineUserInfoTagHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EAAB2A84C9B800B792F2 /* XPMineUserInfoTagHeadView.m */; }; + 23E9EAB22A84C9DE00B792F2 /* XPMineUserInfoTagViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EAB12A84C9DE00B792F2 /* XPMineUserInfoTagViewCell.m */; }; + 23E9EAB52A84CB2700B792F2 /* XPMineUserInfoTagEmptyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EAB32A84CB2600B792F2 /* XPMineUserInfoTagEmptyView.m */; }; + 23E9EABB2A84CCBE00B792F2 /* XPMineDataSkillDataCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EAB92A84CCBD00B792F2 /* XPMineDataSkillDataCollectionViewCell.m */; }; + 23E9EB152A84D02400B792F2 /* XPMineUserInfoEditPickView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EB142A84D02400B792F2 /* XPMineUserInfoEditPickView.m */; }; + 23E9EB182A84D0E700B792F2 /* XPMineUserInfoEditMainTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EB162A84D0E700B792F2 /* XPMineUserInfoEditMainTagView.m */; }; + 23E9EB1B2A84D28A00B792F2 /* XPMineUserInfoEditTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23E9EB1A2A84D28A00B792F2 /* XPMineUserInfoEditTagView.m */; }; 73FFADDC93E195344047A2EC /* Pods_YuMi.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CACF623970097D653132D69A /* Pods_YuMi.framework */; }; 9B0086C627BA392B0032BD2B /* AnchorStageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B0086C527BA392B0032BD2B /* AnchorStageView.m */; }; 9B0086CA27BA4F570032BD2B /* AnchorMicroView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B0086C927BA4F570032BD2B /* AnchorMicroView.m */; }; @@ -1805,6 +1827,49 @@ 23E9EA7B2A83977400B792F2 /* MessageContentTreasureFairyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MessageContentTreasureFairyView.m; sourceTree = ""; }; 23E9EA7D2A839B2F00B792F2 /* MessageTreasureFairyModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MessageTreasureFairyModel.h; sourceTree = ""; }; 23E9EA7E2A839B2F00B792F2 /* MessageTreasureFairyModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MessageTreasureFairyModel.m; sourceTree = ""; }; + 23E9EA802A84B6FC00B792F2 /* XPMineUserInfoTagModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoTagModel.m; sourceTree = ""; }; + 23E9EA812A84B6FC00B792F2 /* XPSoundCardModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPSoundCardModel.h; sourceTree = ""; }; + 23E9EA822A84B6FC00B792F2 /* XPMineUserInfoTagModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoTagModel.h; sourceTree = ""; }; + 23E9EA832A84B6FD00B792F2 /* XPSoundCardModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPSoundCardModel.m; sourceTree = ""; }; + 23E9EA862A84B75900B792F2 /* XPMineUserInfoHeaderTagView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoHeaderTagView.m; sourceTree = ""; }; + 23E9EA872A84B75900B792F2 /* XPMineUserInfoHeaderTagView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoHeaderTagView.h; sourceTree = ""; }; + 23E9EA892A84B9BD00B792F2 /* XPMineUserInfoTagFlowLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoTagFlowLayout.h; sourceTree = ""; }; + 23E9EA8A2A84B9BD00B792F2 /* XPMineUserInfoTagFlowLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoTagFlowLayout.m; sourceTree = ""; }; + 23E9EA8C2A84BC8F00B792F2 /* XPMineUserInfoHeaderTagCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoHeaderTagCell.h; sourceTree = ""; }; + 23E9EA8D2A84BC9000B792F2 /* XPMineUserInfoHeaderTagCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoHeaderTagCell.m; sourceTree = ""; }; + 23E9EA8F2A84BD5B00B792F2 /* XPMineUserInfoIndividualTagView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoIndividualTagView.m; sourceTree = ""; }; + 23E9EA902A84BD5B00B792F2 /* XPMineUserInfoIndividualTagView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoIndividualTagView.h; sourceTree = ""; }; + 23E9EA922A84BE4800B792F2 /* XPGiftUserDataViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPGiftUserDataViewController.m; sourceTree = ""; }; + 23E9EA932A84BE4800B792F2 /* XPGiftUserDataViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPGiftUserDataViewController.h; sourceTree = ""; }; + 23E9EA952A84C37000B792F2 /* XPMineUserInfoRecordedSoundVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoRecordedSoundVC.m; sourceTree = ""; }; + 23E9EA962A84C37000B792F2 /* XPMineUserInfoRecordedSoundVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoRecordedSoundVC.h; sourceTree = ""; }; + 23E9EA982A84C39600B792F2 /* XPMineUserInfoRecordedSoundView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoRecordedSoundView.h; sourceTree = ""; }; + 23E9EA992A84C39700B792F2 /* XPMineUserInfoRecordedSoundView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoRecordedSoundView.m; sourceTree = ""; }; + 23E9EA9C2A84C42B00B792F2 /* SGYProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SGYProgressView.h; sourceTree = ""; }; + 23E9EA9D2A84C42B00B792F2 /* SGYProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SGYProgressView.m; sourceTree = ""; }; + 23E9EA9F2A84C53800B792F2 /* TTNewAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTNewAlertView.m; sourceTree = ""; }; + 23E9EAA02A84C53900B792F2 /* TTNewAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TTNewAlertView.h; sourceTree = ""; }; + 23E9EAA22A84C80300B792F2 /* pi_new_loading.svga */ = {isa = PBXFileReference; lastKnownFileType = file; path = pi_new_loading.svga; sourceTree = ""; }; + 23E9EAA42A84C97C00B792F2 /* XPMineUserInfoTagVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoTagVC.h; sourceTree = ""; }; + 23E9EAA52A84C97C00B792F2 /* XPMineUserInfoTagVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoTagVC.m; sourceTree = ""; }; + 23E9EAA72A84C9B700B792F2 /* XPMineUserInfoTagItemView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoTagItemView.h; sourceTree = ""; }; + 23E9EAA82A84C9B700B792F2 /* XPMineUserInfoTagItemView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoTagItemView.m; sourceTree = ""; }; + 23E9EAA92A84C9B700B792F2 /* XPMineUserInfoTagView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoTagView.h; sourceTree = ""; }; + 23E9EAAA2A84C9B700B792F2 /* XPMineUserInfoTagView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoTagView.m; sourceTree = ""; }; + 23E9EAAB2A84C9B800B792F2 /* XPMineUserInfoTagHeadView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoTagHeadView.m; sourceTree = ""; }; + 23E9EAAC2A84C9B800B792F2 /* XPMineUserInfoTagHeadView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoTagHeadView.h; sourceTree = ""; }; + 23E9EAB02A84C9DD00B792F2 /* XPMineUserInfoTagViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoTagViewCell.h; sourceTree = ""; }; + 23E9EAB12A84C9DE00B792F2 /* XPMineUserInfoTagViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoTagViewCell.m; sourceTree = ""; }; + 23E9EAB32A84CB2600B792F2 /* XPMineUserInfoTagEmptyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoTagEmptyView.m; sourceTree = ""; }; + 23E9EAB42A84CB2600B792F2 /* XPMineUserInfoTagEmptyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoTagEmptyView.h; sourceTree = ""; }; + 23E9EAB92A84CCBD00B792F2 /* XPMineDataSkillDataCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineDataSkillDataCollectionViewCell.m; sourceTree = ""; }; + 23E9EABA2A84CCBE00B792F2 /* XPMineDataSkillDataCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineDataSkillDataCollectionViewCell.h; sourceTree = ""; }; + 23E9EB132A84D02400B792F2 /* XPMineUserInfoEditPickView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoEditPickView.h; sourceTree = ""; }; + 23E9EB142A84D02400B792F2 /* XPMineUserInfoEditPickView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoEditPickView.m; sourceTree = ""; }; + 23E9EB162A84D0E700B792F2 /* XPMineUserInfoEditMainTagView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoEditMainTagView.m; sourceTree = ""; }; + 23E9EB172A84D0E700B792F2 /* XPMineUserInfoEditMainTagView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoEditMainTagView.h; sourceTree = ""; }; + 23E9EB192A84D28900B792F2 /* XPMineUserInfoEditTagView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoEditTagView.h; sourceTree = ""; }; + 23E9EB1A2A84D28A00B792F2 /* XPMineUserInfoEditTagView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoEditTagView.m; sourceTree = ""; }; 7DB00EC07F1D0ADFF900B38D /* Pods-YuMi.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-YuMi.debug.xcconfig"; path = "Target Support Files/Pods-YuMi/Pods-YuMi.debug.xcconfig"; sourceTree = ""; }; 9B0086C427BA392B0032BD2B /* AnchorStageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AnchorStageView.h; sourceTree = ""; }; 9B0086C527BA392B0032BD2B /* AnchorStageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AnchorStageView.m; sourceTree = ""; }; @@ -4071,6 +4136,8 @@ 186A533B26FC6ED900D67B2C /* View */ = { isa = PBXGroup; children = ( + 23E9EAA02A84C53900B792F2 /* TTNewAlertView.h */, + 23E9EA9F2A84C53800B792F2 /* TTNewAlertView.m */, 186A533E26FC6ED900D67B2C /* TTAlertView.h */, 186A533C26FC6ED900D67B2C /* TTAlertView.m */, 186A533D26FC6ED900D67B2C /* TTActionSheetView.h */, @@ -4365,6 +4432,7 @@ 189DD5A726DFA09700AB55B1 /* Tools */ = { isa = PBXGroup; children = ( + 23E9EA9B2A84C42B00B792F2 /* SGYProgressView */, 23E9E9AB2A81E8E900B792F2 /* Event */, E83645A42A40AEF600E0DBE4 /* Bundle */, E83645652A40A2CA00E0DBE4 /* CardManager */, @@ -4998,6 +5066,15 @@ path = fairy; sourceTree = ""; }; + 23E9EA9B2A84C42B00B792F2 /* SGYProgressView */ = { + isa = PBXGroup; + children = ( + 23E9EA9C2A84C42B00B792F2 /* SGYProgressView.h */, + 23E9EA9D2A84C42B00B792F2 /* SGYProgressView.m */, + ); + path = SGYProgressView; + sourceTree = ""; + }; 9B0086C727BA4F4A0032BD2B /* Anchor */ = { isa = PBXGroup; children = ( @@ -8189,6 +8266,26 @@ E88B5CC226FB429C00DA9178 /* MineInfo */ = { isa = PBXGroup; children = ( + 23E9EB132A84D02400B792F2 /* XPMineUserInfoEditPickView.h */, + 23E9EB142A84D02400B792F2 /* XPMineUserInfoEditPickView.m */, + 23E9EA902A84BD5B00B792F2 /* XPMineUserInfoIndividualTagView.h */, + 23E9EA8F2A84BD5B00B792F2 /* XPMineUserInfoIndividualTagView.m */, + 23E9EA8C2A84BC8F00B792F2 /* XPMineUserInfoHeaderTagCell.h */, + 23E9EA8D2A84BC9000B792F2 /* XPMineUserInfoHeaderTagCell.m */, + 23E9EA892A84B9BD00B792F2 /* XPMineUserInfoTagFlowLayout.h */, + 23E9EA8A2A84B9BD00B792F2 /* XPMineUserInfoTagFlowLayout.m */, + 23E9EAAC2A84C9B800B792F2 /* XPMineUserInfoTagHeadView.h */, + 23E9EAAB2A84C9B800B792F2 /* XPMineUserInfoTagHeadView.m */, + 23E9EAA72A84C9B700B792F2 /* XPMineUserInfoTagItemView.h */, + 23E9EAA82A84C9B700B792F2 /* XPMineUserInfoTagItemView.m */, + 23E9EAB42A84CB2600B792F2 /* XPMineUserInfoTagEmptyView.h */, + 23E9EAB32A84CB2600B792F2 /* XPMineUserInfoTagEmptyView.m */, + 23E9EAA92A84C9B700B792F2 /* XPMineUserInfoTagView.h */, + 23E9EAAA2A84C9B700B792F2 /* XPMineUserInfoTagView.m */, + 23E9EAB02A84C9DD00B792F2 /* XPMineUserInfoTagViewCell.h */, + 23E9EAB12A84C9DE00B792F2 /* XPMineUserInfoTagViewCell.m */, + 23E9EA872A84B75900B792F2 /* XPMineUserInfoHeaderTagView.h */, + 23E9EA862A84B75900B792F2 /* XPMineUserInfoHeaderTagView.m */, E8EEB8FC26FC2DF8007C6EBA /* XPMineUserInfoCustomNavView.h */, E8EEB8FD26FC2DF8007C6EBA /* XPMineUserInfoCustomNavView.m */, E88B5CC326FB42B000DA9178 /* XPMineUserInfoHeaderView.h */, @@ -8332,6 +8429,7 @@ E8A1E45C276220B100B294CA /* Resources */ = { isa = PBXGroup; children = ( + 23E9EAA22A84C80300B792F2 /* pi_new_loading.svga */, 23E9EA6C2A83813000B792F2 /* fairy */, 14D8768129A751E100E1DD7F /* Image */, ); @@ -8925,6 +9023,10 @@ E8D34D57280821F3009C4835 /* UserInfo */ = { isa = PBXGroup; children = ( + 23E9EA822A84B6FC00B792F2 /* XPMineUserInfoTagModel.h */, + 23E9EA802A84B6FC00B792F2 /* XPMineUserInfoTagModel.m */, + 23E9EA812A84B6FC00B792F2 /* XPSoundCardModel.h */, + 23E9EA832A84B6FD00B792F2 /* XPSoundCardModel.m */, E8D34D5828082357009C4835 /* UserGiftWallInfoModel.h */, E8D34D5928082357009C4835 /* UserGiftWallInfoModel.m */, ); @@ -9165,6 +9267,12 @@ E8E70D7F26F2F39000F03460 /* SubViews */, E8E70D7526F2F15100F03460 /* XPMineViewController.h */, E8E70D7626F2F15100F03460 /* XPMineViewController.m */, + 23E9EA932A84BE4800B792F2 /* XPGiftUserDataViewController.h */, + 23E9EA922A84BE4800B792F2 /* XPGiftUserDataViewController.m */, + 23E9EAA42A84C97C00B792F2 /* XPMineUserInfoTagVC.h */, + 23E9EAA52A84C97C00B792F2 /* XPMineUserInfoTagVC.m */, + 23E9EA962A84C37000B792F2 /* XPMineUserInfoRecordedSoundVC.h */, + 23E9EA952A84C37000B792F2 /* XPMineUserInfoRecordedSoundVC.m */, 9BD8D4E128911E9900AE03FF /* XPMineCollectRoomListViewController.h */, 9BD8D4E228911E9900AE03FF /* XPMineCollectRoomListViewController.m */, 9BD9A17A27A0EE24004186FE /* XPMineVisitorViewController.h */, @@ -9290,12 +9398,16 @@ E896EFB12771C93B00AD2CC1 /* XPMineFriendNumberView.m */, 9B734F71288A787000CBDAA9 /* XPMineAccountView.h */, 9B734F72288A787000CBDAA9 /* XPMineAccountView.m */, + 23E9EABA2A84CCBE00B792F2 /* XPMineDataSkillDataCollectionViewCell.h */, + 23E9EAB92A84CCBD00B792F2 /* XPMineDataSkillDataCollectionViewCell.m */, E824544126F58FCE00BE8163 /* XPMinePayPwdInputView.h */, E824544226F58FCE00BE8163 /* XPMinePayPwdInputView.m */, E824544C26F5BC1A00BE8163 /* XPMineModifPayPwdView.h */, E824544D26F5BC1A00BE8163 /* XPMineModifPayPwdView.m */, E824545726F5E65900BE8163 /* XPMineVerifIdentityView.h */, E824545826F5E65900BE8163 /* XPMineVerifIdentityView.m */, + 23E9EA982A84C39600B792F2 /* XPMineUserInfoRecordedSoundView.h */, + 23E9EA992A84C39700B792F2 /* XPMineUserInfoRecordedSoundView.m */, 9BE01ACC28925F7D00B50299 /* XPMineNewUserRechargeView.h */, 9BE01ACD28925F7D00B50299 /* XPMineNewUserRechargeView.m */, ); @@ -9377,6 +9489,10 @@ E8EEB8FA26FC2874007C6EBA /* XPMineUserInfoTableViewCell.m */, E8EEB90726FC579A007C6EBA /* XPMineUserInfoEditTableViewCell.h */, E8EEB90826FC579A007C6EBA /* XPMineUserInfoEditTableViewCell.m */, + 23E9EB172A84D0E700B792F2 /* XPMineUserInfoEditMainTagView.h */, + 23E9EB162A84D0E700B792F2 /* XPMineUserInfoEditMainTagView.m */, + 23E9EB192A84D28900B792F2 /* XPMineUserInfoEditTagView.h */, + 23E9EB1A2A84D28A00B792F2 /* XPMineUserInfoEditTagView.m */, E8B846C026FD82DC00A777FE /* XPMineUserInfoAlbumCollectionViewCell.h */, E8B846C126FD82DC00A777FE /* XPMineUserInfoAlbumCollectionViewCell.m */, E8D34D4B28080351009C4835 /* XPMineDataClanTableViewCell.h */, @@ -9648,6 +9764,7 @@ E80EC82E28ACD84000D133C5 /* emoji.xml in Resources */, E80EC87928ACD84000D133C5 /* emoji_91@2x.png in Resources */, E80EC84C28ACD84000D133C5 /* emoji_120@2x.png in Resources */, + 23E9EAA32A84C80300B792F2 /* pi_new_loading.svga in Resources */, E80EC83628ACD84000D133C5 /* emoji_147@2x.png in Resources */, E80EC86B28ACD84000D133C5 /* emoji_200@2x.png in Resources */, E80EC88F28ACD84000D133C5 /* emoji_121@2x.png in Resources */, @@ -9801,6 +9918,7 @@ E8AB633628AE54A40023B0D2 /* XPSailingPrizeCollectionViewCell.m in Sources */, E85E7B4E2A4EB0D300B6D00A /* XPMineGuildSetNameViewController.m in Sources */, 2331C1642A5EB71000E1D940 /* NobleInfo.m in Sources */, + 23E9EB182A84D0E700B792F2 /* XPMineUserInfoEditMainTagView.m in Sources */, E824543A26F5880E00BE8163 /* XPLoginVerifBindPhoneProtocol.h in Sources */, E821077E2987D67100DE7040 /* MessageRiskAlertModel.m in Sources */, E818DD222A48977F00F163F7 /* XPLoginAreaTableViewCell.m in Sources */, @@ -9841,6 +9959,7 @@ E8950183282CAC6A007E459A /* XPMonentsPhotoView.m in Sources */, E8AC721E26F472BF007D6E91 /* XPMineSettingProtocol.h in Sources */, E8F63CB4298B563D00B338BA /* Api+SayHello.m in Sources */, + 23E9EA972A84C37000B792F2 /* XPMineUserInfoRecordedSoundVC.m in Sources */, E81E09C9290F71BF00A1F410 /* XPAdvertiseView.m in Sources */, 9BC5C91F277C902B007C8719 /* XPReleaseRadioView.m in Sources */, E84843AF27F59E7E0050D365 /* XPRoomPKResultView.m in Sources */, @@ -9887,6 +10006,7 @@ E82109B026F1D83500FC3319 /* LoginBindPhonePresent.m in Sources */, E81C1B1F27705F7A0020D1E4 /* XPArrangeMicViewController.m in Sources */, E8B825C726EA0D9A009E8E9F /* LoginVerifCodeProtocol.h in Sources */, + 23E9EAAE2A84C9B800B792F2 /* XPMineUserInfoTagView.m in Sources */, 2331C1B32A60F32D00E1D940 /* XPCandyTreeMoreRuleCell.m in Sources */, 14A6034C29A35EE600D2A6A5 /* XPMineItemTableViewCell.m in Sources */, 9BAC92F528E6E63000147DD8 /* XPRoomInsideOperationCell.m in Sources */, @@ -9913,6 +10033,7 @@ E87E62682A3F571D002F68C9 /* XPHomeContainerPresenter.m in Sources */, E8EEB8F326FC2050007C6EBA /* SDWaitingView.m in Sources */, E85E7B2F2A4EB0D300B6D00A /* XPGoldIncomeSectionView.m in Sources */, + 23E9EAA12A84C53900B792F2 /* TTNewAlertView.m in Sources */, E8DEC9A12764A5D20078CB70 /* XPRoomMoreItemModel.m in Sources */, E80EC81028ACD84000D133C5 /* QExtendBoardView.m in Sources */, 9B87B3CD2926473D00085110 /* XPSessionListHeadFriendCell.m in Sources */, @@ -9937,6 +10058,7 @@ E87E62772A3F5907002F68C9 /* XPNewHomeRecommendTableViewCell.m in Sources */, 9BA812D228BF145700783EA7 /* ClientRedPacketModel.m in Sources */, 1427219229A75F6F00C7C423 /* MultipartFormDataParser.m in Sources */, + 23E9EAAF2A84C9B800B792F2 /* XPMineUserInfoTagHeadView.m in Sources */, E890BC04273CF0500007C46B /* XPGiftCountModel.m in Sources */, E899C68C275093B800E189E5 /* XPUserCardMicroItemModel.m in Sources */, 2331C1B52A60F32D00E1D940 /* XPCandyTreeViewController.m in Sources */, @@ -9981,6 +10103,7 @@ E82EE0F8272FDDFA00D15DC1 /* UserPrivacyView.m in Sources */, 2331C1672A5EB71000E1D940 /* NobleLevelUpModel.m in Sources */, 9BA812E428BF70A600783EA7 /* XPRoomRedPacketPwdView.m in Sources */, + 23E9EB1B2A84D28A00B792F2 /* XPMineUserInfoEditTagView.m in Sources */, 2331C1662A5EB71000E1D940 /* NobleCenterModel.m in Sources */, E8998D8B2859CB6A00C68558 /* XPMineUserInfoGiftWallSubViewController.m in Sources */, E8DEC9A42764A6600078CB70 /* XPMoreMenuPresenter.m in Sources */, @@ -10006,6 +10129,7 @@ E85E7B632A4EC35A00B6D00A /* XPWithdrawAccountModel.m in Sources */, 23E9EA642A837BE400B792F2 /* XPTreasureFairyShopingView.m in Sources */, E87DF4D42A42C9B1009C1185 /* HomeRecommendRoomModel.m in Sources */, + 23E9EAB22A84C9DE00B792F2 /* XPMineUserInfoTagViewCell.m in Sources */, 9B42869C28C1FD3D009034D2 /* XPOpenRedPacketCell.m in Sources */, 9BFE992E288142FD009DA429 /* RoomClassifyModel.m in Sources */, 142721AB29A75F6F00C7C423 /* DispatchQueueLogFormatter.m in Sources */, @@ -10060,6 +10184,7 @@ E88863D3278ED4C0004BCFAB /* Timestamp.m in Sources */, E8A3540A28FEC0510014A784 /* XPWishGiftListView.m in Sources */, E88863CF278EC393004BCFAB /* XPAcrossRoomPKPrizeView.m in Sources */, + 23E9EA8E2A84BC9000B792F2 /* XPMineUserInfoHeaderTagCell.m in Sources */, E87DF5082A42CE79009C1185 /* XPInRoomRecordPresenter.m in Sources */, 189DD6FF26E20E5900AB55B1 /* HttpRequestHelper.m in Sources */, E85E7B062A4EB0D200B6D00A /* XPGuildSearchPresenter.m in Sources */, @@ -10071,6 +10196,7 @@ 9BD63FAB277EE885006EB744 /* Api+RoomRadio.m in Sources */, E8A30BF328534B17003B4873 /* Api+FindNew.m in Sources */, E852D7412863249F001465ED /* XPMonentsReplyTableViewCell.m in Sources */, + 23E9EA942A84BE4800B792F2 /* XPGiftUserDataViewController.m in Sources */, 2331C16D2A5EB71000E1D940 /* XPNobleSettingNavView.m in Sources */, E8AEAED6271412EC0017FCE0 /* XPRoomViewController.m in Sources */, E80A086527F318620027B30C /* XPRoomPKPlayingView.m in Sources */, @@ -10122,6 +10248,7 @@ E8664ED627E434D5000171BA /* XPRoomPKRecordViewController.m in Sources */, E87E914E2796678D00A7B3F2 /* XPMineDressEmptyTableViewCell.m in Sources */, 9B7D804D27537950003DAC0C /* MessageCell.m in Sources */, + 23E9EAA62A84C97C00B792F2 /* XPMineUserInfoTagVC.m in Sources */, 9B044D9D282D2A6400DE4859 /* XPRoomAnchorRankEnterView.m in Sources */, E8950180282CAC49007E459A /* XPMonentsUserInfoView.m in Sources */, 18F404C927609A4300A6C548 /* MessagePresenter.m in Sources */, @@ -10264,6 +10391,7 @@ E81366F626F0C0DF0076364C /* LoginFullInfoPresenter.m in Sources */, E8A30BEE28534AB1003B4873 /* XPSessionFindNewPresenter.m in Sources */, 9BDA3E7727FD41C200517FE6 /* XPAnchorFansTeamViewController.m in Sources */, + 23E9EAAD2A84C9B800B792F2 /* XPMineUserInfoTagItemView.m in Sources */, 18A61BE8274F9CF000A09A54 /* SessionListViewController.m in Sources */, E8C1CD6A27D8937800376F83 /* XPRoomFaceCollectionViewCell.m in Sources */, 9B2EA7C02804037700ED17BF /* AnchorPKStageView.m in Sources */, @@ -10300,6 +10428,7 @@ E8751E6B28A64C6E0056EF44 /* XPSailingRankTableViewCell.m in Sources */, 9B1B72B528003664003FACE9 /* Api+AnchorPk.m in Sources */, E8EEB90626FC5772007C6EBA /* XPMineUserInfoEditViewController.m in Sources */, + 23E9EA912A84BD5B00B792F2 /* XPMineUserInfoIndividualTagView.m in Sources */, E8B846D626FDE01B00A777FE /* XPMineRechargePresenter.m in Sources */, E8A30BF628534B35003B4873 /* FindNewUserInfoModel.m in Sources */, E801274027E323C800BAC3F2 /* XPRoomPKViewController.m in Sources */, @@ -10319,6 +10448,7 @@ E8DAC5AC2858305A00012CFD /* XPRoomMessageBubbleView.m in Sources */, 1427218929A75F6F00C7C423 /* HTTPDataResponse.m in Sources */, E8B9843028AB90200022D026 /* XPMoentsTopicListView.m in Sources */, + 23E9EA9A2A84C39700B792F2 /* XPMineUserInfoRecordedSoundView.m in Sources */, E8E20BDE28164D3A0033B688 /* SessionNavView.m in Sources */, 9B734F76288A92FB00CBDAA9 /* XPMineFuntionItemModel.m in Sources */, E82D5C70276AE60000858D6D /* HeadwearModel.m in Sources */, @@ -10326,6 +10456,7 @@ E880B3A1278BD60C00A83B0D /* XPAcrossRoomPKSelectRoomView.m in Sources */, 9B3C181A292CE4FA003AF543 /* XPAnchorPKMatchView.m in Sources */, E80EC80D28ACD84000D133C5 /* QInputBarView.m in Sources */, + 23E9EA852A84B6FD00B792F2 /* XPSoundCardModel.m in Sources */, E8D48250278D68BA003C1D08 /* XPAcrpssRoomPKPanelView.m in Sources */, 23E9E9B52A81E8E900B792F2 /* XPAdjustEvent.m in Sources */, 18F404C3276098F100A6C548 /* Api+Message.m in Sources */, @@ -10394,6 +10525,7 @@ E8E70D8C26F2F5A500F03460 /* XPMineHeadItemCollectionViewCell.m in Sources */, 9BE9F0FC27FED2E100667200 /* XPAnchorFansJoinModel.m in Sources */, E87DF50B2A42CEC9009C1185 /* HomeEveryOneSearchModel.m in Sources */, + 23E9EA8B2A84B9BD00B792F2 /* XPMineUserInfoTagFlowLayout.m in Sources */, 186A534A26FC6ED900D67B2C /* TTActionSheetConfig.m in Sources */, 9B6E856A281A982A0041A321 /* XPRoomRecommendView.m in Sources */, E8DBB6FD27B63CE000AA285D /* LittleGameMicroView.m in Sources */, @@ -10522,6 +10654,7 @@ 23E9EA4B2A837BE400B792F2 /* XPTreasureFairySendView.m in Sources */, 9BD8D4E628911F7700AE03FF /* XPMineCollectRoomListPresenter.m in Sources */, E866B6E52759F96F009B002A /* XPMiniRoomView.m in Sources */, + 23E9EAB52A84CB2700B792F2 /* XPMineUserInfoTagEmptyView.m in Sources */, 2331C1AE2A60F32D00E1D940 /* CandyTreeInfoModel.m in Sources */, E818E34B286ECABF005EDF68 /* XPMonentsPublishPresenter.m in Sources */, E85E7B462A4EB0D300B6D00A /* XPGuildEmptyCollectionViewCell.m in Sources */, @@ -10550,6 +10683,7 @@ 9BFE0D8E2898C8C300F53C24 /* XPAnchorCardSkillCollectionViewCell.m in Sources */, E87DF4B72A42C2FD009C1185 /* XPFirstRechargeCollectionView.m in Sources */, E85E7B382A4EB0D300B6D00A /* XPMineGuildSearchMemberTableViewCell.m in Sources */, + 23E9EA842A84B6FD00B792F2 /* XPMineUserInfoTagModel.m in Sources */, E8998D852859B4FA00C68558 /* XPMineUserInfoGiftView.m in Sources */, 186A536B26FC6F2E00D67B2C /* XPShareItemCell.m in Sources */, 9B42869228C1AED4009034D2 /* XPReceiveRedPacketModel.m in Sources */, @@ -10562,6 +10696,7 @@ E872309326E8D31500B90D4F /* LoginVerifCodeView.m in Sources */, E82107872987E49100DE7040 /* MessageRedPacketModel.m in Sources */, 23E9EA5F2A837BE400B792F2 /* XPTreasureFairyExchangeView.m in Sources */, + 23E9EA9E2A84C42B00B792F2 /* SGYProgressView.m in Sources */, 23E9EA622A837BE400B792F2 /* XPTreasureFairyTrialsView.m in Sources */, E87E91552796B6DE00A7B3F2 /* XPRoomInviteUserViewController.m in Sources */, E880B3B5278C1FE400A83B0D /* XPAcrossRoomPKPresenter.m in Sources */, @@ -10623,6 +10758,7 @@ E85E7B362A4EB0D300B6D00A /* XPClanRoomCollectionViewCell.m in Sources */, 18F4043A275E20D900A6C548 /* TRTCRtcImpl.m in Sources */, E8899C7F27853B6A007944BE /* DatingMicroView.m in Sources */, + 23E9EA882A84B75900B792F2 /* XPMineUserInfoHeaderTagView.m in Sources */, E87DF4EC2A42CB60009C1185 /* XPSearchListTableViewCell.m in Sources */, E85E7B052A4EB0D200B6D00A /* XPClanPresenter.m in Sources */, E85E7BA52A4EC99300B6D00A /* XPMineChooseGiveDiamondView.m in Sources */, @@ -10729,6 +10865,7 @@ E87C0A9D27D9986700CB2241 /* XPRoomFaceCollectionFlowLayout.m in Sources */, 1427212C29A757EC00C7C423 /* MonentsListInfoModel.m in Sources */, 23E9EA432A837BE400B792F2 /* XPTreasureFairyPrizeRecordCell.m in Sources */, + 23E9EB152A84D02400B792F2 /* XPMineUserInfoEditPickView.m in Sources */, 9BA812D628BF52E100783EA7 /* XPRoomSendRedPacketViewController.m in Sources */, E86E79D328A4E94E006DAF48 /* SessionRiskView.m in Sources */, 23E9EA552A837BE400B792F2 /* XPTreasureFailyPrizeGiftView.m in Sources */, @@ -10746,6 +10883,7 @@ 9B0086C627BA392B0032BD2B /* AnchorStageView.m in Sources */, 9BCD02C72796C02800F396AA /* MicroNobleWaveView.m in Sources */, E874B88827215D39003954B9 /* MicroStateModel.m in Sources */, + 23E9EABB2A84CCBE00B792F2 /* XPMineDataSkillDataCollectionViewCell.m in Sources */, E877A7F427842EF800EFACED /* XPRoomDatingVipUpMicView.m in Sources */, E896EF9F2771AE7B00AD2CC1 /* XPMineAttentionViewController.m in Sources */, E89D60C1271D64B9001F8895 /* RoomInfoModel.m in Sources */, diff --git a/YuMi/Assets.xcassets/Monents/monents_info_top.imageset/monents_info_top@2x.png b/YuMi/Assets.xcassets/Monents/monents_info_top.imageset/monents_info_top@2x.png index 816cd22a2b38fa6b37938462552792921c624b0e..1dab13a176c21d80f05ed5f9141166f60aae3ef6 100644 GIT binary patch delta 1108 zcmV-a1grbV2k8iqB!8YzOjJedSWf6nM(I#T=uAfFOGWHZN9j#R=}kuf008Y^TI*9t z@=;OiLqq6GM(9gL=}brJR80Nr>*z~H_OY)0@9yYJM(IsP>rF@KOGf8RM(IsQ@}QmR zPDbifOzTcg=}SiFOh)KTM(IpN=uJoHO-AflQSyU)>t}Fy1wX*0;M(uKK@P>lvPDk&0c=3#f`OL}jo|*E9 zf%K`S@sp7Bsiyqv>-_5K`r6t1;^O(y&-lm1>ttT`vasxHXZ5kK`q9trb#eK}#qWN4 z>}+QAr=;(Qgn#jpkM*&y^PHLPb#eRW=kSPw?tXdkl8*74nf0%%=~YkrgwuSR_Rty_|VY!$j0@wuj&_xASo z_4M-a?tkv>=;-F=<>BGr*x1+A&&bHYxwx{etD~Hml8=s!iH3P`aBXU5UtU^QNk2X> zU8&2h00061NkliPaZ3Z!LqWMG^|rPleH|cx_==N-4vQtFRM=P z>vTF}kD6ktpzDsK>p>XkdJU%tO{L%Mq5&&%rw{xkj?J~?0qu|tD5L^Sn+PX0O?wZr z=6}P(f2cDrQV?Ypff7^DP7HqK2G6lp zOQ-4+I#m@@Cea%za_Qt}!L|zve8yfC^N>nZq64Z#NlraJ{VD3=0#IsRVRGb8s}Fd5 z>&K|=S9z+(Uu0 delta 946 zcmV;j15Nzt2*?MJB!4?lOjJedPDKC!0R3D-=uJiGO-AEKN9jyO=}kuHOGW8RM($BZ z>rYAPOh)TYM(|5R=uAfGOh)NUMCnXM=uAcGOh)NVM(IsO=uJfEOhxBRMC(jM=}boG zO-AZWM(RsM=u1ZFOhxHTMea^R=}SiGOGfgTmFi4I>r6!JR)0_EOhxHSMe0mO_ot-o zO-AocMCnXM>PtlHO-1NTM(9jM@PmKoO-ATTMeb{6>PQqnkmXhpVS%2_(aqV1H?|^siWL)S>M(~M+?|ypibZ_yKknCw>^PZdg-Q4-o(D=y4 z_Px9Hv#|82rRrZ<{pjcMlaJ|CPU%!n91(kg00012bW%=J8UP50uo9kn)s-G6wLT&3 zzC+r>rwL!K$gJpOlY>V?{naNaA(b0005yNkll;2(813xXhkunBqK zEhs=PI)6O11^Kuvzy-)h;s2#1%TXcbm*)6LG06$CxwIYO$(a3z@^XbXSbUMAZ8mC;- z)Me9@HPdv@rZ#Yrm3sM$+<8rtY9-X~M`tyWvVU}4L!DbqNgaHex%U~?_OU2Nltiit(y$I2DXCZQ=j?_pkk&aHpRNb!eQ^qnwA9hn zck_0`i&d<(Ne!3JmwNIs^oOJKC`z$9VdqV~dF*+QKA-YD?}Zel$~976NFC$hLW*4a zNq=qw;i<7i#tSJ0>zSz^{2e($h7 z&`Qv4YHk-e5ld+)>A~;FGaA@SXV}0aO)IMh%EPe)A!f&^+}1>X%PZHFn&YDX3&&k_ UzVi`BasU7T07*qoM6N<$f)t_Y(EtDd diff --git a/YuMi/Assets.xcassets/Monents/monents_info_top.imageset/monents_info_top@3x.png b/YuMi/Assets.xcassets/Monents/monents_info_top.imageset/monents_info_top@3x.png index 88d813a4a2b851cd4f766fc26c35e1e04570dd12..2b961e15ed8e0daf1b8ca651e147680169b1e1a5 100644 GIT binary patch literal 2239 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 F`42^<4h#SQ diff --git a/YuMi/Assets.xcassets/jm/Guild/mine_guild_close.imageset/Contents.json b/YuMi/Assets.xcassets/jm/Guild/mine_guild_close.imageset/Contents.json new file mode 100644 index 00000000..75155bc4 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/Guild/mine_guild_close.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_guild_close@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_guild_close@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/Guild/mine_guild_close.imageset/mine_guild_close@2x.png b/YuMi/Assets.xcassets/jm/Guild/mine_guild_close.imageset/mine_guild_close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f478d22c599da9f4fecb48ca6fcd7a70f551da GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u#3?$#IayJ4}q5(c3u0VS8=0mGit=hc#Fp#l% z^AR9}(Xo(Uw-hHi2zI4;>EOJNU&WEkKYb;!MVY9+Q|rn<55=8~5eS7dA`g0qte*boFyt I=akR{01I$VwEzGB literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/Guild/mine_guild_close.imageset/mine_guild_close@3x.png b/YuMi/Assets.xcassets/jm/Guild/mine_guild_close.imageset/mine_guild_close@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..79dd8e9180041be31f004c47661d6ef54ee7cc1a GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^P9V&}3?v1sWN!m0l>na*S0KH4^Wn{#k8Ig;Xv>x@ zn>HQZvbOgS{DK({$!!$;zI)kg3yn)V?*0P`AMkW> z4DmRgEWx_CAul0v2a}M$Z4P5w*PFX;9DI|%zGLALy|~-l>VRe6?sE2o6)W!TjpoQ} z`SR{AtAy5+^7r@FG#qkcXt5LInCvQ*Bgdrh<{rnz6+5JF`f9wppWBj|k3?#4J%UA`Zo(K4ZxB}__U~vD*{}*5X|NZ~} z%b)*meu9MF{rrFL>;HdX+28*_QV{U)8;HLB8AN{l^Z&yy5aZi#sIE`n{{t0&{{8>c zum9IRg3!Is|DS&QfAbTF{rvm?8=wAP|M>sW*Z+4u|Ns8y|Lb4>uYdmk;^+UHpZ|XW zTlVzF|Ia`Fzxf6-=jD(8Prm+t_Wl2lzyF{A09gby>d*iGufUc94SD(-iwj&r9DPp?l8cX1IF z{rUFo>$6J~6#o7E`SZ<<>(|d7KD=c5^#1hp@bCarQ+3`iUtZps(pg%Xn7HGOv?2oo zqm!qLV~EA++6&K%nj9orA1bRZWOaG7x4c(%?;5FKlaqhr{Y{vEY-Hm9e{PTQ8@&~a zG`V+{SgD^#6MU#MS8!Kr@ky4)Dw8;Zc*G6`I4ofi^YWOec2G&>kC$MC%E8}@4<<>x z+Z(Y)rSC*zk?~W_v+~^RVv=nPX@7Ke7=C?w!o}`gDZPOCsF6IQzPX9k^n`uFc`dCD z;lf1`EFT-!7=5~bgtg|nWc^v?&z=)Fg6>5duP6{)xo2zBD{;Y|JzKkSLR41Xo7MWu zIc8FG`rlC3hs__93q7texg}n7TKbw}DeptK_1mRav6TGCh`hm4!r*gFy`SOP_ty(J z`DSI`zZ+8%SLiG3{!MFIZ~fmL%ih~|eG~H(epnFVdQ&MBb@05Wc= AO8@`> literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/Guild/mine_info_close.imageset/mine_info_close@3x.png b/YuMi/Assets.xcassets/jm/Guild/mine_info_close.imageset/mine_info_close@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..949eca43a27c6064601f55532947a7db6fd6b928 GIT binary patch literal 1182 zcmXw%2~ZPf6vwwH$|X!IP;MwA*cL72sDPpd0SSX(6e33}MKS>drLC#pQG!VgkvbqK zv62YF6hW|pQVOLJ3WcWD3CJbENWvlEtUwZSY)JC;+gRVs?zivz-uwT5Z+8m`F%etL z9Lx{|*%FBlI||ob*k!T--nkt13WB_IiEt<`9HxtEAOlz|sR617ua#hO4NH|MSW#gQ zqBX$hV-GO&Zx#Til|Zfq^7a4oF&UQ5D1k}`1TvsAY>VZXCQP-4wh1}5JD~uYw<=Hs zhDd?wpa9GPu#5tU3UgW2U`GpTu&eLF zU_FfIQt;9+0@kGlkPR}-8fJkC0(dINP$AWr6hI$n3gMxPcnup?sRav$V#qL~0_$3! z)?+nrD7gPGib=gju}R;=D?=ly!Wq zM|Yip-yrMTqcO3F-dN{lXKpv?Wu-|l9&WgH+QY+1yC#*+Pl?67EY`K+qTC!(>gVyX zvBALs)*IEbWzmx-?e)c{387vlT8#!>lgU=+=cmR;hlY4PZEbB0MU3o}Bs@G)NT#QT z9yc{rRTa=_`CbDvzBLG9lo}Zp5{LhrHIyFfaKxG?WpWd3OD%tJ>j>yhCKZatxC0?p9lZGGMkwl}+!R|N&FEUNDB)>Gq?v)?P? zI#VO>;;Bpyj?ez(p3%+QHb&v;+>b|=chH$N^+f+D_N5astqsvFo_$qn_v^wkYv~cL z`^YEVop{l{>t%7FHQPd>*6`c_ls>T*y9uY7xf z#7r9KG3Zx#vz;iU<=m)94w>WGl;`zFWE||#GA!+Joho`xn?`UxuX~uY`O4DeYO;fB zc&p|6G^gw`A}{&t=7$!~`0xH?{F$WUB41^1)f`deSJDxa=5}@C{^6wyk={-`p0_Ql zT08ZPu4~ioKbn(pjt^Xy!nz0rjq4g3BBVYHw6`C%YB`>sf6sOQuvN-U z)F(5Md}^TAfq+Y`jY`_-c>c^kzJHkzZtbZh`b}_1mF-3dIkC+7XJ^VzFJWkZ2I;p{ zs(``^pl7}6raWbT@#rGc<+j||)W5Yd^l6t;DG#N&IO-o+I*b1-u>mYP?|zDDfbWgE zP0?ut(%}lKuP2#V9Hbe*uYH(#(D};|ye$#uQ&&q3@L~CWf8yB=YF361Y4hQeSxHXO zU$NX$er0r;Up{s0N~wrt*}9PM!Xx9*N4@cT7TM3wg@jPTq{3-VHKVYQF_1PsOAO@b YjZTt1gISeP*iVi`hR1|89!R182Sj4-y#N3J literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/Guild/mine_info_paly.imageset/Contents.json b/YuMi/Assets.xcassets/jm/Guild/mine_info_paly.imageset/Contents.json new file mode 100644 index 00000000..d0b016a1 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/Guild/mine_info_paly.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_info_paly@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_info_paly@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/Guild/mine_info_paly.imageset/mine_info_paly@2x.png b/YuMi/Assets.xcassets/jm/Guild/mine_info_paly.imageset/mine_info_paly@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb55780fda9d31b67dd4f1eaa5ff97f7d6c0512 GIT binary patch literal 552 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`Z76tf(xB}^i-~K=U`Tx_W|L?y2 z2ZBE!;{TH`|3Cl!|L_0*JD))$5ZwRr|1X#UR1X9|@)?)`7W;qgBZ&U;=l_RaAokO5 z|G)kI|NbY4{rvm?8=pY3Z-4&3{_+3oU;nRv262JlAwZjrff9n@HS9Z z>^;(9>c6ScKU6bCd0~A|YWI#^-rJ-e9Lw*o(U__7*DhLxSs>Q*e4)*@EgS{wkFe!z z^Jw@o)giHa$%kFa{Hx8GT6H%aT4OzH;dh?}8(gdUT|d9e==*Bjct|Yr@da7gf?o;& zHV0~lj=pHN#g-eZbP9uGqC|g8-m}Hy!}*P~q)$5@ z<=ZdSV%Cv6Q~EU9W0m`Coy-l|hpL3cc1(X?HzSsB^Mjf@I%<=TKC9q6@P|ow+Kh9K Tw=Nw81}1~2tDnm{r-UW|eR4+7 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/Guild/mine_info_paly.imageset/mine_info_paly@3x.png b/YuMi/Assets.xcassets/jm/Guild/mine_info_paly.imageset/mine_info_paly@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2356d9482f61758da96f28fbbd96a40e8205b46b GIT binary patch literal 975 zcmeAS@N?(olHy`uVBq!ia0vp^W+2SL3?z5Yp7oxAfl)BPC&U%Vef9nSyPyBR{Qm#y z$A2LB@%R6afBzqU`Ty$c|JUC^BLDvX|NH;{gRdYq5d8fI5&?o|-$0Bf-~QkI^8d!C z|IfdJ$j^U3B47Uezy1lN2B`7zxBt(-f!IJ3{`~uY?=y(~<|jzO%OC%L{|9LVg8N|c z`(HuMxCz$#2&@Yv_y7MxnC-8B{J;9~|8201K=Btpphf}N-~ar7|Lgztk01x!`1t?f zcc?i)Gl6dS@azBAKmULI`~UVQ$cj6k|9|=o@(a**pmpE>{(tfP|I=^(r`~vQ7#Jwt zB|(0{46F?e4G$Y6#rb)DM)d#r{pI6}yxh)TzkYoB_~PN6>z9rl+PG@voT*d#`#PE% z%FB|IA|ir=?QPW5I5|GOc=+JXrDMmo1Hr018yg{`WN`)tCM8c7#}JR>b1%FMdgLI& z`rvZbnWRJO8rF1eTJc6>$NOwI_Y|4*XMg2Wv}Rq}XU@hH|8@T5QvbZA4^^-1%Z#0O z?9js-FPEl%3vE1kWnE~`jY%FCU#*gOuMpR9OYWjm%z^oNTHE-KUU`_jUSwmft5@}p zz6`Bz5njOu4zJL^DXepq*C0zZ$6sXKik$G)H=pi?EBLE`~?u zggd-BRx!nOcf*Fb&a<@)zh~PBO>2m%QQP+L#P}#_kqF*f7K&BGuoy_JPe#9 zT5;Xa{?s+IYZX(L-u|)RzMbF0u=dw>(tD=vJ-$5bg}cK-v3(tG8VRcv6%0?ER9KsG zlVRaBXU4Lrp$2Zsma`OY8az;pI{rBNxNhTno17(X`O5Pr->PWf-&_3Y+2bXP56|Cm zdVQ7k>Yvt)AGgH4O`2Mwmu1U4nKSpo%DYecgH|s7wt-n N!PC{xWt~$(697itTB-m5 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/Contents.json b/YuMi/Assets.xcassets/jm/RecordedSound/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/RecordedSound/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_bg.imageset/Contents.json b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_bg.imageset/Contents.json new file mode 100644 index 00000000..60e20bf9 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_recorded_sound_bg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_recorded_sound_bg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_bg.imageset/mine_recorded_sound_bg@2x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_bg.imageset/mine_recorded_sound_bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b63c1e8adf50f4201b6f5b391ea15db337e16f85 GIT binary patch literal 13431 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 JEB_(%e*m`MXbJ!T literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_bg.imageset/mine_recorded_sound_bg@3x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_bg.imageset/mine_recorded_sound_bg@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bf4a021e45aa8566eff9383a6c86221b7966aaaf GIT binary patch literal 30719 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 ZC>ek4RVaItyYUqW85`mZ^7Zfd{}0|0W#9k+ literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completeding.imageset/Contents.json b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completeding.imageset/Contents.json new file mode 100644 index 00000000..5afa3711 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completeding.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_recorded_sound_completeding@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_recorded_sound_completeding@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completeding.imageset/mine_recorded_sound_completeding@2x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_completeding.imageset/mine_recorded_sound_completeding@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..69573bceb77169ba34903023720cd5b08ad69e52 GIT binary patch literal 2141 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 F{{yNzQH%fp literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_del.imageset/Contents.json b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_del.imageset/Contents.json new file mode 100644 index 00000000..db376936 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_del.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_recorded_sound_del@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_recorded_sound_del@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_del.imageset/mine_recorded_sound_del@2x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_del.imageset/mine_recorded_sound_del@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7b275a4802e686933beb0282dc308141fa9060 GIT binary patch literal 1329 zcmV-11Px(>q$gGR9HvNm|1MxR1}8)Bs8T$(9$#+ALJR2XU5|sZpKLX zY3zH>f4_U~z30rmgoICTmv#daJqyAL0Idn#ros4yn4cIem_tc?D2b5|;}Pv4f|SHQ zYQv18#JoNUR3acnWWOWu%7wsGd>AxrJGoW!X(R$tg?0>}_Ocis1Jj30n4U|V7_A__ z37|!R-<0K;!SC5U69VZRN-%a=u5sIZBlX)=S$`LVO%+?qG3M=WUW1abr~)yt({_wI zk^m_}f0KazRDp!pa7GKf$#5+&Oxrc|gg_<%eHGgoNM}0Ez@a&(T9LIYi0Byrr^OmF zxqaB3vB7PGf6lU=|%*;=cDzrR6BFTvVYa0ggqzElf{~I87sHaO` zElJo~o-#hSx=l;*_y@pmX-0;Da|l>cqv=om2!O+$ho|axncAh_4GFJTlNmPKj`4Py zK#IuTPT;DhhkLAovAxnqJ&@3@0%&g)h;Fr=+PJZVbF=Rf(wx9RR)d%EPc+eEY!U@p$kW%&u?+gg9MTYnjhQ1j^V zKTke*@Qbj|hSE`6NaM;xuh_7e;q9!Bh%Ov;azFX+y&`)7gMX~HN&TbFz*}`da&`xZ z?+m^jw;UrV+T|}XK)MT{%Wq`HpzRu3eT13=Qe@pALRph}+;YuQU$Il>e^h0CKM3as z2H#kYab=o7s;qqlqOvCASIadjeZ@yek@YW$usU!Uv0P($xiqO#?^~ z*=qUdS2vulXnQ0A( zci4_uSF3tNwx76Et3J0~t)UY)P+pN41rh(d=bfUjip=|@` z!P!zuEKo3#FnNLL4a?0{66J|9)Y;b_9GQ8>cFl%cl-QH2Dp%7x7(TcHec_&C%CvU? zN_3&HV8U50En=rk>C~4agW<^eX~BI*9T_-^qPNN(A3P9koAvg?|FbS-q!$6cym~j( nEE7)ww9hMgk3B`HTnd00000NkvXXu0mjfhNNjU literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_del.imageset/mine_recorded_sound_del@3x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_del.imageset/mine_recorded_sound_del@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8320b2b56d85a7b606a6a2519dfba1a5bf01f5b4 GIT binary patch literal 2384 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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_mic.imageset/mine_recorded_sound_mic@3x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_mic.imageset/mine_recorded_sound_mic@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ba95f75e7e29dc5d7c8b00404b83ae56949ddc78 GIT binary patch literal 9020 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 Isy+?*KWv{j?f?J) literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_recording.imageset/Contents.json b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_recording.imageset/Contents.json new file mode 100644 index 00000000..c18b7d14 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_recording.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_recorded_sound_recording@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_recorded_sound_recording@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_recording.imageset/mine_recorded_sound_recording@2x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_recording.imageset/mine_recorded_sound_recording@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..385aa66d296b01227bf9b25ac5486c8f686331ec GIT binary patch literal 2405 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 L_NU6tE6 zM{>5ct;yXJVxfp^-yNS{&-?Xyzu&L-AMk#^-U)CQTLn3FISB~~1$#RyhpBE5jg=HjAN(On2fLsi!3P52!AXWnk0X%INg})Y- zR03RwD7aThs0B6I;KeKP!!FS!2EQ>4`1cF2-NJ@+kkt&T^T6#lf-A$&?Pb0llW#uB zv*hsVGQsNv5JwYx4hSq}c}*#xB^ji)h-qmcsa2fVCLTxxeF>mF0o>s7k)u#xpU`JO zaD5oM!sSgC0_!=R?=s(Jg3l-foE+f9jGD=AA#h^Y1 z3}=IDgOL3UZ@dgt6978{^rry7FML-fzqAgFmH}2N7{Y_zbl^6@x8v~PvpiBWU{wM} z4xnWNdMcnL0gpL8e4a<^1X1$>%pz3P446&e-Alks14C)Roem+Ec#dCq6?LGV0vZTl zJP$NygS#IDH>UaB1Ay8Ax?8|tJ?J6cMywXrX{g66hd+x0#@LSWM^<=X8s62SuT8g^#8Me@{V!uRu*5XsiYOm7ui{bmKu& z0qDvG1g1EnU7X4irOXO*#)LS!@G=LwGRJQp1&u?XzXP;2gU(9O@LrrcEW!;4{~i?t z4G2O$Llr%ssvQ)zf!sFGPXhf#pdk~ac8aqZqS)7>tQp~Lrr`FVz?}s(^a4^ls3C#a zVNu*0QTVX%)+j`)1MEWZ;EgbXDSWU5ow3)o`mYJ0NEcTLu~;k=i~V-*7W=K~7Zh=7 zZ*kfR^u{|G?p}Sk(D#m8B9AvMTmg7O1N|D<6GvdlAag-<#|)6HSxqHWH2$DUT+iLT=N@bvW$8E_xb;rVyF1&pEyqs3M5f}-hp|9Scx9NRY>h|q z?lk9=9(eSDT?1B%a8*s%lc!HP`y(SG4?Z`%u{XszKSlHW zy^Y24OWJ8?ZjBaPJb&jy^!CatHD~EPaY_RIiG8Pv@u-sgymvBK;Xt~!?BSnZInGt4 z&!7Z^pK87Oxzr?D#9Hx`Vg{?PeWKCVFjBb${#>6Zwuy?3+0A8M>WNjzH^weFC5#q6 z77L&KIA{yI5!^f>*vK^rJ5`B&h5D>#k6oQ?G4FgVP~Ew6U4>hDCA;Y2Lr8hi$>GZ= z-V7(c@bKrdyxPemEAC6r;2C-x3-M3+Mvze)>lKA%rQc4Yx#060?|)a|tL)slv7kU7 zl3e+7_^I6HR@`4|Txn#Rlcu4R9$oR24`r1kt9&Hn-`*Ne3v&`zo{GcSC`GQa;ZAQ!VP@^%6yZM#CD(L7)T3B?t`Df0QN5^s5 z(2Ye#G`j%(ZQ6kS+s;kspq%wvp}3GG+4od#zQ&`|1Md@~>TO{A^Ew>6z1ksQWn9wV zEmPgH7#9^Z)f&iO#~iy{rLBx!l7#>GQlm&cPQPHCXlI}W*K70}aF01lxtXB{g%_vp z!`x^JoHz>$U-qK@y(HNukEk#wN{(F9xBa=?5;8xOeLlP;$gMI<_pkbUD=C^979?aC zOXHdPV#>{LL%ZY*agkh4V%2GPDtZs0@sJ$b0Hq+(W^6gjYmg*Ia&=NwPM`_!WTHBG zt3+0RyH_MnAEQpcNg6boNAi&>CCKOnL*jMx38X@3h6-N7KwI0KFd~IsF-tYadXWq1 zCtogJwh5l}qTWxwNpctv<2f@i3k}5%Y(__nVyr^|_GBhv)$=zu0tIzFk^sL*yb+xe zElZubcam*_%0OS&Wt+hrfyp>00j3hbhYP+Sdtm)ZvSSr+q~jiuyg@mv;S6Q7hPX>+ zN;XuVIMFC(<0)`PCyW@I0CNlQ<`7}*I5Z)myo$ka!SAk)`kE@Pwj9w#U;&7)m&NY*-ThJc#<1Nd1v883d;>zoQ!?0!zas%$OHA%^hXvP_P;7-q!!_>s0 zg~Aq1y{%x_nzQIfxs>Ktt78@7O(NF}cL61azG5RNGx1G92(p~QuK_AHmD_A6PCjuI z#hux7*$j2%^L|G+-wBY{aku{Fi9;GvU+xGcSyiGaDEm#VpLlmegHV$z?hW-1Q5qCI zm7)w{F`0U#1U_PvDK2&22eSQ-FPf`SRfw5~-JdXSZn!Yu>`p5L1vbGAI7V>D6vf>y z|M&dVu5ou;ei>yy;(oa*^Bd|BQee!mFyE2KSUOV`Ad4Xf6`=_J%B?B%!ZIB+^qV~8 zWhdXdT1iEZo^6cyWOv(Bhb}7XM-_h%_dF<{Es#_xHzVlpAU@Q5#@)yEWSP&O>zg@a za>MdIdHi#*Y5A-jiP)nu?qFJ75Y@$^%HqjXA;bjn^ zc~)<`w4xEbwS3sJFPLJ!*+0YKNcDXzVt7Tb8o}9SJEhSZxbFm5oj~SDXw;rfX|!IW z0-Q$v?u;Q=tgmatdERyEw~3}(>dRVhal16iD`EF3!s0hNDsU6w#p9181AZ@A&r!@Y zlB1Prr!%(2tUA_Y$<%|)su$-p`|-zIna?@E-}xIm2aphb)>bX-MG?T3?( zT}x0?!HM1{gzSL(I(tt)CZAAHbgQ5O3ogQ*+GY66e9dKlnA&6Vr|-75=w;J=5(=_%5ZdC89Hjpbe#<~Q;^<{N z3J!smC;Rd(G2guiw6dK7`zDy@zq; zIum3R%>vg~ZI?S(u;k`YWr7beLg|kqS*#^Exdlb$mA2l;>fl`^YY|cQN1Yl;uJV04 z=H5uJ(+=|f%N_In$nZ?KM!I^GMBjScRw(EGr6sR)1hNmdxkE}Y_w4PVLs?KK*59rrHQnyd1w^or{`=Z_Jd^{EN$KJm#W$QFi1K->HwUVCJmLcUg zID%8f=;GxXpY$y}#U^&kvq$2`kXjZj?zI(W8q@C3p^BS6l6CE`T?iM7BfPg{)9rHJ z9`+t&cf!`dCYN=@sG Y`r_%3d%oKB*RPVWw|2353G;gLf5}n?{Qv*} literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_rerecord.imageset/Contents.json b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_rerecord.imageset/Contents.json new file mode 100644 index 00000000..7dea5d67 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_rerecord.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_recorded_sound_rerecord@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_recorded_sound_rerecord@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_rerecord.imageset/mine_recorded_sound_rerecord@2x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_rerecord.imageset/mine_recorded_sound_rerecord@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1a4904487b1bcf1ceebe72e83760f0d51e02368d GIT binary patch literal 617 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZdINkyT!FN_v_BBZN&73xKp8R; zK_EdX5EqD)B%llkS56kl4Um`ela~zy>H;bQl5)}kKm=ri41sBcs0WfDDQRDM8DEet zpc)`4?I$7OWz1l#AngxCAOofS?=KHM0(6jGNswPK!>@;*RKC3xxxBbBkMG!yo=7)q z1&OnVHwJqfXuZ6>d+NlNlvuMl#lDVQtSe^JP5)sgz`(#5>*?YcVsW~4^37RI20X31 zH#9dibS-+k@0`#5{~vw0oK~{_lb-eXr(YIF%AC>+fwhCkZ(j4|OAXx-I`fU)vgGF{Ex6)tYJOJxx%_u< zh3v2YN?P2RkLG`B-D<0D`)<*)tXI;{GUj!7c9(B`b?YeiU61)LA1r3L=gKyudzxHY z6`%Z}wP*6l1)LkAEmFGn9m>y-90{##HwW+QWE4B%<$(2H~Y0y?_Pa*%$lMtE3$P%hl45K$7gr;^mrSp z37%V6qN2Hkh%?kSqXz`#`R>EamTaeV5u>$92+1X>k2E=^R@ zy5zFzM%d?n=eNxlp0-KkVT=abzrrZBfbJ*D1x?qkO`qj{Ipoy0MLK(yOFZ3ov)g9> zv&zDH(=+>1ryjp4v8hW==AGA>DQ}uVFU3Y)K_N&a~ob_z~Pu;j!5%BuP zuDX3|8D9xKC{+Am^Hsq!@6Y1z?G~Q-4;x)$Bi;wLHE6%>>0Xs9nRzs0)$G!y)W3R1 zQ>Mm>*!(;Cw^%eQ=Xu%txo=M0@qAm}9>bn1KG)hmX~I2?D-*t0z1Xw&&AX1~h4vnQ zA4Dl$esw_Nl&ZxUg{K>N%dSOT6R?<&v+|+Z0&TY*`K~J|A6dKSSY0ZxS(ZDoH+B8) zI`zNB3)`l~9NtqJ@O|eN9_{rPOvSePbTNEgAoeO! zHDzJYfhkLGF#hU_(pnLkYta9EOU_Z*?6d0ZR@sM<>})(wT4p~@T?rey z1ttF_9GbW*}3jembP0l+XkK DE`^d7 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_save.imageset/Contents.json b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_save.imageset/Contents.json new file mode 100644 index 00000000..101b0b30 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_save.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_recorded_sound_save@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_recorded_sound_save@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_save.imageset/mine_recorded_sound_save@2x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_save.imageset/mine_recorded_sound_save@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..974252ec493f58181f845bdf800a46e8f60929c9 GIT binary patch literal 3250 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 Pmw=(ZiC(_WgO~pUrIb44 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_save.imageset/mine_recorded_sound_save@3x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_save.imageset/mine_recorded_sound_save@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1b30019a1e9fa1e0d7bf26c025e8c1e8c256b2a6 GIT binary patch literal 4905 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 b=c8NGWsi~EQN`8AU%}#njakvT+b{nIY}Y`F literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_start_record.imageset/Contents.json b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_start_record.imageset/Contents.json new file mode 100644 index 00000000..e4bd64fd --- /dev/null +++ b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_start_record.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_recorded_sound_start_record@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_recorded_sound_start_record@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_start_record.imageset/mine_recorded_sound_start_record@2x.png b/YuMi/Assets.xcassets/jm/RecordedSound/mine_recorded_sound_start_record.imageset/mine_recorded_sound_start_record@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d414c84a5e855ee7bc41900f2702fa1a46d7891 GIT binary patch literal 2458 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 YYF234=}jWM{Vj@FnB6rkH~BN-zi7gIrvLx| literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/gift_list_one.imageset/Contents.json b/YuMi/Assets.xcassets/jm/gift_list_one.imageset/Contents.json new file mode 100644 index 00000000..a592ebdf --- /dev/null +++ b/YuMi/Assets.xcassets/jm/gift_list_one.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "gift_list_one@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "gift_list_one@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/gift_list_one.imageset/gift_list_one@2x.png b/YuMi/Assets.xcassets/jm/gift_list_one.imageset/gift_list_one@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3baf824c9ed05e2c65b0e2b544a05648b975952c GIT binary patch literal 881 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 diff --git a/YuMi/Assets.xcassets/jm/mine_album_reviewing.imageset/album_reviewing@3x.png b/YuMi/Assets.xcassets/jm/mine_album_reviewing.imageset/album_reviewing@3x.png index 565bc4cdfbb2e5f7e6bc391c5c281ee0b35c8ffe..c74948567e0f4f88aa989d8053ce1ba45683dc98 100644 GIT binary patch literal 3934 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 R)nEVs002ovPDHLkV1n1pv?Blj diff --git a/YuMi/Assets.xcassets/jm/mine_avatar_reviewing.imageset/mine_avatar_reviewing@2x.png b/YuMi/Assets.xcassets/jm/mine_avatar_reviewing.imageset/mine_avatar_reviewing@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9c685c1c04307e73dcae83380e167cb1d7d715aa GIT binary patch literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^EkLZn!3-ohTowUIhV}rT5LY1mzqlBRii-Xh6#P$1 z192g2AQvu+l>t-+QJkNTFa#)4SopuB1Vlm4==cC}((^xq$7+DXtGsJ=O@t^mYa|YG2E9lia6zWZ98ktq#vM1<#|89Ey6>&YzU{ zxY3`b|E?qKz#2|S$Id*14tcRaqy&ldM%M9`;4u zJSSrEiGPyRqrH*GqY^4O?ZvD9kfmq~M$*qvFGo3H(XbK}Q1QnrQ9GEGanCyIng kL^<_wl}9ZtW?x&wbXc&dMfr*64p36?boFyt=akR{0P~*>4FCWD literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/mine_avatar_reviewing.imageset/mine_avatar_reviewing@3x.png b/YuMi/Assets.xcassets/jm/mine_avatar_reviewing.imageset/mine_avatar_reviewing@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..afbb9569c36dfccdbf8c63c766f30e626ac57dd3 GIT binary patch literal 805 zcmeAS@N?(olHy`uVBq!ia0vp^M}gRegBeIZtnL#AQY`^KA+A9Be@V&zyuAO##RybX z1Z5W%A_U9Jp=_XfWW^9RL=agDO$06lXTS_O?S4%c=nn0YAirP+Y4*S0etignPbl5y|qP4==! z1|qB%)OViP`=a(z_O7@_DZMC_+srsS*9B2l%Ud?2e#jETa|mb zfO*-sFVTi~S}KELh3#Fcl?uj zP^Z5xq;vLT#cf{ic~>89&MIYV4}Y9^&as!hy|Ul~%X8P(`*pj;+0U<>zW;HW={z;R z)5}iTaP}O~wDHw*{mjMwI3vng?{J26&+%>3BH9ygN?e_=qbM)WC?RD}-}AeC%IhqT z9k=$LUVL$FU$T^vzo{j=?pfAlmt~%>Xs^yO(7on%`P<=+sJ541|Fr}MeEuW%IiXc` zd7>!K=ZD|yOpf&h?bvSl?C9#`Wv4&BxViCBM1#imWistMby>w8mlURCo&S2X=h3-? zhor1;w%=Op&GEhSt^;cfPrhf?o%rV_mC`KjUJ->}%Ga;taZQw7y4=sfbB`wX{|%ny z&%R2%zjXGX{wcS$x;qXqn|+x&SN(SAv&i?mlXp#gnz}l7((O?D4GqaT_6#20HC0@P R13(#q!PC{xWt~$(699AoiLL+u literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/mine_info_tag_del.imageset/Contents.json b/YuMi/Assets.xcassets/jm/mine_info_tag_del.imageset/Contents.json new file mode 100644 index 00000000..f0eb62ed --- /dev/null +++ b/YuMi/Assets.xcassets/jm/mine_info_tag_del.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_info_tag_del@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_info_tag_del@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/mine_info_tag_del.imageset/mine_info_tag_del@2x.png b/YuMi/Assets.xcassets/jm/mine_info_tag_del.imageset/mine_info_tag_del@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf424361558da272cb7822bf12faee299b1cdde GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^av;pY3?xs=ZJr3E)B}7%T!HkFlh=Xl&FyCV4J>l3{`3eKP1im4aRJk&FM`UFEleBkc5$#K?4CJ6ltpI fHJP0#z`$_(iAcQd!&&7(8yP%Z{an^LB{Ts59Q<3R literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/mine_info_tag_del.imageset/mine_info_tag_del@3x.png b/YuMi/Assets.xcassets/jm/mine_info_tag_del.imageset/mine_info_tag_del@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6bcc6c0e83ee5db011edef811c7d59208fa20cb9 GIT binary patch literal 356 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 A#sB~S literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/mine_item_sound.imageset/mine_item_sound@3x.png b/YuMi/Assets.xcassets/jm/mine_item_sound.imageset/mine_item_sound@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..de185d4e4c392efdf0f378da496d8f6eaf6dc66c GIT binary patch literal 5386 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 I&MBb@01*F|>i_@% literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/mine_user_info_head_edit.imageset/mine_user_info_head_edit@3x.png b/YuMi/Assets.xcassets/jm/mine_user_info_head_edit.imageset/mine_user_info_head_edit@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef1cd9c29a201ad55a5e8f83c32e0900d9d865d GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^S|H593?x6vT4n;NiU6MwS0K%B>RhK*s5>V5wIik&`bO_Pt>^0+f0OCSNifeFZ{?!Hgq7jW59HIm1C9<2A!Uh&WLF zOOSe?2+&NRIUvJd33$211Fcps3GxeO`19e0PvBFP&o*plj~vjKik5$1{yJB1V@0Zy ziLM0q@okIy8m3Lm=Xuet#K6GF;pyTSVsZNIl(R+63L>qJJS!5KF3z}Rk~!($o$vLB z!)846nadbsvb%;mZ2otd^?W++<*VC%&s@9Uy33LNyIfbpOm?TmJltn7-6!o`svRHm zPQH`-UPb+%clKcUj^#d%uDyJ&&+dLteGzapJF$ZF2hmwSWFwo@6?~xhnpD zLQX}@zq_(__Uexwt(K8Iy>hXNVd>dNVk}cr3!Dp8raEj??|;Z{@zO5-4aa)}P!xK) L`njxgN@xNAAIs;` literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/mine_userinfo_header_bg.imageset/Contents.json b/YuMi/Assets.xcassets/jm/mine_userinfo_header_bg.imageset/Contents.json new file mode 100644 index 00000000..30706885 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/mine_userinfo_header_bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_userinfo_header_bg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_userinfo_header_bg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/mine_userinfo_header_bg.imageset/mine_userinfo_header_bg@2x.png b/YuMi/Assets.xcassets/jm/mine_userinfo_header_bg.imageset/mine_userinfo_header_bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f782e87bccdec7d3509ecf159d7f9e4f775ccb GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0y~yV0s5+8*wlLNs|TZT7i^tfKP}kkpBGj*XM7)zI^@t zrbHKOY!%jf!YL0g8YIRt{mR9 za6)}vtdF&pB*(X>b5AU`0?PgMba4!+xb^l@q@Pou0PBIWd0*ewZ_V=PaVt{%*PN_|9;%}cbWCwwe_$4@?YQIb@}$M?eD&9`?uD5 zFIdR^-?h2Z{C=;swv9QFfA^=@r|9ygy4QXe^6zr~T5IjNzf}Fj_IDRA)xDml`e*yQ z!#~&lPN{osH}n23|7Y9ZP5!xe@o%5H_e*~Z)X6)4U-xGp%hA63oLu{hMe3ew{5co+ zWA5S)*6yvJt-Y3hw2th3Za#VU@3T+d)fw;Hec$KZJ1}?p#=C!??Y9IH3yuMaH?P|7 s_dGXu{G--!pXK9hg*xFQ`As!UJyBB>s(Lof1qK9zr>mdKI;Vst0C;oe$N&HU literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/mine_userinfo_header_bg.imageset/mine_userinfo_header_bg@3x.png b/YuMi/Assets.xcassets/jm/mine_userinfo_header_bg.imageset/mine_userinfo_header_bg@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..857aee62e8bbb092b74a2a267c15d48400ba7c32 GIT binary patch literal 776 zcmeAS@N?(olHy`uVBq!ia0y~yU`YkCy*ZeHK7R$N z0iiDtUB5ql`S}GT@&hRN=`+xrpI^WK{_+JV{^QG+Uthle`TXrC2z~#3|NeilUBCFP zPJkS$T@vIM%osd;fN`{dsHF`|s;s;q-iksf^R?9JQEh{;;g%;W;~p^OR!4tY^LfR*WK(Qkp{8q$X4W$u2Eppqi;6 za}=gF&bc)cNZQ;2v0G;@aMxm9$x{MUGtbbGJ3z8RQ+SFCgIdP4QwMB?L);D|%v=zs z#jLhsMuXeT1v*SoNlijrD^9XZ6%1(S)Y4S26b^}XkWyRW%gAlyxPs^9%mt2|6^B?B z8ZAk03Xps^L!oLVkNi0x-)E-6CJqC~GeIE1R~&7pST6df8aRpwo19{q=z2jw*u~AU zRITGlla-HvD(lXf3a7Y*j2yS9MD%bnP4zs_VyJV_MvWsxOzf$Ka@^Ryi>TppP=h+HB;td=NmKlYsam+fs&PU)*u%s}{;gm`> z4!b}w%R-ptZmN=+AUzmGt` gX%@z<2E!1#)V87Q*S>sk?z(hcwlaRt)EgM$k+?0~BI zOM?7@(-@*d{oEZajdWDy#09zDE|8H2T5!SB#WAGf)|-QkAX6I_{9P%&l8JZ=&{ZaU zd*A>TJMn+3U`Qz0pf%QNRi^?6lS0)&MyU-AtU3vd+z|(u#6Zjm4_fB?dRQrL*D*K0 zYx~}Fg$TMUaPl2g%lZBF^X22!*FApr@8i#}e?ONMD@mCAxEB5W;G+k-+>_a_*KV-b z@$TY{gQfC1eCw*GBo^G&H{0MVtH@}W6 z{qS^`x@67VcRShM-?x4Kpm+Cjxjl*Bg__G>#btiryQ|F?x2yW$LGQABgNn89YT4Fb z+=q_*Fyo2Q@ zZ{B@SpY|bkQi=JGddV8T=JSakEP3qO5AHWNNHA&S=aKMzz|72Ga)bZ=(U^|+pfK=s L^>bP0l+XkKi($pd literal 950 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 diff --git a/YuMi/Assets.xcassets/jm/user_card_copy_id.imageset/Contents.json b/YuMi/Assets.xcassets/jm/user_card_copy_id.imageset/Contents.json new file mode 100644 index 00000000..45919155 --- /dev/null +++ b/YuMi/Assets.xcassets/jm/user_card_copy_id.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "user_card_copy_id@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "user_card_copy_id@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/jm/user_card_copy_id.imageset/user_card_copy_id@2x.png b/YuMi/Assets.xcassets/jm/user_card_copy_id.imageset/user_card_copy_id@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c0fd3010ad82801cda2173b9165194bbe08cd4ed GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQa#sNMdu0Z-fiD3KGM@>L&f+azI z!3>+0bEo*Z&ufYk&kEJ*?yCGc>;3_tWUQx)V~E7%qo=&N4k+-rUbOLjy#MXL@MwGvD|VI~)AZRHCA?FmJZVv?=N8d5N*6CYtf>{4PK>^E_P~Lp096y?mFiS%If5(T*ka zXJEkc@Ab>0jTEyxX5Rcb@3MJr|Ej!CCLT}hwOp?Wv1gh3zGyY8XSm2!$+o@ld_?b* zh3(&;J^Ge=Gd6fq;IVl#f9*D&IjffC*Sst>HwjfXud~fry>(&P7ECQP$ojJw3{uG{@iX@*pHFVdQ&MBb@0482)=Kufz literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/jm/user_card_copy_id1.imageset/user_card_copy_id1@3x.png b/YuMi/Assets.xcassets/jm/user_card_copy_id1.imageset/user_card_copy_id1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f702f6c94241157bac1ca63734257918229cb47a GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGApt%iu0VS8=EEmWoC15?G7V1{3;6AE?}#Jaj()yx0-_@3-1(<$Cod*-!9$eb1wUa+L$Zj>?!FBu} zXU8l_9-FCiY_~jO^Z0IQS^jue&t1juUK+eN->lztFWW41Q|}I=+LKcRp0Q7ESec@} zaB6~_Lv+#S^Y?FteqNz06#AJ-;Z|0hEl=mKhn26sZ=Eb5V$S^5@Q_^E1)qj9s<%HB pN4Yp2^wx8I^nbZ!amrEK{Dt`vF6ImW^Z}jD;OXk;vd$@?2>_71vY-F} literal 0 HcmV?d00001 diff --git a/YuMi/CustomUI/TTPopup/View/TTNewAlertView.h b/YuMi/CustomUI/TTPopup/View/TTNewAlertView.h new file mode 100644 index 00000000..0fadf882 --- /dev/null +++ b/YuMi/CustomUI/TTPopup/View/TTNewAlertView.h @@ -0,0 +1,20 @@ +// +// TTNewAlertView.h +// xplan-ios +// +// Created by duoban on 2023/1/9. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + + + + +@interface TTNewAlertView : UIView +@property (nonatomic,copy) NSString *message; +@property (nonatomic, copy) TTPopupCompletionHandler confirmHandle; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/CustomUI/TTPopup/View/TTNewAlertView.m b/YuMi/CustomUI/TTPopup/View/TTNewAlertView.m new file mode 100644 index 00000000..532ec03b --- /dev/null +++ b/YuMi/CustomUI/TTPopup/View/TTNewAlertView.m @@ -0,0 +1,118 @@ +// +// TTNewAlertView.m +// xplan-ios +// +// Created by duoban on 2023/1/9. +// + +#import "TTNewAlertView.h" +@interface TTNewAlertView() +@property (nonatomic,strong) UIView *bgView; +@property (nonatomic,strong) UILabel *messageView; +@property (nonatomic,strong) UIButton *confirmBtn; +@property (nonatomic,strong) UIButton *cancelBtn; +@end +@implementation TTNewAlertView + +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + self.backgroundColor = [UIColor clearColor]; + [self addSubview:self.bgView]; + [self.bgView addSubview:self.messageView]; + [self.bgView addSubview:self.confirmBtn]; + [self.bgView addSubview:self.cancelBtn]; +} +- (void)initSubViewConstraints { + [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(kGetScaleWidth(310)); + make.height.mas_equalTo(kGetScaleWidth(149)); + make.center.equalTo(self); + }]; + + + [self.confirmBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(110)); + make.height.mas_equalTo(kGetScaleWidth(37)); + make.left.mas_equalTo(kGetScaleWidth(31)); + make.bottom.mas_equalTo(-kGetScaleWidth(31)); + }]; + + [self.cancelBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.centerY.equalTo(self.confirmBtn); + make.right.mas_equalTo(-kGetScaleWidth(31)); + }]; + + [self.messageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(kGetScaleWidth(25)); + make.centerX.equalTo(self); + make.left.right.equalTo(self).inset(kGetScaleWidth(10)); + }]; + + + +} +-(void)setMessage:(NSString *)message{ + _message = message; + _messageView.text = message; +} +-(void)confirmAction{ + [TTPopup dismiss]; + if(self.confirmHandle){ + self.confirmHandle(); + } +} +-(void)cancelAction{ + [TTPopup dismiss]; +} + +#pragma mark -懒加载 + +- (UIView *)bgView{ + if (!_bgView){ + _bgView = [UIView new]; + _bgView.backgroundColor = [UIColor whiteColor]; + [_bgView setCornerWithLeftTopCorner:kGetScaleWidth(12) rightTopCorner:kGetScaleWidth(12) bottomLeftCorner:kGetScaleWidth(12) bottomRightCorner:kGetScaleWidth(12) size:CGSizeMake(kGetScaleWidth(310), kGetScaleWidth(149))]; + } + return _bgView; +} +- (UILabel *)messageView{ + if (!_messageView){ + _messageView = [UILabel labelInitWithText:@"" font:kFontRegular(15) textColor:[DJDKMIMOMColor inputTextColor]]; + _messageView.textAlignment = NSTextAlignmentCenter; + _messageView.numberOfLines = 0; + } + return _messageView; +} +-(UIButton *)confirmBtn{ + if (!_confirmBtn){ + _confirmBtn = [UIButton new]; + [_confirmBtn setTitle:YMLocalizedString(@"XPGiftBarView6") forState:UIControlStateNormal]; + _confirmBtn.backgroundColor = UIColorFromRGB(0xE6E6F0); + _confirmBtn.layer.cornerRadius = kGetScaleWidth(37)/2; + _confirmBtn.layer.masksToBounds = YES; + [_confirmBtn addTarget:self action:@selector(confirmAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _confirmBtn; +} +-(UIButton *)cancelBtn{ + if (!_cancelBtn){ + _cancelBtn = [UIButton new]; + [_cancelBtn setTitle:YMLocalizedString(@"XPShareView7") forState:UIControlStateNormal]; + UIImage *image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor],[DJDKMIMOMColor confirmButtonGradientMiddleColor],[DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(kGetScaleWidth(110), kGetScaleWidth(37))]; + _cancelBtn.backgroundColor = [UIColor colorWithPatternImage:image]; + _cancelBtn.layer.cornerRadius = kGetScaleWidth(37)/2; + _cancelBtn.layer.masksToBounds = YES; + [_cancelBtn addTarget:self action:@selector(cancelAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _cancelBtn; +} +@end diff --git a/YuMi/CustomUI/XNDJTDDLoadingTool.h b/YuMi/CustomUI/XNDJTDDLoadingTool.h index 128b2bae..c1216a1a 100644 --- a/YuMi/CustomUI/XNDJTDDLoadingTool.h +++ b/YuMi/CustomUI/XNDJTDDLoadingTool.h @@ -29,6 +29,12 @@ NS_ASSUME_NONNULL_BEGIN */ + (void)hideHUDInView:(nullable UIView *)view; + ++(void)hideOnlyView:(UIView *)view; ++(void)showOnlyView:(UIView *)view; + + + /** 显示成功message, 默认显示在窗口上, 2.5s后消失, 默认不拦截点击事件 diff --git a/YuMi/CustomUI/XNDJTDDLoadingTool.m b/YuMi/CustomUI/XNDJTDDLoadingTool.m index 86dcf537..b93a2a07 100644 --- a/YuMi/CustomUI/XNDJTDDLoadingTool.m +++ b/YuMi/CustomUI/XNDJTDDLoadingTool.m @@ -9,8 +9,8 @@ #import "XNDJTDDLoadingTool.h" #import "GCDHelper.h" #import -#import "DJDKMIMOMColor.h" -#import "ClientConfig.h" +#import "MvpViewController.h" +#import #define kDelayTime 2.5 @interface XNDJTDDLoadingTool () @@ -30,13 +30,45 @@ static NSArray * _animationImages = nil; + (void)hideHUDInView:(nullable UIView *)view { dispatch_main_sync_safe(^{ if (view) { - [MBProgressHUD hideHUDForView:view animated:NO]; - [MBProgressHUD hideHUDForView:[UIApplication sharedApplication].keyWindow animated:NO]; + MBProgressHUD *hud = [XNDJTDDLoadingTool HUDForView:view]; + + if (hud != nil && hud.mode != MBProgressHUDModeText) { + hud.removeFromSuperViewOnHide = YES; + [hud hideAnimated:NO]; + } + MBProgressHUD *windowHud = [XNDJTDDLoadingTool HUDForView:kWindow]; + if (windowHud != nil && windowHud.mode != MBProgressHUDModeText) { + windowHud.removeFromSuperViewOnHide = YES; + [windowHud hideAnimated:NO]; + } } else { - [MBProgressHUD hideHUDForView:[UIApplication sharedApplication].keyWindow animated:NO]; + MBProgressHUD *windowHud = [XNDJTDDLoadingTool HUDForView:kWindow]; + if (windowHud != nil && windowHud.mode != MBProgressHUDModeText) { + windowHud.removeFromSuperViewOnHide = YES; + [windowHud hideAnimated:NO]; + } } }); } + + ++ (MBProgressHUD *)HUDForView:(UIView *)view { + NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; + for (UIView *subview in subviewsEnum) { + if ([subview isKindOfClass:[MBProgressHUD class]]) { + MBProgressHUD *hud = (MBProgressHUD *)subview; + id hasFinished = [hud valueForKey:@"hasFinished"]; + if (hasFinished != nil) { + if([hasFinished boolValue] == NO){ + return hud; + } + + } + } + } + return nil; +} + /** 隐藏HUD */ @@ -150,6 +182,8 @@ static NSArray * _animationImages = nil; * 在窗口上显示菊花 */ + (void)showLoading { + [self showGIFLoadingInView:[UIApplication sharedApplication].keyWindow]; + return; [self showLoadingInView:[UIApplication sharedApplication].keyWindow]; } @@ -157,6 +191,8 @@ static NSArray * _animationImages = nil; * 在view上显示菊花 */ + (void)showLoadingInView:(nullable UIView *)view { + [self showGIFLoadingInView:[UIApplication sharedApplication].keyWindow]; + return; [self showLoadingInView:view enabled:YES]; } @@ -164,6 +200,8 @@ static NSArray * _animationImages = nil; * 在view上显示菊花 */ + (void)showLoadingInView:(nullable UIView *)view enabled:(BOOL)enabled { + [self showGIFLoadingInView:[UIApplication sharedApplication].keyWindow]; + return; [self showLoadingWithMessage:@"" inView:view enabled:enabled]; } @@ -171,6 +209,7 @@ static NSArray * _animationImages = nil; * 在窗口上显示菊花+文字 */ + (void)showLoadingWithMessage:(NSString *)message { + [self showLoadingWithMessage:message inView:[UIApplication sharedApplication].keyWindow]; } @@ -178,6 +217,7 @@ static NSArray * _animationImages = nil; * 在view上显示菊花+文字 */ + (void)showLoadingWithMessage:(NSString *)message inView:(nullable UIView *)view { + [self showLoadingWithMessage:message inView:view enabled:YES]; } @@ -185,6 +225,8 @@ static NSArray * _animationImages = nil; * 在view上显示菊花+文字 */ + (void)showLoadingWithMessage:(NSString *)message inView:(nullable UIView *)view enabled:(BOOL)enabled { + + if (!view) { view = [UIApplication sharedApplication].keyWindow; } @@ -235,10 +277,9 @@ static NSArray * _animationImages = nil; dispatch_main_sync_safe(^{ MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES]; hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor; - hud.minSize = CGSizeMake(168, 133); - hud.userInteractionEnabled = enabled; + hud.minSize = CGSizeMake(100, 150); + hud.userInteractionEnabled = NO; hud.mode = MBProgressHUDModeCustomView; - hud.minSize = CGSizeMake(150, 150); [hud.bezelView addSubview:[self loadingView]]; hud.backgroundColor = bgColor; hud.bezelView.color = [UIColor clearColor]; @@ -248,33 +289,32 @@ static NSArray * _animationImages = nil; + (void)showAnchorLoading { - if (![ClientConfig shareConfig].canOpen) { - return; - } + UIView *view = [UIApplication sharedApplication].delegate.window; dispatch_main_sync_safe(^{ MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES]; hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor; hud.userInteractionEnabled = NO; hud.mode = MBProgressHUDModeCustomView; - hud.minSize = CGSizeMake(100, 100 + 16 + 30); - [hud.bezelView addSubview:[self anchorSwitchLoadingView]]; + hud.minSize = CGSizeMake(100, 150); + [hud.bezelView addSubview:[self loadingView ]]; hud.bezelView.color = [UIColor clearColor]; hud.removeFromSuperViewOnHide = YES; }); } + (void)showAnchorLoading:(UIView *)view { - dispatch_main_sync_safe(^{ - MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES]; - hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor; - hud.userInteractionEnabled = NO; - hud.mode = MBProgressHUDModeCustomView; - hud.minSize = CGSizeMake(100, 100 + 16 + 30); - [hud.bezelView addSubview:[self anchorSwitchLoadingView]]; - hud.bezelView.color = [UIColor clearColor]; - hud.removeFromSuperViewOnHide = YES; - }); + + dispatch_main_sync_safe(^{ + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES]; + hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor; + hud.userInteractionEnabled = NO; + hud.mode = MBProgressHUDModeCustomView; + hud.minSize = CGSizeMake(100, 150); + [hud.bezelView addSubview:[self loadingView ]]; + hud.bezelView.color = [UIColor clearColor]; + hud.removeFromSuperViewOnHide = YES; + }); } #pragma mark - private @@ -287,104 +327,69 @@ static NSArray * _animationImages = nil; + (UIView *)loadingView { - UIView *loadingBGView = [[UIView alloc] init]; - loadingBGView.layer.cornerRadius = 20; - loadingBGView.backgroundColor = [UIColor whiteColor]; - UIImageView *loadingImageView = [[UIImageView alloc] init]; - - UILabel *loadingTitleLabel = [[UILabel alloc] init]; - loadingTitleLabel = [[UILabel alloc] init]; - loadingTitleLabel.textColor = [UIColor colorWithRed:(153.0)/255.0f green:(153.0)/255.0f blue:(153.0)/255.0f alpha:1]; - loadingTitleLabel.font = [UIFont systemFontOfSize:14]; - loadingTitleLabel.text = YMLocalizedString(@"XNDJTDDLoadingTool0"); - loadingTitleLabel.textAlignment = NSTextAlignmentCenter; - - [loadingBGView addSubview:loadingImageView]; - [loadingBGView addSubview:loadingTitleLabel]; - - loadingBGView.frame = CGRectMake(0,0,120,120); - loadingImageView.frame = CGRectMake((CGRectGetWidth(loadingBGView.frame)-80)/ 2, 10, 80, 80); - loadingTitleLabel.frame = CGRectMake(0, CGRectGetMaxY(loadingImageView.frame) + 8, loadingBGView.frame.size.width, 15); - - loadingImageView.animationImages = [self loadingAnchorAnimationImages]; - [loadingImageView startAnimating]; - return loadingBGView; + UIView *bgView = [UIView new]; + bgView.backgroundColor = [UIColor clearColor]; + bgView.frame = CGRectMake(0, 0, 100, 150); + SVGAParser *parser = [[SVGAParser alloc]init]; + SVGAImageView* playView = [[SVGAImageView alloc]init]; + playView.contentMode = UIViewContentModeScaleAspectFit; + playView.frame = CGRectMake(0, 0, 100,150); + playView.backgroundColor = [UIColor clearColor]; + playView.userInteractionEnabled = NO; + + [parser parseWithNamed:@"pi_new_loading" inBundle:[NSBundle mainBundle] completionBlock:^(SVGAVideoEntity * _Nonnull videoItem) { + + playView.layer.masksToBounds = YES; + playView.contentMode = UIViewContentModeScaleAspectFill; + + + playView.videoItem = videoItem; + [playView startAnimation]; + } failureBlock:^(NSError * _Nonnull error) { + + }]; + + [bgView addSubview:playView]; + + return bgView; } -+ (NSArray *)loadingAnimationImages { - - if (XNDJTDDLoadingTool.animationImages.count > 0) { - return XNDJTDDLoadingTool.animationImages; - } - NSString * countString = @"00"; - NSMutableArray * imageArray= [NSMutableArray array]; - for (int i = 0; i <= 27; i++) { - if (i < 10) { - countString = [NSString stringWithFormat:@"0%d", i]; - } else { - countString = [NSString stringWithFormat:@"%d", i]; - } - NSString * loadingImageName = [NSString stringWithFormat:@"loading_0%@", countString]; - UIImage * image = [UIImage imageNamed:loadingImageName]; - [imageArray addObject:image]; - } - NSArray * array = [imageArray copy]; - [XNDJTDDLoadingTool setAnimationImages:array]; - return array; -} -+ (UIView *)anchorSwitchLoadingView { - UIView *loadingBGView = [[UIView alloc] init]; - loadingBGView.layer.cornerRadius = 20; - loadingBGView.backgroundColor = [UIColor clearColor]; - UIImageView *loadingImageView = [[UIImageView alloc] init]; - - UILabel *loadingTitleLabel = [[UILabel alloc] init]; - loadingTitleLabel = [[UILabel alloc] init]; - loadingTitleLabel.textColor = UIColorFromRGB(0xC9BCF2); - loadingTitleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; - loadingTitleLabel.text = YMLocalizedString(@"XNDJTDDLoadingTool0"); - loadingTitleLabel.textAlignment = NSTextAlignmentCenter; - - [loadingBGView addSubview:loadingImageView]; - [loadingBGView addSubview:loadingTitleLabel]; - - loadingBGView.frame = CGRectMake(0,0,100,100 + 16 + 30); - loadingImageView.frame = CGRectMake(0, 0, 100, 100); - loadingTitleLabel.frame = CGRectMake(0, CGRectGetMaxY(loadingImageView.frame) + 8, loadingBGView.frame.size.width, 15); - loadingImageView.animationImages = [self loadingAnchorAnimationImages]; - [loadingImageView startAnimating]; - return loadingBGView; -} -+ (NSArray *)loadingAnchorAnimationImages { - NSString * countString = @"00"; - NSMutableArray * imageArray= [NSMutableArray array]; - for (int i = 0; i <= 47; i++) { - if (i < 10) { - countString = [NSString stringWithFormat:@"0%d", i]; - } else { - countString = [NSString stringWithFormat:@"%d", i]; ++(void)hideOnlyView:(UIView *)view{ + + dispatch_main_sync_safe(^{ + if (view) { + UIView *getView; + if([view isKindOfClass:[MvpViewController class]]){ + getView = ((MvpViewController *)view).view; + }else{ + getView = view; + } + MBProgressHUD *hud = [XNDJTDDLoadingTool HUDForView:getView]; + if (hud != nil && hud.mode != MBProgressHUDModeText) { + hud.removeFromSuperViewOnHide = YES; + [hud hideAnimated:NO]; + } } - NSString * loadingImageName = [NSString stringWithFormat:@"anchorLoading_0%@", countString]; - UIImage * image = [UIImage imageNamed:loadingImageName]; - [imageArray addObject:image]; + }); +} ++(void)showOnlyView:(UIView *)view{ + if (!view) { + view = [UIApplication sharedApplication].keyWindow; } - NSArray * array = [imageArray copy]; - return array; -} - -+ (NSArray *)animationImages { - if (_animationImages == nil) { - _animationImages = [NSArray array]; - } - return _animationImages; -} - -+ (void)setAnimationImages:(NSArray *)animationImages { - if (animationImages != _animationImages) { - _animationImages = animationImages; - } + [self hideOnlyView:view]; + dispatch_main_sync_safe(^{ + MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES]; + hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor; + hud.minSize = CGSizeMake(100, 150); + hud.userInteractionEnabled = NO; + hud.mode = MBProgressHUDModeCustomView; + [hud.bezelView addSubview:[self loadingView]]; + hud.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.35]; + hud.bezelView.color = [UIColor clearColor]; + hud.removeFromSuperViewOnHide = YES; + }); } diff --git a/YuMi/Modules/YMMine/Api/Api+Mine.h b/YuMi/Modules/YMMine/Api/Api+Mine.h index dc822bb0..8daa4db1 100644 --- a/YuMi/Modules/YMMine/Api/Api+Mine.h +++ b/YuMi/Modules/YMMine/Api/Api+Mine.h @@ -304,14 +304,37 @@ NS_ASSUME_NONNULL_BEGIN /// @param ticket ticket + (void)setPayPassword:(HttpRequestHelperCompletion)completion newPasswd:(NSString *)newPasswd uid:(NSString *)uid ticket:(NSString *)ticket; -+(void)requestQueryWithRoomType:(HttpRequestHelperCompletion)completion; + ///收益记录 +(void)requestRecordIncome:(HttpRequestHelperCompletion)completion; ///得到兑换界面信息 +(void)getExchangeDiamondInformation:(HttpRequestHelperCompletion)completion; +(void)confirmExchangeDiamond:(HttpRequestHelperCompletion)completion goldNum:(NSString *)goldNum diamondNum:(NSString *)diamondNum currency:(NSString *)currency; +/// 得到声音卡信息 +/// - Parameters: +/// - completion: 完成 +/// - uid: 用户id ++(void)getSoundCardInfo:(HttpRequestHelperCompletion)completion uid:(NSString *)uid; +/// 保存声音卡信息 +/// - Parameters: +/// - completion: 完成 +/// - audioUrl: 声音链接 +/// - second: 秒数 ++(void)saveSoundCardInfo:(HttpRequestHelperCompletion)completion audioUrl:(NSString *)audioUrl second:(NSString *)second; +///删除声音卡 ++(void)deleteSoundCardInfo:(HttpRequestHelperCompletion)completion; +///得到个人简介标签 ++(void)getTagList:(HttpRequestHelperCompletion)completion; +///保存个人简介标签 ++(void)saveTagList:(HttpRequestHelperCompletion)completion labels:(NSString *)labels; +//////获取地区列表 ++(void)getAreaList:(HttpRequestHelperCompletion)completion; +///保存地区列表 ++(void)saveAreaConfigWithArea:(HttpRequestHelperCompletion)completion region:(NSString *)region; +/// ++(void)requestQueryWithRoomType:(HttpRequestHelperCompletion)completion; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/Api/Api+Mine.m b/YuMi/Modules/YMMine/Api/Api+Mine.m index 0c99e011..ccd51b52 100644 --- a/YuMi/Modules/YMMine/Api/Api+Mine.m +++ b/YuMi/Modules/YMMine/Api/Api+Mine.m @@ -405,5 +405,39 @@ NSString * fang = [NSString stringFromBase64String:@"Z29sZEV4Y2hhbmdlRGlhbW9uZC9leGNoYW5nZQ=="];///goldExchangeDiamond/exchange [self makeRequest:fang method:HttpRequestHelperMethodPOST completion:completion,__FUNCTION__,goldNum,diamondNum,currency, nil]; } +/// 得到声音卡信息 +/// - Parameters: +/// - completion: 完成 +/// - uid: 用户id ++(void)getSoundCardInfo:(HttpRequestHelperCompletion)completion uid:(NSString *)uid{ + [self makeRequest:@"audioCard/get" method:HttpRequestHelperMethodGET completion:completion,__FUNCTION__,uid, nil]; +} +/// 保存声音卡信息 +/// - Parameters: +/// - completion: 完成 +/// - audioUrl: 声音链接 +/// - second: 秒数 ++(void)saveSoundCardInfo:(HttpRequestHelperCompletion)completion audioUrl:(NSString *)audioUrl second:(NSString *)second{ + [self makeRequest:@"audioCard/save" method:HttpRequestHelperMethodPOST completion:completion,__FUNCTION__,audioUrl,second, nil]; +} +///删除声音卡 ++(void)deleteSoundCardInfo:(HttpRequestHelperCompletion)completion{ + [self makeRequest:@"audioCard/del" method:HttpRequestHelperMethodPOST completion:completion,__FUNCTION__, nil]; +} ++(void)getTagList:(HttpRequestHelperCompletion)completion{ + [self makeRequest:@"label/edit" method:HttpRequestHelperMethodGET completion:completion,__FUNCTION__, nil]; +} +///保存个人简介标签 ++(void)saveTagList:(HttpRequestHelperCompletion)completion labels:(NSString *)labels{ + [self makeRequest:@"label/save" method:HttpRequestHelperMethodPOST completion:completion,__FUNCTION__,labels, nil]; +} +//////获取地区列表 ++(void)getAreaList:(HttpRequestHelperCompletion)completion{ + [self makeRequest:@"region/config" method:HttpRequestHelperMethodGET completion:completion,__FUNCTION__, nil]; +} +///保存地区列表 ++(void)saveAreaConfigWithArea:(HttpRequestHelperCompletion)completion region:(NSString *)region{ + [self makeRequest:@"region/save" method:HttpRequestHelperMethodPOST completion:completion,__FUNCTION__,region, nil]; +} @end diff --git a/YuMi/Modules/YMMine/Model/UserInfo/XPMineUserInfoTagModel.h b/YuMi/Modules/YMMine/Model/UserInfo/XPMineUserInfoTagModel.h new file mode 100644 index 00000000..5434d27c --- /dev/null +++ b/YuMi/Modules/YMMine/Model/UserInfo/XPMineUserInfoTagModel.h @@ -0,0 +1,40 @@ +// +// XPMineUserInfoTagModel.h +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XPMineUserInfoTagModel : NSObject +/// +@property (nonatomic,copy) NSArray *groups; +/// +@property (nonatomic,copy) NSArray *labels; +/// +@property (nonatomic,copy) NSArray *meLabels; + + + +@end + + +@interface XPMineUserInfoTagItemModel : NSObject +/// +@property (nonatomic,copy) NSString *group; +/// +@property (nonatomic,copy) NSString *label; +/// +@property (nonatomic,assign) BOOL picked; +/// +@property (nonatomic,assign) CGFloat width; + +/// +@property (nonatomic,assign) BOOL isNoChooseTag; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/Model/UserInfo/XPMineUserInfoTagModel.m b/YuMi/Modules/YMMine/Model/UserInfo/XPMineUserInfoTagModel.m new file mode 100644 index 00000000..003731b0 --- /dev/null +++ b/YuMi/Modules/YMMine/Model/UserInfo/XPMineUserInfoTagModel.m @@ -0,0 +1,21 @@ +// +// XPMineUserInfoTagModel.m +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import "XPMineUserInfoTagModel.h" + +@implementation XPMineUserInfoTagModel ++ (NSDictionary *)objectClassInArray{ + return @{ + @"labels":XPMineUserInfoTagItemModel.class + }; +} +@end + + +@implementation XPMineUserInfoTagItemModel + +@end diff --git a/YuMi/Modules/YMMine/Model/UserInfo/XPSoundCardModel.h b/YuMi/Modules/YMMine/Model/UserInfo/XPSoundCardModel.h new file mode 100644 index 00000000..98f1e547 --- /dev/null +++ b/YuMi/Modules/YMMine/Model/UserInfo/XPSoundCardModel.h @@ -0,0 +1,22 @@ +// +// XPSoundCardModel.h +// xplan-ios +// +// Created by duoban on 2023/1/4. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XPSoundCardModel : NSObject +@property (nonatomic,copy) NSString *uid; +//音频七牛云url +@property (nonatomic,copy) NSString *audioUrl; +///录音时间 +@property (nonatomic,assign) NSInteger second; +//0,没录制,1,已上传,2,审核通过,3,审核不通过,4,下架 +@property (nonatomic,assign) int status; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/Model/UserInfo/XPSoundCardModel.m b/YuMi/Modules/YMMine/Model/UserInfo/XPSoundCardModel.m new file mode 100644 index 00000000..fb0a4f5c --- /dev/null +++ b/YuMi/Modules/YMMine/Model/UserInfo/XPSoundCardModel.m @@ -0,0 +1,12 @@ +// +// XPSoundCardModel.m +// xplan-ios +// +// Created by duoban on 2023/1/4. +// + +#import "XPSoundCardModel.h" + +@implementation XPSoundCardModel + +@end diff --git a/YuMi/Modules/YMMine/Model/XPMineUserInfoEditModel.h b/YuMi/Modules/YMMine/Model/XPMineUserInfoEditModel.h index 05052d8a..5d313217 100644 --- a/YuMi/Modules/YMMine/Model/XPMineUserInfoEditModel.h +++ b/YuMi/Modules/YMMine/Model/XPMineUserInfoEditModel.h @@ -1,19 +1,22 @@ // -// YMMineUserInfoEditModel.h -// YUMI +// XPMineUserInfoEditModel.h +// xplan-ios // -// Created by YUMI on 2021/9/23. +// Created by 冯硕 on 2021/9/23. // #import NS_ASSUME_NONNULL_BEGIN typedef NS_ENUM(NSInteger, XPMineUserInfoEditType) { - XPMineUserInfoEditType_Avatar,///头像 - XPMineUserInfoEditType_Nick,///名字 - XPMineUserInfoEditType_Birth,///生日 - XPMineUserInfoEditType_Photo,///相册 - XPMineUserInfoEditType_UseDes,///用户描述 + XPMineUserInfoEditType_Avatar,///头像 + XPMineUserInfoEditType_Nick,///名字 + XPMineUserInfoEditType_Birth,///生日 + XPMineUserInfoEditType_Photo,///相册 + XPMineUserInfoEditType_UseDes,///用户描述 + XPMineUserInfoEditType_Sound,///声音 + XPMineUserInfoEditType_Tag,///标签 + XPMineUserInfoEditType_Area,///地区 }; @interface XPMineUserInfoEditModel : NSObject @@ -30,6 +33,7 @@ typedef NS_ENUM(NSInteger, XPMineUserInfoEditType) { ///相册 @property (nonatomic,copy) NSArray *photoArray; + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.h b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.h index f2d61588..3cf1f9af 100644 --- a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.h +++ b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.h @@ -1,12 +1,11 @@ // -// YMMineUserInfoEditPresenter.h -// YUMI +// XPMineUserInfoEditPresenter.h +// xplan-ios // -// Created by YUMI on 2021/9/23. +// Created by 冯硕 on 2021/9/23. // #import "BaseMvpPresenter.h" - NS_ASSUME_NONNULL_BEGIN @class UserInfoModel; @interface XPMineUserInfoEditPresenter : BaseMvpPresenter @@ -15,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)getUserInfo; ///获取个人资料页编辑的数据源 -- (void)getUserInfoEditDataSourceWithUserInfo:(UserInfoModel *)userInfo; +- (void)getUserInfoEditDataSourceWithUserInfo:(UserInfoModel *)userInfo ; /// 补全资料 /// @param avatar 头像 @@ -23,13 +22,17 @@ NS_ASSUME_NONNULL_BEGIN /// @param birth 生日 /// @param userDesc 用户的签名 - (void)complectionInfoWithAvatar:(NSString * _Nullable)avatar - nick:(NSString * _Nullable)nick - birth:(NSString * _Nullable)birth - userDesc:(NSString * _Nullable)userDesc; + nick:(NSString * _Nullable)nick + birth:(NSString * _Nullable)birth + userDesc:(NSString * _Nullable)userDesc; /// 上传头像 /// @param avatar 头像 - (void)uploadAvatar:(UIImage *)avatar; +///获取地区列表 +-(void)getAreaList; +///保存地区列表 +-(void)saveAreaConfigWithArea:(NSString *)area; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.m b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.m index d3b3d6da..9f02f8eb 100644 --- a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.m +++ b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoEditPresenter.m @@ -1,8 +1,8 @@ // -// YMMineUserInfoEditPresenter.m -// YUMI +// XPMineUserInfoEditPresenter.m +// xplan-ios // -// Created by YUMI on 2021/9/23. +// Created by 冯硕 on 2021/9/23. // #import "XPMineUserInfoEditPresenter.h" @@ -11,10 +11,10 @@ ///Tool #import "AccountInfoStorage.h" #import "UploadImage.h" -#import "NSMutableDictionary+Saft.h" ///Model #import "XPMineUserInfoEditModel.h" #import "UserInfoModel.h" + ///P #import "XPMineUserInfoEditProtocol.h" @interface XPMineUserInfoEditPresenter () @@ -28,6 +28,13 @@ @property (nonatomic,strong) XPMineUserInfoEditModel *photoItem; ///介绍 @property (nonatomic,strong) XPMineUserInfoEditModel *desItem; +///标签 +@property (nonatomic,strong) XPMineUserInfoEditModel *tagItem; +///地区 +@property (nonatomic,strong) XPMineUserInfoEditModel *areaItem; +///声音 +@property (nonatomic,strong) XPMineUserInfoEditModel *soundItem;; + /// @property (nonatomic,strong) NSMutableArray *editArray; ///日期的格式 @@ -38,37 +45,41 @@ ///获取用户信息 - (void)getUserInfo { - NSString * uid = [AccountInfoStorage instance].getUid; - [Api getUserInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - UserInfoModel * infoModel = [UserInfoModel modelWithDictionary:data.data]; - [[self getView] onGetUserInfoSuccess:infoModel]; - }] uid:uid]; + NSString * uid = [AccountInfoStorage instance].getUid; + [Api getUserInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + UserInfoModel * infoModel = [UserInfoModel modelWithDictionary:data.data]; + [[self getView] onGetUserInfoSuccess:infoModel]; + }] uid:uid]; } ///获取个人资料页编辑的数据源 - (void)getUserInfoEditDataSourceWithUserInfo:(UserInfoModel *)userInfo { - ///数据组装 - if (self.editArray.count <= 0) { - [self.editArray addObject:self.avatarItem]; - [self.editArray addObject:self.nickItem]; - [self.editArray addObject:self.birthItem]; - [self.editArray addObject:self.photoItem]; - [self.editArray addObject:self.desItem]; - } - - + ///数据组装 + if (self.editArray.count <= 0) { + [self.editArray addObject:self.avatarItem]; + [self.editArray addObject:self.nickItem]; + [self.editArray addObject:self.birthItem]; + [self.editArray addObject:self.photoItem]; + [self.editArray addObject:self.areaItem]; + [self.editArray addObject:self.tagItem]; + [self.editArray addObject:self.soundItem]; + [self.editArray addObject:self.desItem]; + + } + + self.avatarItem.isReview = userInfo.isReview; self.avatarItem.avatarUrl = userInfo.isReview ? userInfo.reviewingAvatar : userInfo.avatar; - - self.nickItem.subTitle = userInfo.nick; - NSString *dateStr = [self.dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:userInfo.birth/1000]]; - self.birthItem.subTitle = dateStr; - - self.photoItem.photoArray = userInfo.privatePhoto; - - self.desItem.subTitle = userInfo.userDesc.length > 0 ? userInfo.userDesc : @""; - ///数据回传 - [[self getView] getUserInfoEditDataSourceSuccess:self.editArray]; + + self.nickItem.subTitle = userInfo.nick; + NSString *dateStr = [self.dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:userInfo.birth/1000]]; + self.birthItem.subTitle = dateStr; + + self.photoItem.photoArray = userInfo.privatePhoto; + + self.desItem.subTitle = userInfo.userDesc.length > 0 ? userInfo.userDesc : @""; + ///数据回传 + [[self getView] getUserInfoEditDataSourceSuccess:self.editArray]; } /// 补全资料 @@ -77,113 +88,149 @@ /// @param birth 生日 /// @param userDesc 用户的签名 - (void)complectionInfoWithAvatar:(NSString * _Nullable)avatar - nick:(NSString * _Nullable)nick - birth:(NSString * _Nullable)birth - userDesc:(NSString * _Nullable)userDesc { - NSString * uid = [AccountInfoStorage instance].getUid; - NSString * ticket = [[AccountInfoStorage instance] getTicket]; - NSMutableDictionary * dic = [NSMutableDictionary dictionary]; - if (avatar.length > 0) { - [dic safeSetObject:avatar forKey:@"avatar"]; - } - - if (nick.length > 0) { - [dic safeSetObject:nick forKey:@"nick"]; - } - - if (birth.length > 0) { - [dic safeSetObject:birth forKey:@"birth"]; - } - - if (userDesc.length > 0) { - [dic safeSetObject:userDesc forKey:@"userDesc"]; - } - - [dic safeSetObject:uid forKey:@"uid"]; - [dic safeSetObject:ticket forKey:@"ticket"]; - [Api completeUserInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + nick:(NSString * _Nullable)nick + birth:(NSString * _Nullable)birth + userDesc:(NSString * _Nullable)userDesc { + NSString * uid = [AccountInfoStorage instance].getUid; + NSString * ticket = [[AccountInfoStorage instance] getTicket]; + NSMutableDictionary * dic = [NSMutableDictionary dictionary]; + if (avatar.length > 0) { + [dic setValue:avatar forKey:@"avatar"]; + } + + if (nick.length > 0) { + [dic setValue:nick forKey:@"nick"]; + } + + if (birth.length > 0) { + [dic setValue:birth forKey:@"birth"]; + } + + if (userDesc.length > 0) { + [dic setValue:userDesc forKey:@"userDesc"]; + } + + [dic setObject:uid forKey:@"uid"]; + [dic setObject:ticket forKey:@"ticket"]; + [Api completeUserInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { UserInfoModel * infoModel = [UserInfoModel modelWithDictionary:data.data]; [[self getView] completeUserInfoSuccess:infoModel]; - }] userInfo:dic]; + }] userInfo:dic]; } /// 上传头像 /// @param avatar 头像 - (void)uploadAvatar:(UIImage *)avatar { - [Api qiniuUpLoadImage:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - NSString *key = data.data[@"key"]; - NSString *token = data.data[@"token"]; - [UploadImage uploadImage:avatar named:key token:token success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { - NSString *url = resp[@"path"]; - [[self getView] uploadImageSuccess:url]; - } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { - [[self getView] showErrorToast:YMLocalizedString(@"XPMineUserInfoEditPresenter0")]; - }]; - }]]; + [Api qiniuUpLoadImage:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + NSString *key = data.data[@"key"]; + NSString *token = data.data[@"token"]; + [UploadImage uploadImage:avatar named:key token:token success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { + NSString *url = resp[@"path"]; + [[self getView] uploadImageSuccess:url]; + } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { + [[self getView] showErrorToast:YMLocalizedString(@"XPMineUserInfoEditPresenter0")]; + }]; + }]]; } - +///获取地区列表 +-(void)getAreaList{ + [Api getAreaList:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + [[self getView]getAreaListSuccess:data.data]; + }showLoading:NO]]; +} +///保存地区列表 +-(void)saveAreaConfigWithArea:(NSString *)area{ + [Api saveAreaConfigWithArea:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + [[self getView]saveAreaSuccess]; + }showLoading:YES errorToast:YES] region:area]; +} #pragma mark - Getters And Setters - (XPMineUserInfoEditModel *)nickItem { - if (!_nickItem) { - _nickItem = [[XPMineUserInfoEditModel alloc] init]; - _nickItem.type = XPMineUserInfoEditType_Nick; - _nickItem.title = YMLocalizedString(@"XPMineUserInfoEditPresenter1"); - } - return _nickItem; + if (!_nickItem) { + _nickItem = [[XPMineUserInfoEditModel alloc] init]; + _nickItem.type = XPMineUserInfoEditType_Nick; + _nickItem.title = YMLocalizedString(@"XPMineUserInfoEditPresenter1"); + } + return _nickItem; } - (XPMineUserInfoEditModel *)avatarItem { - if (!_avatarItem) { - _avatarItem = [[XPMineUserInfoEditModel alloc] init]; - _avatarItem.type = XPMineUserInfoEditType_Avatar; + if (!_avatarItem) { + _avatarItem = [[XPMineUserInfoEditModel alloc] init]; + _avatarItem.type = XPMineUserInfoEditType_Avatar; _avatarItem.title = YMLocalizedString(@"XPMineUserInfoEditPresenter2"); - } - return _avatarItem; + } + return _avatarItem; } - (XPMineUserInfoEditModel *)birthItem { - if (!_birthItem) { - _birthItem = [[XPMineUserInfoEditModel alloc] init]; - _birthItem.type = XPMineUserInfoEditType_Birth; - _birthItem.title =YMLocalizedString(@"XPMineUserInfoEditPresenter3"); - } - return _birthItem; + if (!_birthItem) { + _birthItem = [[XPMineUserInfoEditModel alloc] init]; + _birthItem.type = XPMineUserInfoEditType_Birth; + _birthItem.title = YMLocalizedString(@"XPMineUserInfoEditPresenter3"); + } + return _birthItem; +} +-(XPMineUserInfoEditModel *)areaItem{ + if (!_areaItem){ + _areaItem = [XPMineUserInfoEditModel new]; + _areaItem.type = XPMineUserInfoEditType_Area; + _areaItem.title = YMLocalizedString(@"XPMineUserInfoEditPresenter10"); + } + return _areaItem; +} +- (XPMineUserInfoEditModel *)tagItem{ + if (!_tagItem){ + _tagItem = [XPMineUserInfoEditModel new]; + _tagItem.type = XPMineUserInfoEditType_Tag; + _tagItem.title = YMLocalizedString(@"XPMineUserInfoEditPresenter8"); + _tagItem.subTitle = YMLocalizedString(@"XPMineUserInfoEditPresenter9"); + } + return _tagItem; } - - (XPMineUserInfoEditModel *)photoItem { - if (!_photoItem) { - _photoItem = [[XPMineUserInfoEditModel alloc] init]; - _photoItem.type = XPMineUserInfoEditType_Photo; + if (!_photoItem) { + _photoItem = [[XPMineUserInfoEditModel alloc] init]; + _photoItem.type = XPMineUserInfoEditType_Photo; _photoItem.title = YMLocalizedString(@"XPMineUserInfoEditPresenter4"); - } - return _photoItem; + } + return _photoItem; } - (XPMineUserInfoEditModel *)desItem { - if (!_desItem) { - _desItem = [[XPMineUserInfoEditModel alloc] init]; - _desItem.type = XPMineUserInfoEditType_UseDes; + if (!_desItem) { + _desItem = [[XPMineUserInfoEditModel alloc] init]; + _desItem.type = XPMineUserInfoEditType_UseDes; _desItem.title = YMLocalizedString(@"XPMineUserInfoEditPresenter5"); - } - return _desItem; + } + return _desItem; +} +- (XPMineUserInfoEditModel *)soundItem{ + if (!_soundItem){ + _soundItem = [[XPMineUserInfoEditModel alloc]init]; + _soundItem.type = XPMineUserInfoEditType_Sound; + _soundItem.title = YMLocalizedString(@"XPMineUserInfoEditPresenter6"); + _soundItem.subTitle = YMLocalizedString(@"XPMineUserInfoEditPresenter7"); + } + return _soundItem; } - - (NSMutableArray *)editArray { - if (!_editArray) { - _editArray = [NSMutableArray array]; - } - return _editArray; + if (!_editArray) { + _editArray = [NSMutableArray array]; + } + return _editArray; } - (NSDateFormatter *)dateFormatter { - if (!_dateFormatter) { - _dateFormatter = [[NSDateFormatter alloc] init]; - _dateFormatter.dateFormat = @"yyyy-MM-dd"; - } - return _dateFormatter; + if (!_dateFormatter) { + _dateFormatter = [[NSDateFormatter alloc] init]; + _dateFormatter.dateFormat = @"yyyy-MM-dd"; + + } + return _dateFormatter; } diff --git a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.h b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.h index 2ca77310..b3cdcf9f 100644 --- a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.h +++ b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.h @@ -27,7 +27,20 @@ NS_ASSUME_NONNULL_BEGIN ///@param targetUid 被访问用户的uid - (void)visitUser:(NSString *)targetUid; +/// 上传声音文件 +/// @param filePath 文件路径 +- (void)uploadVoice:(NSString *)filePath; +/// 保存声音 +/// @param audioUrl 声音链接 +/// @param second 秒数 +-(void)saveSoundWithUrl:(NSString *)audioUrl second:(NSString *)second; +///删除声音 +-(void)deleteSound; +///得到个人简介标签 +-(void)getTagList; +////保存个人简介标签 +-(void)saveTagListWithLabels:(NSString *)labels; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.m b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.m index e79ca5e3..43f0a501 100644 --- a/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.m +++ b/YuMi/Modules/YMMine/Presenter/XPMineUserInfoPresenter.m @@ -9,8 +9,11 @@ ///Tool #import "Api+Mine.h" #import "AccountInfoStorage.h" +#import "UploadFile.h" ///Model #import "UserInfoModel.h" +#import "XPSoundCardModel.h" +#import "XPMineUserInfoTagModel.h" ///P #import "XPMineUserInfoProtocol.h" @@ -63,5 +66,44 @@ [Api uploadVisitUserCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) { }] uid:targetUid]; } - +/// 上传声音文件 +/// @param filePath 文件路径 +- (void)uploadVoice:(NSString *)filePath { + [Api qiniuUpLoadImage:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + NSString *key = data.data[@"key"]; + NSString *token = data.data[@"token"]; + [UploadFile uploadFile:filePath named:key token:token success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { + NSString *url = resp[@"path"]; + [[self getView] uploadVoiceFileToThirdSuccess:url]; + } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { + [[self getView] uploadVoiceFileFail:message]; + }]; + } fail:^(NSInteger code, NSString * _Nullable msg) { + [[self getView] uploadVoiceFileFail:msg]; + }showLoading:NO]]; +} +-(void)saveSoundWithUrl:(NSString *)audioUrl second:(NSString *)second{ + [Api saveSoundCardInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + [[self getView]saveSoundSuccess:audioUrl]; + } fail:^(NSInteger code, NSString * _Nullable msg) { + [[self getView]saveSoundFailWithMsg:msg]; + } showLoading:NO] audioUrl:audioUrl second:second]; +} +-(void)deleteSound{ + [Api deleteSoundCardInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + [[self getView]deleteSoundSuccess]; + } showLoading:YES]]; +} +///得到个人简介标签 +-(void)getTagList{ + [Api getTagList:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + XPMineUserInfoTagModel *model = [XPMineUserInfoTagModel modelWithDictionary:data.data]; + [[self getView]getTagListSuccess:model]; + }showLoading:YES]]; +} +-(void)saveTagListWithLabels:(NSString *)labels{ + [Api saveTagList:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + [[self getView]saveTagListSuccess]; + }showLoading:YES errorToast:YES] labels:labels]; +} @end diff --git a/YuMi/Modules/YMMine/Protocol/XPMineUserInfoEditProtocol.h b/YuMi/Modules/YMMine/Protocol/XPMineUserInfoEditProtocol.h index d2db4dba..7893dc9e 100644 --- a/YuMi/Modules/YMMine/Protocol/XPMineUserInfoEditProtocol.h +++ b/YuMi/Modules/YMMine/Protocol/XPMineUserInfoEditProtocol.h @@ -1,15 +1,16 @@ // -// YMMineUserInfoEditProtocol.h -// YUMI +// XPMineUserInfoEditProtocol.h +// xplan-ios // -// Created by YUMI on 2021/9/23. +// Created by 冯硕 on 2021/9/23. // #import NS_ASSUME_NONNULL_BEGIN -@class UserInfoModel; +@class UserInfoModel,XPMineUserInfoTagModel; @protocol XPMineUserInfoEditProtocol +@optional ///获取编辑个人资料页面的数据 - (void)getUserInfoEditDataSourceSuccess:(NSArray *)array; ///补全资料 @@ -18,6 +19,10 @@ NS_ASSUME_NONNULL_BEGIN - (void)onGetUserInfoSuccess:(UserInfoModel *)userInfo; /// 上传头像成功 - (void)uploadImageSuccess:(NSString *)url; +///获取地区列表 +-(void)getAreaListSuccess:(NSArray *)list; +///保存地区列表 +-(void)saveAreaSuccess; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/Protocol/XPMineUserInfoProtocol.h b/YuMi/Modules/YMMine/Protocol/XPMineUserInfoProtocol.h index 04093593..86d8f146 100644 --- a/YuMi/Modules/YMMine/Protocol/XPMineUserInfoProtocol.h +++ b/YuMi/Modules/YMMine/Protocol/XPMineUserInfoProtocol.h @@ -1,15 +1,16 @@ // -// YMMineUserInfoProtocol.h -// YUMI +// XPMineUserInfoProtocol.h +// xplan-ios // -// Created by YUMI on 2021/9/23. +// Created by 冯硕 on 2021/9/23. // #import NS_ASSUME_NONNULL_BEGIN -@class UserInfoModel; +@class UserInfoModel,XPSoundCardModel,XPMineUserInfoTagModel; @protocol XPMineUserInfoProtocol +@optional ///获取用户信息成功 - (void)onGetUserInfoSuccess:(UserInfoModel *)userInfo; ///获取用户详细信息成功 @@ -18,6 +19,23 @@ NS_ASSUME_NONNULL_BEGIN - (void)attentionUserSuccess:(BOOL)status; ///获取关注状态 - (void)getAttentionStateSuccess:(BOOL)status; + +///上传声音卡成功 +/// @param fileUrl 声音url +- (void)uploadVoiceFileToThirdSuccess:(NSString *)fileUrl; +/// 上传声音卡失败 +/// @param message 失败消息 +- (void)uploadVoiceFileFail:(NSString *)message; +///保存声音成功 +-(void)saveSoundSuccess:(NSString *)fileUrl; +///保存声音失败 +-(void)saveSoundFailWithMsg:(NSString *)msg; +///删除声音失败 +-(void)deleteSoundSuccess; +///得到个人标签成功、 +-(void)getTagListSuccess:(XPMineUserInfoTagModel *)model; +///保存个人标签成功 +-(void)saveTagListSuccess; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftCollectionViewCell.h b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftCollectionViewCell.h index c050982b..9cd47948 100644 --- a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftCollectionViewCell.h +++ b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftCollectionViewCell.h @@ -1,8 +1,8 @@ // -// YMMineDataGiftCollectionViewCell.h -// YUMI +// XPMineDataGiftCollectionViewCell.h +// xplan-ios // -// Created by YUMI on 2022/4/14. +// Created by 冯硕 on 2022/4/14. // #import @@ -11,6 +11,21 @@ NS_ASSUME_NONNULL_BEGIN @class UserGiftWallInfoModel; @interface XPMineDataGiftCollectionViewCell : UICollectionViewCell @property (nonatomic,strong) UserGiftWallInfoModel *giftInfo; +-(void)setLevel:(int)level; @end + + + + + + + + + + + + + + NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftCollectionViewCell.m b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftCollectionViewCell.m index b0a3fdfd..7f088030 100644 --- a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftCollectionViewCell.m +++ b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftCollectionViewCell.m @@ -1,21 +1,25 @@ // -// YMMineDataGiftCollectionViewCell.m -// YUMI +// XPMineDataGiftCollectionViewCell.m +// xplan-ios // -// Created by YUMI on 2022/4/14. +// Created by 冯硕 on 2022/4/14. // #import "XPMineDataGiftCollectionViewCell.h" ///Third #import ///Tool -#import "DJDKMIMOMColor.h" #import "NetImageView.h" #import "UIView+Corner.h" ///Model #import "UserGiftWallInfoModel.h" @interface XPMineDataGiftCollectionViewCell () +///背景 +@property (nonatomic,strong) UIView *bgView; +///排名 +@property (nonatomic,strong) UIImageView *levelImageView; + ///礼物头像 @property (nonatomic,strong) NetImageView *giftImageView; ///礼物个数 @@ -25,66 +29,114 @@ @implementation XPMineDataGiftCollectionViewCell - (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self initSubViews]; - [self initSubViewConstraints]; - } - return self; + self = [super initWithFrame:frame]; + if (self) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; } #pragma mark - Private Method - (void)initSubViews { - self.backgroundColor = [UIColor clearColor]; - [self.contentView addSubview:self.giftImageView]; - [self.contentView addSubview:self.giftNumberLabel]; + self.backgroundColor = [UIColor clearColor]; + [self.contentView addSubview:self.bgView]; + [self.bgView addSubview:self.giftImageView]; + [self.bgView addSubview:self.giftNumberLabel]; + [self.bgView addSubview:self.levelImageView]; } - (void)initSubViewConstraints { - [self.giftImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.size.mas_equalTo(CGSizeMake(47, 47)); - make.top.centerX.mas_equalTo(self.contentView); - }]; - - [self.giftNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerX.mas_equalTo(self.contentView); - make.top.mas_equalTo(self.giftImageView.mas_bottom).offset(3); - make.size.mas_equalTo(CGSizeMake(51, 15)); - }]; + [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.contentView); + }]; + + + [self.giftImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(kGetScaleWidth(59), kGetScaleWidth(63))); + make.centerX.mas_equalTo(self.contentView); + make.top.mas_equalTo(kGetScaleWidth(5)); + }]; + + [self.giftNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.bottom.mas_equalTo(self.bgView).offset(-kGetScaleWidth(6)); + make.height.mas_equalTo(kGetScaleWidth(14)); + }]; + [self.levelImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.top.mas_equalTo(kGetScaleWidth(3)); + make.width.height.mas_equalTo(kGetScaleWidth(19)); + }]; } #pragma mark - Getters And Setters + +-(void)setLevel:(int)level{ + [self.giftImageView mas_updateConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(kGetScaleWidth(59.72), kGetScaleWidth(63.03))); + }]; + if(level == 1){ + self.levelImageView.hidden = NO; + _levelImageView.image = [UIImage imageNamed:@"gift_list_one"]; + }else if(level == 2){ + self.levelImageView.hidden = NO; + _levelImageView.image = [UIImage imageNamed:@"gift_list_two"]; + }else if(level == 3){ + self.levelImageView.hidden = NO; + _levelImageView.image = [UIImage imageNamed:@"gift_list_three"]; + }else{ + [self.giftImageView mas_updateConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(kGetScaleWidth(60.16), kGetScaleWidth(55.58))); + }]; + self.levelImageView.hidden = YES; + } +} + - (void)setGiftInfo:(UserGiftWallInfoModel *)giftInfo { - _giftInfo = giftInfo; - if (_giftInfo) { - self.giftImageView.imageUrl = _giftInfo.picUrl; - self.giftNumberLabel.text = [NSString stringWithFormat:@"X%ld", _giftInfo.reciveCount]; - } + _giftInfo = giftInfo; + if (_giftInfo) { + self.giftImageView.imageUrl = _giftInfo.picUrl; + self.giftNumberLabel.text = [NSString stringWithFormat:@"X%ld", _giftInfo.reciveCount]; + } } - (NetImageView *)giftImageView { - if (!_giftImageView) { - NetImageConfig * config = [[NetImageConfig alloc]init]; - config.imageType = ImageTypeUserIcon; - config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; - _giftImageView = [[NetImageView alloc] initWithConfig:config]; - } - return _giftImageView; + if (!_giftImageView) { + NetImageConfig * config = [[NetImageConfig alloc]init]; + config.imageType = ImageTypeUserIcon; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + _giftImageView = [[NetImageView alloc] initWithConfig:config]; + } + return _giftImageView; } - (UILabel *)giftNumberLabel { - if (!_giftNumberLabel) { - _giftNumberLabel = [[UILabel alloc] init]; - _giftNumberLabel.font = [UIFont systemFontOfSize:10]; - _giftNumberLabel.textColor = [DJDKMIMOMColor mainTextColor]; - _giftNumberLabel.backgroundColor = UIColorFromRGB(0xF1F1FA); - _giftNumberLabel.textAlignment = NSTextAlignmentCenter; - [_giftNumberLabel setCornerWithLeftTopCorner:2 rightTopCorner:6 bottomLeftCorner:6 bottomRightCorner:2 size:CGSizeMake(51, 15)]; - } - return _giftNumberLabel; + if (!_giftNumberLabel) { + _giftNumberLabel = [[UILabel alloc] init]; + _giftNumberLabel.font = [UIFont systemFontOfSize:kGetScaleWidth(10) weight:UIFontWeightRegular]; + _giftNumberLabel.textColor = UIColorFromRGB(0x6D6B89); + _giftNumberLabel.textAlignment = NSTextAlignmentCenter; + + } + return _giftNumberLabel; } - +- (UIView *)bgView{ + if (!_bgView){ + _bgView = [UIView new]; + _bgView.backgroundColor = UIColorFromRGB(0xF3F5FA); + _bgView.layer.cornerRadius = kGetScaleWidth(8); + _bgView.layer.masksToBounds = YES; + } + return _bgView; +} +- (UIImageView *)levelImageView{ + if (!_levelImageView){ + _levelImageView = [UIImageView new]; + _levelImageView.hidden = NO; + } + return _levelImageView; +} @end diff --git a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftTableViewCell.h b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftTableViewCell.h index 30bb1723..c11491f2 100644 --- a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftTableViewCell.h +++ b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftTableViewCell.h @@ -1,8 +1,8 @@ // -// YMMineDataGiftTableViewCell.h -// YUMI +// XPMineDataGiftTableViewCell.h +// xplan-ios // -// Created by YUMI on 2022/4/14. +// Created by 冯硕 on 2022/4/14. // #import diff --git a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftTableViewCell.m b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftTableViewCell.m index ce62bc35..676654ba 100644 --- a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftTableViewCell.m +++ b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineDataGiftTableViewCell.m @@ -1,8 +1,8 @@ // -// YMMineDataGiftTableViewCell.m -// YUMI +// XPMineDataGiftTableViewCell.m +// xplan-ios // -// Created by YUMI on 2022/4/14. +// Created by 冯硕 on 2022/4/14. // #import "XPMineDataGiftTableViewCell.h" @@ -12,8 +12,6 @@ #import #import ///Tool -#import "YUMIMacroUitls.h" -#import "DJDKMIMOMColor.h" #import "UIImageConstant.h" #import "UIButton+EnlargeTouchArea.h" #import "UIImage+Utils.h" @@ -23,10 +21,10 @@ @interface XPMineDataGiftTableViewCell () ///背景 @property (nonatomic,strong) UIImageView * backImageView; -///显示更多 +/////显示更多 @property (nonatomic,strong) UIButton *arrowButton; -///标题 -@property (nonatomic,strong) UILabel *titleLabel; +/////标题 +//@property (nonatomic,strong) UILabel *titleLabel; ///分页标题 @property (nonatomic, strong) NSArray *titles; ///分页控件 @@ -42,186 +40,188 @@ @implementation XPMineDataGiftTableViewCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { - [self initSubViews]; - [self initSubViewConstraints]; - } - return self; + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; } #pragma mark - Private Method - (void)initSubViews { - self.backgroundColor = [UIColor clearColor]; - self.selectionStyle = UITableViewCellSelectionStyleNone; - [self.contentView addSubview:self.backImageView]; - - [self.backImageView addSubview:self.titleLabel]; - [self.backImageView addSubview:self.arrowButton]; - [self.backImageView addSubview:self.titleView]; - [self.backImageView addSubview:self.containerView]; + self.backgroundColor = [UIColor clearColor]; + self.selectionStyle = UITableViewCellSelectionStyleNone; + [self.contentView addSubview:self.backImageView]; + +// [self.backImageView addSubview:self.titleLabel]; + [self.backImageView addSubview:self.arrowButton]; + [self.backImageView addSubview:self.titleView]; + [self.backImageView addSubview:self.containerView]; } - (void)initSubViewConstraints { - [self.backImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.mas_equalTo(self.contentView).inset(15); - make.top.mas_equalTo(self.contentView); - make.bottom.mas_equalTo(self.contentView).offset(-15); - }]; - - [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.mas_equalTo(self.backImageView).offset(12); - make.top.mas_equalTo(self.backImageView).offset(12); - }]; - - [self.arrowButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.size.mas_equalTo(CGSizeMake(13, 22)); - make.centerY.mas_equalTo(self.titleLabel); - make.right.mas_equalTo(self.backImageView).offset(-15); - }]; - - [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerX.mas_equalTo(self.backImageView); - make.width.mas_equalTo(100 * 2 + 20); - make.height.mas_equalTo(30); - make.top.mas_equalTo(self.titleLabel.mas_bottom).offset(23); - }]; - - [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.bottom.mas_equalTo(self.backImageView); - make.top.mas_equalTo(self.titleView.mas_bottom).offset(20); - }]; + [self.backImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.contentView).inset(15); + make.top.mas_equalTo(self.contentView); + make.bottom.mas_equalTo(self.contentView).offset(-15); + }]; + +// [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { +// make.left.mas_equalTo(self.backImageView).offset(12); +// make.top.mas_equalTo(self.backImageView).offset(12); +// }]; +// + [self.arrowButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(13, 22)); + make.centerY.equalTo(self.titleView); + make.right.mas_equalTo(self.backImageView).offset(-15); + }]; + + [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.backImageView); + make.width.mas_equalTo(kGetScaleWidth(200)); + make.height.mas_equalTo(kGetScaleWidth(30)); + make.top.mas_equalTo(kGetScaleWidth(14)); + }]; + + [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.bottom.mas_equalTo(self.backImageView); + make.top.mas_equalTo(self.titleView.mas_bottom).offset(kGetScaleWidth(20)); + }]; + } #pragma mark - JXCategoryViewDelegate - (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView { - return self.titles.count; + return self.titles.count; } - (id)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index { - if (index == 0) { - return self.normalGiftView; - } else { - return self.luckyGiftView; - } + if (index == 0) { + return self.normalGiftView; + } else { + return self.luckyGiftView; + } } #pragma mark - Event Response - (void)arrowButtonAction:(UIButton *)sender { - if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineDataGiftTableViewCell:didClickMore:)]) { - [self.delegate xPMineDataGiftTableViewCell:self didClickMore:sender]; - } + if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineDataGiftTableViewCell:didClickMore:)]) { + [self.delegate xPMineDataGiftTableViewCell:self didClickMore:sender]; + } } #pragma mark - Getters And Setters - (void)setUserGiftWall:(NSArray *)userGiftWall { - _userGiftWall = userGiftWall; - if (_userGiftWall.count > 12) { - NSMutableArray * array = [_userGiftWall mutableCopy]; - _userGiftWall = [array subarrayWithRange:NSMakeRange(0, 12)]; - } - self.normalGiftView.datasource = _userGiftWall; + _userGiftWall = userGiftWall; + if (_userGiftWall.count > 11) { + NSMutableArray * array = [_userGiftWall mutableCopy]; + _userGiftWall = [array subarrayWithRange:NSMakeRange(0, 11)]; + } + + self.normalGiftView.datasource = _userGiftWall; } - (void)setUserLuckyBagGiftWall:(NSArray *)userLuckyBagGiftWall { - _userLuckyBagGiftWall = userLuckyBagGiftWall; - if (_userLuckyBagGiftWall.count > 12) { - NSMutableArray * array = [_userLuckyBagGiftWall mutableCopy]; - _userLuckyBagGiftWall = [array subarrayWithRange:NSMakeRange(0, 12)]; - } - self.luckyGiftView.datasource = _userLuckyBagGiftWall; + _userLuckyBagGiftWall = userLuckyBagGiftWall; + if (_userLuckyBagGiftWall.count > 11) { + NSMutableArray * array = [_userLuckyBagGiftWall mutableCopy]; + _userLuckyBagGiftWall = [array subarrayWithRange:NSMakeRange(0, 11)]; + } + self.luckyGiftView.datasource = _userLuckyBagGiftWall; } - (UIImageView *)backImageView { - if (!_backImageView) { - _backImageView = [[UIImageView alloc] init]; - _backImageView.userInteractionEnabled = YES; - _backImageView.layer.cornerRadius = 10; - _backImageView.backgroundColor =[DJDKMIMOMColor appCellBackgroundColor]; - _backImageView.layer.shadowColor = UIColorFromRGB(0xE4E4E4).CGColor; - _backImageView.layer.shadowOpacity = 1; - _backImageView.layer.shadowOffset = CGSizeMake(0, 2); - _backImageView.layer.shadowRadius = 8; - } - return _backImageView; -} - -- (UILabel *)titleLabel { - if (!_titleLabel) { - _titleLabel = [[UILabel alloc] init]; - _titleLabel.text = YMLocalizedString(@"XPMineDataGiftTableViewCell0"); - _titleLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium]; - _titleLabel.textColor = [DJDKMIMOMColor mainTextColor]; - } - return _titleLabel; + if (!_backImageView) { + _backImageView = [[UIImageView alloc] init]; + _backImageView.userInteractionEnabled = YES; + _backImageView.layer.cornerRadius = 10; + _backImageView.backgroundColor =[DJDKMIMOMColor appCellBackgroundColor]; + _backImageView.layer.shadowColor = UIColorFromRGB(0xE4E4E4).CGColor; + _backImageView.layer.shadowOpacity = 1; + _backImageView.layer.shadowOffset = CGSizeMake(0, 2); + _backImageView.layer.shadowRadius = 8; + } + return _backImageView; } +//- (UILabel *)titleLabel { +// if (!_titleLabel) { +// _titleLabel = [[UILabel alloc] init]; +// _titleLabel.text = @"礼物墙"; +// _titleLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium]; +// _titleLabel.textColor = [DJDKMIMOMColor mainTextColor]; +// } +// return _titleLabel; +//} +// - (UIButton *)arrowButton { - if (!_arrowButton) { - _arrowButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_arrowButton setImage:[UIImage imageNamed:@"room_setting_arrow"] forState:UIControlStateNormal]; - [_arrowButton setImage:[UIImage imageNamed:@"room_setting_arrow"] forState:UIControlStateSelected]; - [_arrowButton addTarget:self action:@selector(arrowButtonAction:) forControlEvents:UIControlEventTouchUpInside]; - [_arrowButton setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; - } - return _arrowButton; + if (!_arrowButton) { + _arrowButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_arrowButton setImage:[UIImage imageNamed:@"room_setting_arrow"] forState:UIControlStateNormal]; + [_arrowButton setImage:[UIImage imageNamed:@"room_setting_arrow"] forState:UIControlStateSelected]; + [_arrowButton addTarget:self action:@selector(arrowButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + [_arrowButton setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; + } + return _arrowButton; } - (JXCategoryTitleView *)titleView { - if (!_titleView) { - _titleView = [[JXCategoryTitleView alloc] init]; - _titleView.delegate = self; - _titleView.titles = self.titles; - _titleView.backgroundColor = [UIColor clearColor]; - _titleView.titleColor = [DJDKMIMOMColor secondTextColor]; - _titleView.titleSelectedColor = [DJDKMIMOMColor mainTextColor]; - _titleView.titleFont = [UIFont systemFontOfSize:12]; - _titleView.titleSelectedFont = [UIFont systemFontOfSize:12 weight:UIFontWeightMedium]; - _titleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter; - _titleView.contentScrollViewClickTransitionAnimationEnabled = NO; - _titleView.defaultSelectedIndex = 0; - _titleView.cellSpacing = 20; - _titleView.cellWidthIncrement = 5; - _titleView.cellWidth = 60; - _titleView.listContainer = self.containerView; - - JXCategoryIndicatorImageView *lineView = [[JXCategoryIndicatorImageView alloc] init]; - lineView.indicatorImageViewSize = CGSizeMake(60, 8); - lineView.verticalMargin = 6; - lineView.indicatorImageView.image = [UIImage gradientColorImageFromColors:@[UIColorFromRGB(0xFFC000), UIColorFromRGB(0xFFD15A)] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(60, 8)]; - lineView.indicatorImageView.layer.masksToBounds = YES; - lineView.indicatorImageView.layer.cornerRadius = 6; - _titleView.indicators = @[lineView]; - } - return _titleView; + if (!_titleView) { + _titleView = [[JXCategoryTitleView alloc] init]; + _titleView.delegate = self; + _titleView.titles = self.titles; + _titleView.backgroundColor = [UIColor clearColor]; + _titleView.titleColor = UIColorFromRGB(0xB3B3C3); + _titleView.titleSelectedColor = UIColorFromRGB(0x1F1A4E); + _titleView.titleFont = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium]; + _titleView.titleSelectedFont = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium]; + _titleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter; + _titleView.contentScrollViewClickTransitionAnimationEnabled = NO; + _titleView.defaultSelectedIndex = 0; + _titleView.cellSpacing = 20; + _titleView.cellWidthIncrement = 5; + _titleView.cellWidth = 60; + _titleView.listContainer = self.containerView; + + JXCategoryIndicatorImageView *lineView = [[JXCategoryIndicatorImageView alloc] init]; + lineView.indicatorImageViewSize = CGSizeMake(15, 3); + lineView.verticalMargin = 0; + lineView.indicatorImageView.image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor], [DJDKMIMOMColor confirmButtonGradientMiddleColor],[DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(15, 3)]; + lineView.indicatorImageView.layer.masksToBounds = YES; + lineView.indicatorImageView.layer.cornerRadius = 1.5; + _titleView.indicators = @[lineView]; + } + return _titleView; } - (JXCategoryListContainerView *)containerView { - if (!_containerView) { - _containerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self]; - _containerView.defaultSelectedIndex = 0; - _containerView.scrollView.tag = 1009; - } - return _containerView; + if (!_containerView) { + _containerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self]; + _containerView.defaultSelectedIndex = 0; + _containerView.scrollView.tag = 1009; + } + return _containerView; } - (NSArray *)titles { - if (!_titles) { - _titles = @[YMLocalizedString(@"XPWishGiftCreateItemViewController0"), YMLocalizedString(@"XPMineDataGiftTableViewCell2")]; - } - return _titles; + if (!_titles) { + _titles = @[YMLocalizedString(@"XPMineDataGiftTableViewCell0"), YMLocalizedString(@"XPMineDataGiftTableViewCell1")]; + } + return _titles; } - (XPMineUserInfoGiftView *)normalGiftView { - if (!_normalGiftView) { - _normalGiftView = [[XPMineUserInfoGiftView alloc] init]; - } - return _normalGiftView; + if (!_normalGiftView) { + _normalGiftView = [[XPMineUserInfoGiftView alloc] init]; + } + return _normalGiftView; } - (XPMineUserInfoGiftView *)luckyGiftView { - if (!_luckyGiftView) { - _luckyGiftView = [[XPMineUserInfoGiftView alloc] init]; - } - return _luckyGiftView; + if (!_luckyGiftView) { + _luckyGiftView = [[XPMineUserInfoGiftView alloc] init]; + } + return _luckyGiftView; } @end diff --git a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditMainTagView.h b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditMainTagView.h new file mode 100644 index 00000000..0a8f606f --- /dev/null +++ b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditMainTagView.h @@ -0,0 +1,17 @@ +// +// XPMineUserInfoEditMainTagView.h +// xplan-ios +// +// Created by duoban on 2023/2/23. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XPMineUserInfoEditMainTagView : UIView +@property (nonatomic,strong) NSMutableArray *itemList; +@property (nonatomic,assign) CGFloat maxWidth; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditMainTagView.m b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditMainTagView.m new file mode 100644 index 00000000..bbc7abb9 --- /dev/null +++ b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditMainTagView.m @@ -0,0 +1,47 @@ +// +// XPMineUserInfoEditMainTagView.m +// xplan-ios +// +// Created by duoban on 2023/2/23. +// + +#import "XPMineUserInfoEditMainTagView.h" +#import "XPMineUserInfoTagModel.h" +#import "XPMineUserInfoEditTagView.h" +@interface XPMineUserInfoEditMainTagView() + +@end +@implementation XPMineUserInfoEditMainTagView + + +-(void)setItemList:(NSMutableArray *)itemList{ + _itemList = itemList; + CGFloat x = 0; + if(self.subviews.count > 0){ + for (UIView *view in self.subviews) { + [view removeFromSuperview]; + } + } + for (int i = 0; i < _itemList.count; i++) { + XPMineUserInfoTagItemModel *model = _itemList[i]; + if(i > 0){ + XPMineUserInfoTagItemModel *getModel = _itemList[i-1]; + x = x + getModel.width + kGetScaleWidth(5); + } + XPMineUserInfoEditTagView *tagView = [[XPMineUserInfoEditTagView alloc]initWithFrame:CGRectZero]; + [self addSubview:tagView]; + [tagView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(x); + make.centerY.equalTo(self); + make.height.mas_equalTo(kGetScaleWidth(18)); + make.width.mas_equalTo(model.width); + }]; + tagView.isTag = i < 3; + tagView.title = model.label; + + } + +} + + +@end diff --git a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.h b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.h index bd2cc03c..389565f5 100644 --- a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.h +++ b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.h @@ -1,17 +1,21 @@ // -// YMMineUserInfoEditTableViewCell.h -// YUMI +// XPMineUserInfoEditTableViewCell.h +// xplan-ios // -// Created by YUMI on 2021/9/23. +// Created by 冯硕 on 2021/9/23. // #import +#import "XPSoundCardModel.h" NS_ASSUME_NONNULL_BEGIN @class XPMineUserInfoEditModel; @interface XPMineUserInfoEditTableViewCell : UITableViewCell ///数据 @property (nonatomic,strong) XPMineUserInfoEditModel *itmeModel; +@property (nonatomic,strong) XPSoundCardModel *soundModel; +@property (nonatomic,strong) NSMutableArray *itemList; +@property (nonatomic,assign) CGFloat maxWidth; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.m b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.m index e78335f0..c816af34 100644 --- a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.m +++ b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.m @@ -1,23 +1,26 @@ // -// YMMineUserInfoEditTableViewCell.m -// YUMI +// XPMineUserInfoEditTableViewCell.m +// xplan-ios // -// Created by YUMI on 2021/9/23. +// Created by 冯硕 on 2021/9/23. // #import "XPMineUserInfoEditTableViewCell.h" ///Third #import ///Tool -#import "DJDKMIMOMColor.h" + ///Model +#import "XPMineUserInfoTagModel.h" #import "XPMineUserInfoEditModel.h" #import "UserPhoto.h" - +#import "XPMineUserInfoTagFlowLayout.h" #import "NetImageView.h" #import "UIImage+Utils.h" - +#import "XPMineUserInfoHeaderTagCell.h" +#import "XPMineUserInfoEditMainTagView.h" @interface XPMineUserInfoEditTableViewCell () + ///容器 @property (nonatomic,strong) UIStackView *stackView; ///标题 @@ -38,278 +41,415 @@ @property (nonatomic,strong) NetImageView *thirdPhotoImageView; ///分割线 @property (nonatomic,strong) UIView * partLineView; +///声音 +@property (nonatomic,strong) UIImageView *soundView; +///声音时间 +@property (nonatomic,strong) UILabel *soundTimeView; /// @property (nonatomic,strong) NSMutableArray *photoViewArray; +//审核View +@property (nonatomic,strong) UIImageView *reviewView; + +/// +@property (nonatomic,strong) XPMineUserInfoEditMainTagView *editTagView; + + @end @implementation XPMineUserInfoEditTableViewCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { - [self initSubViews]; - [self initSubViewConstraints]; - } - return self; + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; } #pragma mark - Private Method - (void)initSubViews { - self.backgroundColor = [UIColor clearColor]; - self.selectionStyle = UITableViewCellSelectionStyleNone; - [self.contentView addSubview:self.stackView]; - [self.contentView addSubview:self.partLineView]; - - [self.stackView addArrangedSubview:self.titleLabel]; - [self.stackView addArrangedSubview:self.avatarImageView]; - [self.stackView addArrangedSubview:self.subTitleLabel]; - [self.stackView addArrangedSubview:self.phototStackView]; - [self.stackView addArrangedSubview:self.arrowImageView]; - - [self.phototStackView addArrangedSubview:self.thirdPhotoImageView]; - [self.phototStackView addArrangedSubview:self.secondPhotoImageView]; - [self.phototStackView addArrangedSubview:self.firstPhotoImageView]; - - [self.photoViewArray addObject:self.firstPhotoImageView]; - [self.photoViewArray addObject:self.secondPhotoImageView]; - [self.photoViewArray addObject:self.thirdPhotoImageView]; + + self.backgroundColor = [UIColor clearColor]; + self.selectionStyle = UITableViewCellSelectionStyleNone; + [self.contentView addSubview:self.stackView]; + [self.contentView addSubview:self.partLineView]; + [self.soundView addSubview:self.soundTimeView]; + + [self.stackView addArrangedSubview:self.titleLabel]; + [self.stackView addArrangedSubview:self.avatarImageView]; + [self.stackView addArrangedSubview:self.subTitleLabel]; + + UIView *emptyVeiw = [UIView new]; + [self.stackView addArrangedSubview:emptyVeiw]; + [emptyVeiw mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_greaterThanOrEqualTo(5); + }]; + [self.stackView addArrangedSubview:self.phototStackView]; + [self.stackView addArrangedSubview:self.soundView]; + [self.stackView addArrangedSubview:self.arrowImageView]; + + [self.phototStackView addArrangedSubview:self.thirdPhotoImageView]; + [self.phototStackView addArrangedSubview:self.secondPhotoImageView]; + [self.phototStackView addArrangedSubview:self.firstPhotoImageView]; + + + + + + [self.photoViewArray addObject:self.firstPhotoImageView]; + [self.photoViewArray addObject:self.secondPhotoImageView]; + [self.photoViewArray addObject:self.thirdPhotoImageView]; + + [self.avatarImageView addSubview:self.reviewView]; + [self.contentView addSubview:self.editTagView]; + } - (void)initSubViewConstraints { - [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.mas_equalTo(self.contentView); - make.bottom.mas_equalTo(self.partLineView.mas_top); - make.left.right.mas_equalTo(self.contentView).inset(15); - }]; - - [self.partLineView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.mas_equalTo(self.contentView).inset(25); - make.bottom.mas_equalTo(self.contentView); - make.height.mas_equalTo(1); - }]; - - [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.size.mas_equalTo(CGSizeMake(50, 50)); - }]; - - [self.arrowImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.size.mas_equalTo(CGSizeMake(6, 10)); - }]; - - [self.firstPhotoImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.height.mas_equalTo(35); - }]; - - [self.secondPhotoImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.height.mas_equalTo(self.firstPhotoImageView); - }]; - - [self.thirdPhotoImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.height.mas_equalTo(self.firstPhotoImageView); - }]; + [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.contentView); + make.bottom.mas_equalTo(self.partLineView.mas_top); + make.left.right.mas_equalTo(self.contentView).inset(kGetScaleWidth(16)); + }]; + + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(kGetScaleWidth(58)); + }]; + [self.subTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.equalTo(self.arrowImageView.mas_left).mas_offset(-kGetScaleWidth(2)); + }]; + [self.partLineView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.contentView).inset(kGetScaleWidth(16)); + make.bottom.mas_equalTo(self.contentView); + make.height.mas_equalTo(kGetScaleWidth(0.5)); + }]; + + [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(kGetScaleWidth(50), kGetScaleWidth(50))); + make.right.equalTo(self.arrowImageView.mas_left).mas_offset(-kGetScaleWidth(2)); + }]; + + [self.arrowImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(kGetScaleWidth(20), kGetScaleWidth(20))); + }]; + [self.soundView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(kGetScaleWidth(85)); + make.height.mas_equalTo(kGetScaleWidth(28)); + make.right.equalTo(self.arrowImageView.mas_left).mas_offset(-kGetScaleWidth(2)); + }]; + [self.soundTimeView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(self.soundView); + make.left.mas_equalTo(kGetScaleWidth(44)); + }]; + [self.firstPhotoImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(40)); + }]; + + [self.secondPhotoImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(self.firstPhotoImageView); + }]; + + [self.thirdPhotoImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(self.firstPhotoImageView); + }]; + [self.reviewView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.bottom.equalTo(self.avatarImageView); + make.height.mas_equalTo(kGetScaleWidth(15)); + }]; + + [self.editTagView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(kGetScaleWidth(220)); + make.right.equalTo(self.arrowImageView.mas_left).mas_offset(kGetScaleWidth(3)); + make.centerY.equalTo(self.contentView); + make.height.mas_equalTo(kGetScaleWidth(18)); + }]; } - (void)loadPhotoViewWithPhotoArray:(NSArray *)array { - if (array.count > 3) { - array = [array subarrayWithRange:NSMakeRange(0, 3)]; - } - self.firstPhotoImageView.hidden = YES; - self.secondPhotoImageView.hidden = YES; - self.thirdPhotoImageView.hidden = YES; - for (int i = 0; i < array.count; i++) { - NetImageView * imageView = [self.photoViewArray objectAtIndex:i]; - NSString * imageUrl = [array objectAtIndex:i].photoUrl; - if (imageUrl.length > 0) { - imageView.imageUrl = imageUrl; - imageView.hidden = NO; - } - } + if (array.count > 3) { + array = [array subarrayWithRange:NSMakeRange(0, 3)]; + } + self.firstPhotoImageView.hidden = YES; + self.secondPhotoImageView.hidden = YES; + self.thirdPhotoImageView.hidden = YES; + for (int i = 0; i < array.count; i++) { + NetImageView * imageView = [self.photoViewArray safeObjectAtIndex1:i]; + NSString * imageUrl = [array objectAtIndex:i].photoUrl; + if (imageUrl.length > 0) { + imageView.imageUrl = imageUrl; + imageView.hidden = NO; + } + } } - (void)configCellWithModel:(XPMineUserInfoEditModel *)model{ - switch (model.type) { - case XPMineUserInfoEditType_Avatar: - { - self.subTitleLabel.hidden = YES; - self.phototStackView.hidden = YES; - self.avatarImageView.hidden = NO; + _soundView.hidden = YES; + _editTagView.hidden = YES; + switch (model.type) { + case XPMineUserInfoEditType_Avatar: + { + self.subTitleLabel.hidden = YES; + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = NO; if (model.isReview) { - [self.avatarImageView loadImageWithUrl:model.avatarUrl completion:^(UIImage * _Nonnull image, NSURL * _Nonnull url) { - UIImage * waterImage = [UIImage imageNamed:@"mine_avatar_reviewing"]; - float ratio = waterImage.size.height / waterImage.size.width; - float rectY = image.size.height * (1 - ratio); - self.avatarImageView.image = [UIImage waterImageWithImage:image waterImage:waterImage waterImageRect:CGRectMake(0, rectY, image.size.width, image.size.height * ratio)]; - }]; + self.reviewView.hidden = NO; } else { + self.reviewView.hidden = YES; self.avatarImageView.imageUrl = model.avatarUrl; } - } - break; - case XPMineUserInfoEditType_Birth: - { - self.subTitleLabel.hidden = NO; - self.phototStackView.hidden = YES; - self.avatarImageView.hidden = YES; - } - break; - case XPMineUserInfoEditType_Nick: - { - self.subTitleLabel.hidden = NO; - self.phototStackView.hidden = YES; - self.avatarImageView.hidden = YES; - } - break; - case XPMineUserInfoEditType_UseDes: - { - self.subTitleLabel.hidden = NO; - self.phototStackView.hidden = YES; - self.avatarImageView.hidden = YES; - } - break; - case XPMineUserInfoEditType_Photo: - { - self.subTitleLabel.hidden = YES; - self.phototStackView.hidden = NO; - self.avatarImageView.hidden = YES; - [self loadPhotoViewWithPhotoArray:model.photoArray]; - } - break; - - default: - break; - } + } + break; + case XPMineUserInfoEditType_Birth: + { + self.subTitleLabel.hidden = NO; + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = YES; + } + break; + case XPMineUserInfoEditType_Nick: + { + self.subTitleLabel.hidden = NO; + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = YES; + } + break; + case XPMineUserInfoEditType_UseDes: + { + self.subTitleLabel.hidden = NO; + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = YES; + } + break; + case XPMineUserInfoEditType_Photo: + { + self.subTitleLabel.hidden = YES; + self.phototStackView.hidden = NO; + self.avatarImageView.hidden = YES; + [self loadPhotoViewWithPhotoArray:model.photoArray]; + } + break; + case XPMineUserInfoEditType_Sound: + { + + self.subTitleLabel.hidden = NO; + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = YES; + break; + } + case XPMineUserInfoEditType_Tag: + { + + + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = YES; + self.subTitleLabel.hidden = self.itemList.count > 0; + self.editTagView.hidden = !self.subTitleLabel.hidden; + break; + } + case XPMineUserInfoEditType_Area: + { + + self.subTitleLabel.hidden = NO; + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = YES; + break; + } + default: + break; + } } #pragma mark - Getters And Setters +-(void)setMaxWidth:(CGFloat)maxWidth{ + _maxWidth = maxWidth; + [_editTagView mas_updateConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(_maxWidth); + }]; + +} +-(void)setItemList:(NSMutableArray *)itemList{ + _itemList = itemList; + _editTagView.itemList = _itemList; +} + +-(void)setSoundModel:(XPSoundCardModel *)soundModel{ + _soundModel = soundModel; + if(_itmeModel.type == XPMineUserInfoEditType_Sound){ + _soundView.hidden = !(_soundModel.status == 1 || _soundModel.status == 2); + _subTitleLabel.hidden = _soundModel.status == 1 || _soundModel.status == 2; + _soundTimeView.text = [NSString stringWithFormat:@"%ld\"",_soundModel.second]; + } + +} - (void)setItmeModel:(XPMineUserInfoEditModel *)itmeModel { - _itmeModel = itmeModel; - if (_itmeModel) { - self.titleLabel.text = _itmeModel.title; - self.subTitleLabel.text = _itmeModel.subTitle; - [self configCellWithModel:itmeModel]; - } + _itmeModel = itmeModel; + if (_itmeModel) { + self.titleLabel.text = _itmeModel.title; + self.subTitleLabel.text = _itmeModel.subTitle; + [self configCellWithModel:itmeModel]; + } } - (UIStackView *)stackView { - if (!_stackView) { - _stackView = [[UIStackView alloc] init]; - _stackView.axis = UILayoutConstraintAxisHorizontal; - _stackView.distribution = UIStackViewDistributionFill; - _stackView.alignment = UIStackViewAlignmentCenter; - _stackView.spacing = 10; - } - return _stackView; + if (!_stackView) { + _stackView = [[UIStackView alloc] init]; + _stackView.axis = UILayoutConstraintAxisHorizontal; + _stackView.distribution = UIStackViewDistributionFill; + _stackView.alignment = UIStackViewAlignmentCenter; + _stackView.spacing = kGetScaleWidth(10); + } + return _stackView; } - (UILabel *)titleLabel { - if (!_titleLabel) { - _titleLabel = [[UILabel alloc] init]; - _titleLabel.font = [UIFont systemFontOfSize:14]; - _titleLabel.textColor = [DJDKMIMOMColor mainTextColor]; - [_titleLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; - } - return _titleLabel; + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.font = kFontMedium(14); + _titleLabel.textColor = [DJDKMIMOMColor inputTextColor]; + [_titleLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; + } + return _titleLabel; } - (UILabel *)subTitleLabel { - if (!_subTitleLabel) { - _subTitleLabel = [[UILabel alloc] init]; - _subTitleLabel.textColor = [DJDKMIMOMColor secondTextColor]; - _subTitleLabel.font = [UIFont systemFontOfSize:12.f]; - _subTitleLabel.textAlignment = NSTextAlignmentRight; - } - return _subTitleLabel; + if (!_subTitleLabel) { + _subTitleLabel = [[UILabel alloc] init]; + _subTitleLabel.textColor = UIColorFromRGB(0x6D6B89); + _subTitleLabel.font = kFontMedium(14); + _subTitleLabel.textAlignment = NSTextAlignmentRight; + + } + return _subTitleLabel; } - (NetImageView *)avatarImageView { - if (!_avatarImageView) { + if (!_avatarImageView) { NetImageConfig * config = [[NetImageConfig alloc]init]; config.imageType = ImageTypeUserIcon; config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; - _avatarImageView = [[NetImageView alloc] initWithConfig:config]; - _avatarImageView.userInteractionEnabled = YES; - _avatarImageView.layer.cornerRadius = 25; - _avatarImageView.layer.masksToBounds = YES; - } - return _avatarImageView; + _avatarImageView = [[NetImageView alloc] initWithConfig:config]; + _avatarImageView.userInteractionEnabled = YES; + _avatarImageView.layer.cornerRadius = kGetScaleWidth(25); + _avatarImageView.layer.masksToBounds = YES; + } + return _avatarImageView; } - (UIImageView *)arrowImageView { - if (!_arrowImageView) { - _arrowImageView = [[UIImageView alloc] init]; - _arrowImageView.userInteractionEnabled = YES; - _arrowImageView.image = [UIImage imageNamed:@"mine_item_arrow"]; - [_arrowImageView setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; - } - return _arrowImageView; + if (!_arrowImageView) { + _arrowImageView = [[UIImageView alloc] init]; + _arrowImageView.userInteractionEnabled = YES; + _arrowImageView.image = [UIImage imageNamed:@"mine_item_arrow"]; + [_arrowImageView setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; + } + return _arrowImageView; } - (UIStackView *)phototStackView { - if (!_phototStackView) { - _phototStackView = [[UIStackView alloc] init]; - _phototStackView.axis = UILayoutConstraintAxisHorizontal; - _phototStackView.distribution = UIStackViewDistributionFill; - _phototStackView.alignment = UIStackViewAlignmentFill; - _phototStackView.spacing = 10; - } - return _phototStackView; + if (!_phototStackView) { + _phototStackView = [[UIStackView alloc] init]; + _phototStackView.axis = UILayoutConstraintAxisHorizontal; + _phototStackView.distribution = UIStackViewDistributionFill; + _phototStackView.alignment = UIStackViewAlignmentFill; + _phototStackView.spacing = kGetScaleWidth(8); + } + return _phototStackView; } - (NetImageView *)firstPhotoImageView { - if (!_firstPhotoImageView) { + if (!_firstPhotoImageView) { NetImageConfig * config = [[NetImageConfig alloc]init]; config.imageType = ImageTypeUserIcon; config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; - _firstPhotoImageView = [[NetImageView alloc] initWithConfig:config]; - _firstPhotoImageView.userInteractionEnabled = YES; - _firstPhotoImageView.layer.masksToBounds = YES; - _firstPhotoImageView.layer.cornerRadius = 5; - _firstPhotoImageView.hidden = YES; - } - return _firstPhotoImageView; + _firstPhotoImageView = [[NetImageView alloc] initWithConfig:config]; + _firstPhotoImageView.userInteractionEnabled = YES; + _firstPhotoImageView.layer.masksToBounds = YES; + _firstPhotoImageView.contentMode = UIViewContentModeScaleAspectFill; + _firstPhotoImageView.clipsToBounds = YES; + _firstPhotoImageView.layer.cornerRadius = kGetScaleWidth(6); + _firstPhotoImageView.hidden = YES; + } + return _firstPhotoImageView; } - (NetImageView *)secondPhotoImageView { - if (!_secondPhotoImageView) { + if (!_secondPhotoImageView) { NetImageConfig * config = [[NetImageConfig alloc]init]; config.imageType = ImageTypeUserIcon; config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; - _secondPhotoImageView = [[NetImageView alloc] initWithConfig:config]; - _secondPhotoImageView.userInteractionEnabled = YES; - _secondPhotoImageView.layer.masksToBounds = YES; - _secondPhotoImageView.layer.cornerRadius = 5; - _secondPhotoImageView.hidden = YES; - } - return _secondPhotoImageView; + _secondPhotoImageView = [[NetImageView alloc] initWithConfig:config]; + _secondPhotoImageView.userInteractionEnabled = YES; + _secondPhotoImageView.layer.masksToBounds = YES; + _secondPhotoImageView.contentMode = UIViewContentModeScaleAspectFill; + _secondPhotoImageView.clipsToBounds = YES; + _secondPhotoImageView.layer.cornerRadius = kGetScaleWidth(6); + _secondPhotoImageView.hidden = YES; + } + return _secondPhotoImageView; } - (NetImageView *)thirdPhotoImageView { - if (!_thirdPhotoImageView) { + if (!_thirdPhotoImageView) { NetImageConfig * config = [[NetImageConfig alloc]init]; config.imageType = ImageTypeUserIcon; config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; - _thirdPhotoImageView = [[NetImageView alloc] initWithConfig:config]; - _thirdPhotoImageView.userInteractionEnabled = YES; - _thirdPhotoImageView.layer.masksToBounds = YES; - _thirdPhotoImageView.layer.cornerRadius = 5; - _thirdPhotoImageView.hidden = YES; - } - return _thirdPhotoImageView; + _thirdPhotoImageView = [[NetImageView alloc] initWithConfig:config]; + _thirdPhotoImageView.userInteractionEnabled = YES; + _thirdPhotoImageView.layer.masksToBounds = YES; + _thirdPhotoImageView.contentMode = UIViewContentModeScaleAspectFill; + _thirdPhotoImageView.clipsToBounds = YES; + _thirdPhotoImageView.layer.cornerRadius = kGetScaleWidth(6); + _thirdPhotoImageView.hidden = YES; + } + return _thirdPhotoImageView; } - (UIView *)partLineView { - if (!_partLineView) { - _partLineView = [[UIView alloc] init]; - _partLineView.backgroundColor = [DJDKMIMOMColor dividerColor]; - } - return _partLineView; + if (!_partLineView) { + _partLineView = [[UIView alloc] init]; + _partLineView.backgroundColor = UIColorFromRGB(0xF1F1F1); + } + return _partLineView; +} +-(UIImageView *)soundView{ + if (!_soundView){ + _soundView = [UIImageView new]; + _soundView.image = kImage(@"mine_item_sound"); + } + return _soundView; +} +- (UILabel *)soundTimeView{ + if (!_soundTimeView){ + _soundTimeView = [UILabel labelInitWithText:@"0\"" font:kFontMedium(14) textColor:[UIColor whiteColor]]; + } + return _soundTimeView; +} +- (NSMutableArray *)photoViewArray { + if (!_photoViewArray) { + _photoViewArray = [NSMutableArray array]; + } + return _photoViewArray; +} +- (UIImageView *)reviewView{ + if (!_reviewView){ + _reviewView = [UIImageView new]; + _reviewView.hidden = YES; + _reviewView.image = kImage(@"mine_avatar_reviewing"); + UILabel *titleView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineHeadView7") font:[UIFont systemFontOfSize:9 weight:UIFontWeightRegular] textColor:[UIColor whiteColor]]; + titleView.textAlignment = NSTextAlignmentCenter; + [_reviewView addSubview:titleView]; + [titleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(_reviewView); + }]; + } + return _reviewView; } - -- (NSMutableArray *)photoViewArray { - if (!_photoViewArray) { - _photoViewArray = [NSMutableArray array]; - } - return _photoViewArray; +- (XPMineUserInfoEditMainTagView *)editTagView{ + if (!_editTagView){ + _editTagView = [[XPMineUserInfoEditMainTagView alloc]initWithFrame:CGRectZero]; + } + return _editTagView; } @end diff --git a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTagView.h b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTagView.h new file mode 100644 index 00000000..2c067e9e --- /dev/null +++ b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTagView.h @@ -0,0 +1,21 @@ +// +// XPMineUserInfoEditTagView.h +// xplan-ios +// +// Created by duoban on 2023/2/23. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XPMineUserInfoEditTagView : UIView +/// +@property (nonatomic,assign) BOOL isTag; +/// +@property (nonatomic,copy) NSString *title; +/// +@property (nonatomic,strong,readonly) UILabel *titleView; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTagView.m b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTagView.m new file mode 100644 index 00000000..6f06c6b6 --- /dev/null +++ b/YuMi/Modules/YMMine/View/Cell/MineInfo/XPMineUserInfoEditTagView.m @@ -0,0 +1,52 @@ +// +// XPMineUserInfoEditTagView.m +// xplan-ios +// +// Created by duoban on 2023/2/23. +// + +#import "XPMineUserInfoEditTagView.h" +@interface XPMineUserInfoEditTagView() +@property (nonatomic,strong) UILabel *titleView; +@end +@implementation XPMineUserInfoEditTagView + +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + [self addSubview:self.titleView]; + self.layer.cornerRadius = kGetScaleWidth(9); + self.layer.masksToBounds = YES; +} +- (void)initSubViewConstraints { + [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self); + }]; +} +-(void)setIsTag:(BOOL)isTag{ + _isTag = isTag; + self.backgroundColor = _isTag ? [UIColor colorWithRed:58/255.0 green:213/255.0 blue:248/255.0 alpha:0.12]: UIColorFromRGB(0xF3F5F9); + _titleView.textColor = _isTag ? UIColorFromRGB(0x00C4EA):UIColorFromRGB(0x6D6B89); +} +- (void)setTitle:(NSString *)title{ + _title = title; + _titleView.text = _title; +} +#pragma mark -懒加载 +- (UILabel *)titleView{ + if (!_titleView){ + _titleView = [UILabel labelInitWithText:@"" font:kFontRegular(10) textColor:UIColorFromRGB(0x00C4EA)]; + _titleView.textAlignment = NSTextAlignmentCenter; + } + return _titleView; +} + +@end diff --git a/YuMi/Modules/YMMine/View/Guild/View/XPMineGuildViewController.m b/YuMi/Modules/YMMine/View/Guild/View/XPMineGuildViewController.m index e32bc0bd..2f7d6b0b 100644 --- a/YuMi/Modules/YMMine/View/Guild/View/XPMineGuildViewController.m +++ b/YuMi/Modules/YMMine/View/Guild/View/XPMineGuildViewController.m @@ -594,7 +594,7 @@ UIKIT_EXTERN NSString *kInviteMemeberSuccess; } ///复制id -(void)copyNameAction{ - [XNDJTDDLoadingTool showSuccessWithMessage:YMLocalizedString(@"XPMineUserInfoHeaderView3")]; + [XNDJTDDLoadingTool showSuccessWithMessage:YMLocalizedString(@"XPMineUserInfoHeaderView0")]; UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = self.clanDetailInfo.hall.ownerErbanNo; } diff --git a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.h b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.h index d8ca64c4..8cbef334 100644 --- a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.h +++ b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.h @@ -1,18 +1,29 @@ // -// YMMineUserDataViewController.h -// YUMI +// XPMineUserDataViewController.h +// xplan-ios // -// Created by YUMI on 2022/4/14. +// Created by 冯硕 on 2022/4/14. // #import "MvpViewController.h" #import +#import "MonentsInfoModel.h" + NS_ASSUME_NONNULL_BEGIN @class UserInfoModel, MineSkillCardListInfoModel, XPMineUserDataViewController; +@protocol XPMineUserDataViewControllerDelegate + +///请求技能卡中有声音的技能 +- (void)xPMineUserDataViewController:(XPMineUserDataViewController *)viewController didGetVoiceSuccess:(MineSkillCardListInfoModel *)voiceCard; + +@end @interface XPMineUserDataViewController : MvpViewController @property (nonatomic,copy) NSString *userUid; ///用户信息 @property (nonatomic,strong) UserInfoModel *userInfo; +@property (nonatomic,strong) NSArray*dynamicInfo; +///代理 +@property (nonatomic,weak) id delegate; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.m b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.m index 8f1f1cba..a4e80a96 100644 --- a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.m +++ b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.m @@ -1,8 +1,8 @@ // -// YMMineUserDataViewController.m -// YUMI +// XPMineUserDataViewController.m +// xplan-ios // -// Created by YUMI on 2022/4/14. +// Created by 冯硕 on 2022/4/14. // #import "XPMineUserDataViewController.h" @@ -10,237 +10,444 @@ #import ///Tool #import "AccountInfoStorage.h" -#import "YUMIMacroUitls.h" -#import "TTPopup.h" -#import "DJDKMIMOMColor.h" -#import "YUMIHtmlUrl.h" +#import "XPMonentsLayoutConfig.h" ///View + #import "XPMineDataClanTableViewCell.h" #import "XPMineDataGiftTableViewCell.h" +#import "XPMonentsTableViewCell.h" +#import "XPMonentsEmptyTableViewCell.h" ///Model #import "ClanDetailInfoModel.h" #import "UserInfoModel.h" +#import "MineSkillCardListInfoModel.h" ///P #import "XPMineUserDataPresenter.h" #import "XPMineUserDataProtocol.h" +#import "XPMonentsMineProtocol.h" ///View + #import "XPMineUserInfoGiftWallViewController.h" #import "XPMineClanViewController.h" #import "XPMineGuildViewController.h" -#import "XPWebViewController.h" -@interface XPMineUserDataViewController () +#import "XPMonentsDetailViewController.h" +@interface XPMineUserDataViewController () ///列表 @property (nonatomic,strong) UITableView *tableView; ///家族信息 @property (nonatomic,strong) ClanDetailInfoModel *clanDetailInfo; +///技能卡 +@property (nonatomic,strong) NSArray *skillArray; ///是否折叠 @property (nonatomic,assign) BOOL isFold; @property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView); ///是否展示加入家族房间 @property (nonatomic,assign) BOOL isShowEnterClan; +///数据源 +@property (nonatomic,strong) NSMutableArray *datasource; +@property (nonatomic,strong) UIView *headView; +/// +/// +@property (nonatomic,assign) BOOL isOpne; @end @implementation XPMineUserDataViewController - (BOOL)isHiddenNavBar { - return YES; + return YES; } - (__kindof id)createPresenter { - return [[XPMineUserDataPresenter alloc] init]; + return [[XPMineUserDataPresenter alloc] init]; } - (void)viewDidLoad { [super viewDidLoad]; - [self initHettpRequest]; - [self initSubViews]; - [self initSubViewConstraints]; + [self initHettpRequest]; + [self initSubViews]; + [self initSubViewConstraints]; } #pragma mark - Http - (void)initHettpRequest { - self.isFold = YES; - self.isShowEnterClan = NO; - [self.presenter getClanDetailInfo:self.userUid currentUserUid:[AccountInfoStorage instance].getUid]; + self.isOpne = self.userUid.integerValue == [[AccountInfoStorage instance]getUid].integerValue; + self.isFold = YES; + self.isShowEnterClan = NO; + [self.presenter getClanDetailInfo:self.userUid currentUserUid:[AccountInfoStorage instance].getUid]; } #pragma mark - Private Method - (void)initSubViews { - [self.view addSubview:self.tableView]; + [self.view addSubview:self.tableView]; } - (void)initSubViewConstraints { - [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { - make.edges.mas_equalTo(self.view); - }]; -} - -///实名认证弹窗 -- (void)showRealNameAuthenticationTipsAlertView { - TTAlertConfig *config = [[TTAlertConfig alloc] init]; - config.message = YMLocalizedString(@"XPMineUserDataViewController0"); - config.messageLineSpacing = 4; - config.confirmButtonConfig.title = YMLocalizedString(@"XPMineUserDataViewController1"); - config.confirmButtonConfig.titleColor = UIColor.whiteColor; - config.confirmButtonConfig.backgroundColor = [DJDKMIMOMColor appMainColor]; - - TTAlertMessageAttributedConfig *nameAttrConf = [[TTAlertMessageAttributedConfig alloc] init]; - nameAttrConf.text = YMLocalizedString(@"XPMineUserDataViewController2"); - nameAttrConf.color = [DJDKMIMOMColor appMainColor]; - config.messageAttributedConfig = @[nameAttrConf]; - - [TTPopup alertWithConfig:config confirmHandler:^{ - - } cancelHandler:^{ - }]; + [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.view); + }]; } #pragma mark - UITableViewDelegate And UITableViewDataSource - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 2; + return 2; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - if (section == 0) { - return (self.clanDetailInfo.clan.elderUid.length > 0 || self.clanDetailInfo.hall.ownerUid.length > 0) ? 1 : 0; - } else { - return 1; - } + if(section == 0)return 1; + return self.datasource.count > 0 ? self.datasource.count : 1;; +// if(section == 0) { +// return 1; +// }else if (section == 1) { +// return (self.clanDetailInfo.clan.elderUid.length > 0 || self.clanDetailInfo.hall.ownerUid.length > 0) ? 1 : 0; +// } else { +// return 1; +// } } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - if(indexPath.section == 0) { - CGFloat itemHeigh = 40 + 15; - if (self.clanDetailInfo.clan.elderUid.length > 0) { - if (self.clanDetailInfo.hall.ownerUid.length > 0) { - return self.isFold ? (itemHeigh + 68) : (itemHeigh + 68 + 60); - }else { - return (itemHeigh + 60); - } - }else { - if (self.clanDetailInfo.hall.ownerUid.length > 0) { - return (itemHeigh + 60); - } else { - return 0; - } - } - } else { - CGFloat itemHeight = 65; - CGFloat topHeight = 100; - return itemHeight * 3 + 10 * 3 + topHeight + 25; - } + if(indexPath.section == 0){ + if(self.isOpne == YES){ + if (self.clanDetailInfo.clan.elderUid.length > 0) { + return kGetScaleWidth(172); + } + return kGetScaleWidth(152); + } + return kGetScaleWidth(128); + } + if (self.datasource.count > 0) { + MonentsInfoModel * monentInfo= [self.datasource safeObjectAtIndex1:indexPath.row]; + [XPMonentsLayoutConfig getNewlayoutMonentsModelWithDynamic:monentInfo]; + if(monentInfo.content.length == 0){ + return monentInfo.rowHeight + 20; + } + return monentInfo.rowHeight; + } + return KScreenHeight - kNavigationHeight - 49 - kSafeAreaBottomHeight; +} +- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{ + return nil; +} +- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{ + return 0.01; +} +-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ + if(section == 0)return 0.01; + return self.datasource.count > 0 ? 30 : 0.01; +} +- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ + if(section == 0)return nil; + return self.datasource.count > 0 ? self.headView : nil; +} +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + if(indexPath.section == 0){ + XPMineDataClanTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineDataClanTableViewCell class])]; + if (cell == nil) { + cell = [[XPMineDataClanTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineDataClanTableViewCell class])]; + } + cell.isOpne = self.isOpne; + cell.isShowEnterHall = self.isShowEnterClan; + cell.delegate = self; + cell.userInfo = self.userInfo; + cell.clanInfo = self.clanDetailInfo; + return cell; + } + + if (self.datasource.count > 0) { + XPMonentsTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"XPMonentsDynamicTableViewCell" forIndexPath:indexPath]; + MonentsInfoModel * monentsInfo = [self.datasource safeObjectAtIndex1:indexPath.row]; + cell.delegate = self; + cell.mineMonentsInfo = monentsInfo; + cell.isFillet = indexPath.row == self.datasource.count - 1; + return cell; + } + XPMonentsEmptyTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMonentsEmptyTableViewCell class])]; + return cell; +// if (indexPath.section == 0) { +// XPMineDataSkillCardTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineDataSkillCardTableViewCell class])]; +// if (cell == nil) { +// cell = [[XPMineDataSkillCardTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineDataSkillCardTableViewCell class])]; +// } +// cell.delegate = self; +// cell.datasourece = self.skillArray; +// return cell; +// } else if(indexPath.section == 1) { +// +// } else { +// XPMineDataGiftTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineDataGiftTableViewCell class])]; +// if (cell == nil) { +// cell = [[XPMineDataGiftTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineDataGiftTableViewCell class])]; +// } +// cell.delegate = self; +// cell.userGiftWall = self.userInfo.userGiftWall; +// cell.userLuckyBagGiftWall = self.userInfo.userLuckyBagGiftWall; +// return cell; +// } +} +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + if(indexPath.section == 0)return; + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + if (self.datasource.count > 0) { + XPMonentsDetailViewController * detailVC = [[XPMonentsDetailViewController alloc] init]; + MonentsInfoModel * monentsInfo = [self.datasource safeObjectAtIndex1:indexPath.row]; + if(monentsInfo.dynamicId == nil){ + return; + } + detailVC.monentsInfo = monentsInfo; + detailVC.delegate = self; + [self.navigationController pushViewController:detailVC animated:YES]; + } +} +#pragma mark - XPMonentsTableViewCellDelegate +- (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClickLike:(MonentsInfoModel *)monentsInfo { + if(monentsInfo.dynamicId == nil){ + [self showErrorToast:YMLocalizedString(@"XPMineUserDataViewController2")]; + return; + } + [self.presenter likeMonent:monentsInfo.dynamicId status:!monentsInfo.isLike likedUid:monentsInfo.uid worldId:[NSString stringWithFormat:@"%ld", monentsInfo.worldId]]; +} +- (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClicCommon:(MonentsInfoModel *)monentsInfo{ + if(monentsInfo.dynamicId == nil){ + [self showErrorToast:YMLocalizedString(@"XPMineUserDataViewController3")]; + return; + } + XPMonentsDetailViewController * detailVC = [[XPMonentsDetailViewController alloc] init]; + detailVC.monentsInfo = monentsInfo; + detailVC.delegate = self; + [self.navigationController pushViewController:detailVC animated:YES]; +} +- (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClicDelete:(MonentsInfoModel *)monentsInfo { + [TTPopup alertWithMessage:YMLocalizedString(@"XPMonentsMineViewController0") confirmHandler:^{ + [self.presenter deleteMonents:monentsInfo.dynamicId worldId:[NSString stringWithFormat:@"%ld", monentsInfo.worldId]]; + } cancelHandler:^{ + + }]; +} +- (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClicShielding:(nonnull MonentsInfoModel *)monentsInfo{ + + + [self showLoading]; + [self.presenter requesstShieldingWtihType:@"0" objId:monentsInfo.dynamicId]; + + +} +- (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClicFold:(MonentsInfoModel *)monentsInfo { + __block MonentsInfoModel * monentsInfos; + [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (obj.dynamicId.integerValue == monentsInfo.dynamicId.integerValue) { + monentsInfos = obj; + *stop = YES; + } + }]; + if (monentsInfos) { + NSInteger section = [self.datasource indexOfObject:monentsInfo]; + [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:section inSection:1]] withRowAnimation:UITableViewRowAnimationNone]; + } } -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - if(indexPath.section == 0) { - XPMineDataClanTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineDataClanTableViewCell class])]; - if (cell == nil) { - cell = [[XPMineDataClanTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineDataClanTableViewCell class])]; - } - cell.isShowEnterHall = self.isShowEnterClan; - cell.delegate = self; - cell.clanInfo = self.clanDetailInfo; - return cell; - } else { - XPMineDataGiftTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineDataGiftTableViewCell class])]; - if (cell == nil) { - cell = [[XPMineDataGiftTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineDataGiftTableViewCell class])]; - } - cell.delegate = self; - cell.userGiftWall = self.userInfo.userGiftWall; - cell.userLuckyBagGiftWall = self.userInfo.userLuckyBagGiftWall; - return cell; - } +#pragma mark - XPMonentsDetailViewControllerDelegate +- (void)xPMonentsDetailViewController:(XPMonentsDetailViewController *)view deleteMonents:(NSString *)dynamicId { + __block MonentsInfoModel * deleteInfo; + [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (obj.dynamicId.integerValue == dynamicId.integerValue) { + deleteInfo = obj; + } + }]; + + if (deleteInfo) { + [self.datasource removeObject:deleteInfo]; + [self.tableView reloadData]; + } +} + +#pragma mark - XPMonentsMineProtocol +- (void)requesstShieldingSuccess:(NSString *)monentsInfo{ + [self hideHUD]; + [self showSuccessToast:YMLocalizedString(@"XPMonentsMineViewController2")]; + __block MonentsInfoModel * deleteInfo; + [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (obj.dynamicId.integerValue == monentsInfo.integerValue) { + deleteInfo = obj; + } + }]; + + if (deleteInfo) { + [self.datasource removeObject:deleteInfo]; + [self.tableView reloadData]; + } +} +- (void)likeMonentsSuccess:(NSString *)dynamicId status:(BOOL)status { + [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj.dynamicId isEqualToString:dynamicId]) { + NSInteger likeCount = obj.likeCount.integerValue; + if (status) { + likeCount += 1; + obj.isLike += 1; + } else { + likeCount -= 1; + obj.isLike -= 1; + } + obj.likeCount = @(likeCount).stringValue; + *stop = YES; + } + }]; + [self.tableView reloadData]; +} + +- (void)deleteMonentsSuccess:(NSString *)monentsInfo { + [self showSuccessToast:YMLocalizedString(@"XPMonentsMineViewController1")]; + __block MonentsInfoModel * deleteInfo; + [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (obj.dynamicId.integerValue == monentsInfo.integerValue) { + deleteInfo = obj; + } + }]; + + if (deleteInfo) { + [self.datasource removeObject:deleteInfo]; + [self.tableView reloadData]; + } } #pragma mark - XPMineDataClanTableViewCellDelegate - (void)xPMineDataClanTableViewCell:(XPMineDataClanTableViewCell *)view didClickFold:(UIButton *)sender { - self.isFold = !sender.selected; - [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; + self.isFold = !sender.selected; + [self.tableView reloadData]; +// [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; +} +- (void)xPMineDataClanTableViewCell:(XPMineDataClanTableViewCell *)view didClickOpen:(ClanDetailInfoModel *)clanInfo{ + self.isOpne = YES; + [self.tableView reloadData]; } - - (void)xPMineDataClanTableViewCell:(XPMineDataClanTableViewCell *)view didClickEnter:(ClanDetailInfoModel *)clanInfo { - [self.presenter getUserInfo:[AccountInfoStorage instance].getUid success:^(UserInfoModel * _Nonnull info) { -// if (info.isCertified) { - [self.presenter memberApplyHall:clanInfo.hall.hallId]; -// } else { -// [self showRealNameAuthenticationTipsAlertView]; -// } - }]; + [self.presenter memberApplyHall:clanInfo.hall.hallId]; } - (void)xPMineDataClanTableViewCell:(XPMineDataClanTableViewCell *)view didClickClanView:(ClanDetailInfoModel *)clanInfo { - XPMineClanViewController * clanVC = [[XPMineClanViewController alloc] init]; - clanVC.uid = self.clanDetailInfo.clan.elderUid; - [self.navigationController pushViewController:clanVC animated:YES]; + XPMineClanViewController * clanVC = [[XPMineClanViewController alloc] init]; + clanVC.uid = self.clanDetailInfo.clan.elderUid; + [self.navigationController pushViewController:clanVC animated:YES]; } - (void)xPMineDataClanTableViewCell:(XPMineDataClanTableViewCell *)view didClickHallView:(ClanDetailInfoModel *)clanInfo { - XPMineGuildViewController * hallVC = [[XPMineGuildViewController alloc] init]; - hallVC.ownerUid = clanInfo.hall.ownerUid; - hallVC.guildId = clanInfo.hall.hallId; - [self.navigationController pushViewController:hallVC animated:YES]; + XPMineGuildViewController * hallVC = [[XPMineGuildViewController alloc] init]; + hallVC.ownerUid = clanInfo.hall.ownerUid; + hallVC.guildId = clanInfo.hall.hallId; + [self.navigationController pushViewController:hallVC animated:YES]; } #pragma mark - XPMineDataGiftTableViewCellDelegate - (void)xPMineDataGiftTableViewCell:(XPMineDataGiftTableViewCell *)view didClickMore:(UIButton *)sender { - XPMineUserInfoGiftWallViewController * giftWallVC = [[XPMineUserInfoGiftWallViewController alloc] init]; - giftWallVC.userUid = self.userUid; - [self.navigationController pushViewController:giftWallVC animated:YES]; + XPMineUserInfoGiftWallViewController * giftWallVC = [[XPMineUserInfoGiftWallViewController alloc] init]; + giftWallVC.userUid = self.userUid; + [self.navigationController pushViewController:giftWallVC animated:YES]; +} + +#pragma mark - XPMineDataSkillCardTableViewCell +- (void)xPMineDataSkillCardTableViewCell:(XPMineDataSkillCardTableViewCell *)view didSelectItem:(MineSkillCardListInfoModel *)skillInfo { + XPSkillCardViewController *skillCardVC = [[XPSkillCardViewController alloc] init]; + skillCardVC.uid = self.userUid.integerValue; + [self.navigationController pushViewController:skillCardVC animated:YES]; } #pragma mark - JXPagingViewListViewDelegate - (UIView *)listView { - return self.view; + return self.view; } - (UIScrollView *)listScrollView { - return self.tableView; + return self.tableView; } - (void)listViewDidScrollCallback:(void (^)(UIScrollView *))callback { - self.scrollCallback = callback; + self.scrollCallback = callback; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { - self.scrollCallback(scrollView); + self.scrollCallback(scrollView); } #pragma mark - XPMineUserDataProtocol +- (void)getUserSkillCardListSuccess:(NSArray *)list { + NSMutableArray * array = [NSMutableArray arrayWithArray:list]; + __block MineSkillCardListInfoModel * voiceCard; + [array enumerateObjectsUsingBlock:^(MineSkillCardListInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj.cardId isEqualToString:@"8"]) { + voiceCard = obj; + *stop = YES; + } + }]; + if (voiceCard) { + [array removeObject:voiceCard]; + } + if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserDataViewController:didGetVoiceSuccess:)]) { + [self.delegate xPMineUserDataViewController:self didGetVoiceSuccess:voiceCard]; + } + self.skillArray = [array copy]; + [self.tableView reloadData]; +// [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; +} + - (void)getClanDetailInfoSuccess:(ClanDetailInfoModel *)clanDetailInfo currentUserClanInfo:(ClanDetailInfoModel *)currentUserClanInfo { - self.clanDetailInfo = clanDetailInfo; - if (currentUserClanInfo.clan.elderUid.length <=0 || currentUserClanInfo.hall.ownerUid.length <=0) { - self.isShowEnterClan = YES; - } else { - self.isShowEnterClan = NO; - } - [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; + self.clanDetailInfo = clanDetailInfo; + if (clanDetailInfo.hall.hallName.length > 0 && currentUserClanInfo.hall.hallName.length <= 0 && ![[AccountInfoStorage instance].getUid isEqualToString:self.userUid]) { + self.isShowEnterClan = YES; + } else { + self.isShowEnterClan = NO; + } + [self.tableView reloadData]; +// [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone]; } - (void)memberApplyHallSuccess { - [self showSuccessToast:YMLocalizedString(@"XPMineUserDataViewController3")]; + [self showSuccessToast:YMLocalizedString(@"XPMineUserDataViewController0")]; } #pragma mark - Getters And Setters - (void)setUserInfo:(UserInfoModel *)userInfo { - _userInfo = userInfo; - [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone]; + _userInfo = userInfo; + + [self.tableView reloadData]; +} +- (void)setDynamicInfo:(NSArray *)dynamicInfo { + [self.datasource removeAllObjects]; + [self.datasource addObjectsFromArray:dynamicInfo]; + [self.tableView reloadData]; } - - (UITableView *)tableView { - if (!_tableView) { - _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; - _tableView.delegate = self; - _tableView.dataSource = self; - _tableView.tableFooterView = [UIView new]; - _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - _tableView.backgroundColor = [UIColor clearColor]; - if (@available(iOS 11.0, *)) { - _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; - } - [_tableView registerClass:[XPMineDataGiftTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineDataGiftTableViewCell class])]; - [_tableView registerClass:[XPMineDataClanTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineDataClanTableViewCell class])]; - } - return _tableView; + if (!_tableView) { + _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; + _tableView.delegate = self; + _tableView.dataSource = self; + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + _tableView.backgroundColor = [UIColor clearColor]; + if (@available(iOS 11.0, *)) { + _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + } + [_tableView registerClass:[XPMonentsEmptyTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMonentsEmptyTableViewCell class])]; + [_tableView registerClass:[XPMonentsTableViewCell class] forCellReuseIdentifier:@"XPMonentsDynamicTableViewCell"]; + [_tableView registerClass:[XPMineDataClanTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineDataClanTableViewCell class])]; + } + return _tableView; +} +- (NSMutableArray *)datasource { + if (!_datasource) { + _datasource = [NSMutableArray array]; + } + return _datasource; +} +-(UIView *)headView{ + if (!_headView){ + _headView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, 30)]; + _headView.backgroundColor = [UIColor clearColor]; + UIView *bgView = [[UIView alloc]initWithFrame:CGRectMake(15, 0, KScreenWidth-30, 30)]; + [_headView addSubview:bgView]; + bgView.backgroundColor = [UIColor whiteColor]; + [bgView setCornerWithLeftTopCorner:8 rightTopCorner:8 bottomLeftCorner:0 bottomRightCorner:0 size:CGSizeMake(KScreenWidth-30, 30)]; + UILabel *titleView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserDataViewController1") font:kFontMedium(15) textColor:[DJDKMIMOMColor inputTextColor]]; + [bgView addSubview:titleView]; + [titleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(12); + make.left.mas_equalTo(12); + }]; + } + return _headView; } - - @end diff --git a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoEditViewController.h b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoEditViewController.h index b33e0a6d..20ce8805 100644 --- a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoEditViewController.h +++ b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoEditViewController.h @@ -1,15 +1,28 @@ // -// YMMineUserInfoEditViewController.h -// YUMI +// XPMineUserInfoEditViewController.h +// xplan-ios // -// Created by YUMI on 2021/9/23. +// Created by 冯硕 on 2021/9/23. // #import "MvpViewController.h" - +#import "XPSoundCardModel.h" +#import "XPMineUserInfoTagModel.h" NS_ASSUME_NONNULL_BEGIN -@interface XPMineUserInfoEditViewController : MvpViewController +@class XPMineUserInfoEditViewController; +@protocol XPMineUserInfoEditViewControllerDelegate +- (void)xPMineUserInfoEditViewControllerC:(XPMineUserInfoEditViewController *)vc didClickComplete:(NSString *)meLabels; +- (void)xPMineUserInfoEditViewControllerC:(XPMineUserInfoEditViewController *)vc didClickCompleteArea:(NSString *)area; +@end +@interface XPMineUserInfoEditViewController : MvpViewController +@property (nonatomic,strong) XPMineUserInfoTagModel *tagModel; +@property (nonatomic,strong) XPSoundCardModel * __nullable soundModel; +@property (nonatomic,copy) NSString *uid; +/// +@property (nonatomic,copy) NSString *area; +/// +@property (nonatomic,weak) id delegate; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoEditViewController.m b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoEditViewController.m index a0fe5c78..4f59dbfa 100644 --- a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoEditViewController.m +++ b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoEditViewController.m @@ -1,8 +1,8 @@ // -// YMMineUserInfoEditViewController.m -// YUMI +// XPMineUserInfoEditViewController.m +// xplan-ios // -// Created by YUMI on 2021/9/23. +// Created by 冯硕 on 2021/9/23. // #import "XPMineUserInfoEditViewController.h" @@ -10,17 +10,17 @@ #import #import ///Tool -#import "DJDKMIMOMColor.h" + #import "TTPopup.h" #import "YYUtility.h" -#import "YUMIMacroUitls.h" -#import "NSArray+Safe.h" + ///Model #import "XPMineUserInfoEditModel.h" #import "UserInfoModel.h" ///View #import "XPMineUserInfoEditTableViewCell.h" #import "XPMineUserInfoDateView.h" +#import "XPMineUserInfoEditPickView.h" ///P #import "XPMineUserInfoEditProtocol.h" #import "XPMineUserInfoEditPresenter.h" @@ -28,8 +28,12 @@ #import "XPMineUserInfoNickViewController.h" #import "XPMineUserInfoDesViewController.h" #import "XPMineUserInfoAlbumViewController.h" +#import "XPMineUserInfoRecordedSoundVC.h" +#import "XPMineUserInfoTagVC.h" -@interface XPMineUserInfoEditViewController () +UIKIT_EXTERN NSString * kUpdateSoundInfo; + +@interface XPMineUserInfoEditViewController () ///列表 @property (nonatomic,strong) UITableView *tableView; ///数据源 @@ -38,136 +42,193 @@ @property (nonatomic,strong) XPMineUserInfoDateView *dateView; ///用户信息 @property (nonatomic,strong) UserInfoModel *userInfo; +///地区列表 +@property (nonatomic,strong) NSMutableArray *areaList; +///标签 +@property (nonatomic,strong) NSMutableArray *tagList; +/// +@property (nonatomic,assign) CGFloat maxWidth; + @end @implementation XPMineUserInfoEditViewController - +-(void)dealloc{ + [[NSNotificationCenter defaultCenter]removeObserver:self]; +} - (XPMineUserInfoEditPresenter *)createPresenter { - return [[XPMineUserInfoEditPresenter alloc] init]; + return [[XPMineUserInfoEditPresenter alloc] init]; } - (void)viewDidLoad { [super viewDidLoad]; - [self initSubViews]; - [self initSubViewConstraints]; + self.areaList = [NSMutableArray array]; + [self initSubViews]; + [self initSubViewConstraints]; + [self getAreaList]; + [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(updateSoundInfo:) name:kUpdateSoundInfo object:nil]; +} +-(void)getAreaList{ + + [self.presenter getAreaList]; +} +-(void)updateSoundInfo:(NSNotification *)not{ + if(not.object != nil){ + self.soundModel = not.object; + }else{ + self.soundModel = nil; + } + [self.tableView reloadData]; } - - (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; + [super viewWillAppear:animated]; [self.presenter getUserInfo]; } #pragma mark - Private Method - (void)initSubViews { - self.title = YMLocalizedString(@"XPMineUserInfoEditViewController0"); - [self.view addSubview:self.tableView]; + self.view.backgroundColor = [UIColor whiteColor]; + self.title = YMLocalizedString(@"XPMineUserInfoEditViewController0"); + [self.view addSubview:self.tableView]; } - (void)initSubViewConstraints { - [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { - make.edges.mas_equalTo(self.view); - }]; + [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.view); + }]; } - (void)showPhotoView { - @weakify(self); - TTActionSheetConfig *cameraConfig = [TTActionSheetConfig normalTitle:YMLocalizedString(@"XPMineUserInfoEditViewController1") clickAction:^{ - [YYUtility checkCameraAvailable:^{ - @strongify(self); - UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; - imagePicker.delegate = self; - imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; - imagePicker.allowsEditing = YES; - [self presentViewController:imagePicker animated:YES completion:NULL]; - } denied:^{ - @strongify(self); - [self showNotPhoto:YMLocalizedString(@"SessionViewController19") content:YMLocalizedString(@"XPMineUserInfoEditViewController3")]; - } restriction:^{ - @strongify(self); - [self showNotPhoto:YMLocalizedString(@"SessionViewController19") content:YMLocalizedString(@"XPMineUserInfoEditViewController5")]; - }]; - }]; - - TTActionSheetConfig *photoLibrayConfig = [TTActionSheetConfig normalTitle:YMLocalizedString(@"XPMineUserInfoEditViewController6") clickAction:^{ - [YYUtility checkAssetsLibrayAvailable:^{ - @strongify(self); - UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; - imagePicker.modalPresentationCapturesStatusBarAppearance = YES; - imagePicker.delegate = self; - imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; - imagePicker.allowsEditing = YES; - [self presentViewController:imagePicker animated:YES completion:NULL]; - } denied:^{ - @strongify(self); - [self showNotPhoto:YMLocalizedString(@"SessionViewController21") content:YMLocalizedString(@"XPMineUserInfoEditViewController8")]; - } restriction:^{ - @strongify(self); - [self showNotPhoto:YMLocalizedString(@"SessionViewController21") content:YMLocalizedString(@"XPMineUserInfoEditViewController10")]; - }]; - }]; + @weakify(self); + TTActionSheetConfig *cameraConfig = [TTActionSheetConfig normalTitle:YMLocalizedString(@"XPMineUserInfoEditViewController1") clickAction:^{ + [YYUtility checkCameraAvailable:^{ + @strongify(self); + UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; + imagePicker.delegate = self; + imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; + imagePicker.allowsEditing = YES; + [self presentViewController:imagePicker animated:YES completion:NULL]; + } denied:^{ + @strongify(self); + [self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController2") content:YMLocalizedString(@"XPMineUserInfoEditViewController3")]; + } restriction:^{ + @strongify(self); + [self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController4") content:YMLocalizedString(@"XPMineUserInfoEditViewController5")]; + }]; + }]; + + TTActionSheetConfig *photoLibrayConfig = [TTActionSheetConfig normalTitle:YMLocalizedString(@"XPMineUserInfoEditViewController6") clickAction:^{ + [YYUtility checkAssetsLibrayAvailable:^{ + @strongify(self); + UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; + imagePicker.modalPresentationCapturesStatusBarAppearance = YES; + imagePicker.delegate = self; + imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; + imagePicker.allowsEditing = YES; + [self presentViewController:imagePicker animated:YES completion:NULL]; + } denied:^{ + @strongify(self); + [self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController7") content:YMLocalizedString(@"XPMineUserInfoEditViewController8")]; + } restriction:^{ + @strongify(self); + [self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController9") content:YMLocalizedString(@"XPMineUserInfoEditViewController10")]; + }]; + }]; - [TTPopup actionSheetWithItems:@[cameraConfig, photoLibrayConfig]]; + [TTPopup actionSheetWithItems:@[cameraConfig, photoLibrayConfig]]; } - (void)showNotPhoto:(NSString *)title content:(NSString *)content { - TTAlertConfig *config = [[TTAlertConfig alloc] init]; - config.title = title; - config.message = content; - - [TTPopup alertWithConfig:config confirmHandler:^{ - NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; - if ([[UIApplication sharedApplication] canOpenURL:url]) { - [[UIApplication sharedApplication] openURL:url]; - } - } cancelHandler:^{ - }]; + TTAlertConfig *config = [[TTAlertConfig alloc] init]; + config.title = title; + config.message = content; + + [TTPopup alertWithConfig:config confirmHandler:^{ + NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; + if ([[UIApplication sharedApplication] canOpenURL:url]) { + [[UIApplication sharedApplication] openURL:url]; + } + } cancelHandler:^{ + }]; } - (void)showDatePickerView { - self.dateView.time = self.userInfo.birth/1000; - [TTPopup popupView:self.dateView style:TTPopupStyleActionSheet]; + self.dateView.time = self.userInfo.birth/1000; + [TTPopup popupView:self.dateView style:TTPopupStyleActionSheet]; +} +#pragma mark - XPMineUserInfoTagVCDelegate +- (void)xPMineUserInfoTagVC:(XPMineUserInfoTagVC *)vc didClickComplete:(NSArray *)meLabels{ + self.tagModel.meLabels = meLabels; + self.tagList = [NSMutableArray array]; + CGFloat maxWidth = 0; + self.maxWidth = 0; + for (int i = 0; i < meLabels.count; i++) { + XPMineUserInfoTagItemModel *model = [XPMineUserInfoTagItemModel new]; + NSString *text = meLabels[i]; + model.label = text; + CGRect stringRect = [text boundingRectWithSize:CGSizeMake(MAXFLOAT, kGetScaleWidth(18)) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:kFontRegular(10)} context:nil]; + CGFloat width = stringRect.size.width + kGetScaleWidth(14); + model.width = width; + maxWidth = maxWidth + width; + if(maxWidth < kGetScaleWidth(220)){ + self.maxWidth = maxWidth; + [self.tagList addObject:model]; + } + + } + [self.tableView reloadData]; + if(self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoEditViewControllerC:didClickComplete:)]){ + [self.delegate xPMineUserInfoEditViewControllerC:self didClickComplete:@""]; + } } - #pragma mark - UITableViewDelegate And UITableViewDataSource - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; + return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return self.datasouce.count; + return self.datasouce.count; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - XPMineUserInfoEditModel * model = [self.datasouce safeObjectAtIndex1:indexPath.row]; - if (model.type == XPMineUserInfoEditType_Avatar) { - return 60; - } else { - return 50; - } + XPMineUserInfoEditModel * model = [self.datasouce safeObjectAtIndex1:indexPath.row]; + if (model.type == XPMineUserInfoEditType_Avatar) { + return kGetScaleWidth(80); + } else { + return kGetScaleWidth(60); + } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - XPMineUserInfoEditTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])]; - if (cell == nil) { - cell = [[XPMineUserInfoEditTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])]; - } - XPMineUserInfoEditModel * model = [self.datasouce safeObjectAtIndex1:indexPath.row]; - cell.itmeModel = model; - return cell; + XPMineUserInfoEditTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])]; + if (cell == nil) { + cell = [[XPMineUserInfoEditTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])]; + } + XPMineUserInfoEditModel * model = [self.datasouce safeObjectAtIndex1:indexPath.row]; + if(model.type == XPMineUserInfoEditType_Tag){ + cell.itemList = self.tagList; + cell.maxWidth = self.maxWidth + self.tagList.count * kGetScaleWidth(5); + model.subTitle = self.tagList.count > 0 ? @"":YMLocalizedString(@"XPMineUserInfoEditPresenter9"); + }else if(model.type == XPMineUserInfoEditType_Area){ + model.subTitle = self.area; + } + + cell.itmeModel = model; + cell.soundModel = self.soundModel; + return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - XPMineUserInfoEditModel * model = [self.datasouce safeObjectAtIndex1:indexPath.row]; - switch (model.type) { - case XPMineUserInfoEditType_Nick: - { - XPMineUserInfoNickViewController * nickVC = [[XPMineUserInfoNickViewController alloc] init]; - nickVC.delegate = self; - nickVC.nick = self.userInfo.nick; - [self.navigationController pushViewController:nickVC animated:YES]; - } - break; + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + XPMineUserInfoEditModel * model = [self.datasouce safeObjectAtIndex1:indexPath.row]; + switch (model.type) { + case XPMineUserInfoEditType_Nick: + { + XPMineUserInfoNickViewController * nickVC = [[XPMineUserInfoNickViewController alloc] init]; + nickVC.delegate = self; + nickVC.nick = self.userInfo.nick; + [self.navigationController pushViewController:nickVC animated:YES]; + } + break; case XPMineUserInfoEditType_Avatar: { if (self.userInfo.isReview) { [self showErrorToast:YMLocalizedString(@"XPMineUserInfoEditViewController11")]; @@ -175,79 +236,111 @@ [self showPhotoView]; } } - break; - case XPMineUserInfoEditType_Birth: - [self showDatePickerView]; - break; - case XPMineUserInfoEditType_UseDes: - { - XPMineUserInfoDesViewController * desVC = [[XPMineUserInfoDesViewController alloc] init]; - desVC.delegate = self; - desVC.userDesc = self.userInfo.userDesc; - [self.navigationController pushViewController:desVC animated:YES]; - } - break; - case XPMineUserInfoEditType_Photo: - { - XPMineUserInfoAlbumViewController * albumVC = [[XPMineUserInfoAlbumViewController alloc] init]; - [self.navigationController pushViewController:albumVC animated:YES]; - } - break; - - default: - break; - } + break; + case XPMineUserInfoEditType_Birth: + [self showDatePickerView]; + break; + case XPMineUserInfoEditType_UseDes: + { + XPMineUserInfoDesViewController * desVC = [[XPMineUserInfoDesViewController alloc] init]; + desVC.delegate = self; + desVC.userDesc = self.userInfo.userDesc; + [self.navigationController pushViewController:desVC animated:YES]; + } + break; + case XPMineUserInfoEditType_Photo: + { + XPMineUserInfoAlbumViewController * albumVC = [[XPMineUserInfoAlbumViewController alloc] init]; + [self.navigationController pushViewController:albumVC animated:YES]; + } + break; + case XPMineUserInfoEditType_Sound: + { + XPMineUserInfoRecordedSoundVC *vc = [XPMineUserInfoRecordedSoundVC new]; + vc.soundModel = self.soundModel; + [self.navigationController pushViewController:vc animated:YES]; + break; + } + case XPMineUserInfoEditType_Tag: + { + XPMineUserInfoTagVC *tagVC =[XPMineUserInfoTagVC new]; + tagVC.tagModel = self.tagModel; + tagVC.delegate = self; + [self.navigationController pushViewController:tagVC animated:YES]; + break; + } + case XPMineUserInfoEditType_Area: + { + XPMineUserInfoEditPickView *pckView = [[XPMineUserInfoEditPickView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; + pckView.area = self.area; + + pckView.dataArray = self.areaList; + pckView.delegate = self; + [kWindow addSubview:pckView]; + break; + } + default: + break; + } } #pragma mark - UIImagePickerControllerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { - UIImage *selectedPhoto = [info objectForKey:UIImagePickerControllerEditedImage]; - if (selectedPhoto) { - if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) { - UIImageWriteToSavedPhotosAlbum(selectedPhoto, nil, nil, nil); - } - [self.presenter uploadAvatar:selectedPhoto]; - } - [picker dismissViewControllerAnimated:YES completion:^{}]; + UIImage *selectedPhoto = [info objectForKey:UIImagePickerControllerEditedImage]; + if (selectedPhoto) { + if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) { + UIImageWriteToSavedPhotosAlbum(selectedPhoto, nil, nil, nil); + } + [self.presenter uploadAvatar:selectedPhoto]; + } + [picker dismissViewControllerAnimated:YES completion:^{}]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{ - [picker dismissViewControllerAnimated:YES completion:^{ - }]; + [picker dismissViewControllerAnimated:YES completion:^{ + }]; } #pragma mark - XPMineUserInfoDateViewDelegate - (void)xPMineUserInfoDateView:(XPMineUserInfoDateView *)view didClickSureButton:(NSString *)dateStr{ - [TTPopup dismiss]; - if (dateStr.length > 0) { - [self.presenter complectionInfoWithAvatar:nil nick:nil birth:dateStr userDesc:nil]; - } + [TTPopup dismiss]; + if (dateStr.length > 0) { + [self.presenter complectionInfoWithAvatar:nil nick:nil birth:dateStr userDesc:nil]; + } } - (void)xPMineUserInfoDateView:(XPMineUserInfoDateView *)view didClickCancleButton:(UIButton *)sender { - [TTPopup dismiss]; + [TTPopup dismiss]; } #pragma mark - XPMineUserInfoNickViewControllerDelegate - (void)xPMineUserInfoNickViewController:(XPMineUserInfoNickViewController *)viewController updateNick:(NSString *)nick { - if (nick.length > 0) { - [self.presenter complectionInfoWithAvatar:nil nick:nick birth:nil userDesc:nil]; - } + if (nick.length > 0) { + [self.presenter complectionInfoWithAvatar:nil nick:nick birth:nil userDesc:nil]; + } } #pragma mark - XPMineUserInfoDesViewControllerDelegate - (void)xPMineUserInfoDesViewController:(XPMineUserInfoDesViewController *)viewController updateUserDes:(NSString *)userDes { - if (userDes.length > 0) { - [self.presenter complectionInfoWithAvatar:nil nick:nil birth:nil userDesc:userDes]; - } + if (userDes.length > 0) { + [self.presenter complectionInfoWithAvatar:nil nick:nil birth:nil userDesc:userDes]; + } } #pragma mark - XPMineUserInfoEditProtocol - (void)getUserInfoEditDataSourceSuccess:(NSArray *)array { - self.datasouce = array; - [self.tableView reloadData]; + self.datasouce = array; + [self.tableView reloadData]; +} +-(void)getAreaListSuccess:(NSArray *)list{ + self.areaList = [list mutableCopy]; +} +- (void)saveAreaSuccess{ + if(self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoEditViewControllerC:didClickCompleteArea:)]){ + [self.delegate xPMineUserInfoEditViewControllerC:self didClickCompleteArea:self.area]; + } + [self.tableView reloadData]; } - - (void)completeUserInfoSuccess:(UserInfoModel *)userInfo { if (userInfo.isReview) { [self showSuccessToast:YMLocalizedString(@"XPMineUserInfoEditViewController12")]; @@ -262,37 +355,68 @@ } - (void)onGetUserInfoSuccess:(UserInfoModel *)userInfo { - self.userInfo = userInfo; - [self.presenter getUserInfoEditDataSourceWithUserInfo:self.userInfo]; + self.userInfo = userInfo; + [self.presenter getUserInfoEditDataSourceWithUserInfo:self.userInfo]; } - (void)uploadImageSuccess:(NSString *)url { - [self.presenter complectionInfoWithAvatar:url nick:nil birth:nil userDesc:nil]; + [self.presenter complectionInfoWithAvatar:url nick:nil birth:nil userDesc:nil]; +} +#pragma mark - XPMineUserInfoEditPickView +- (void)didClickSureActionWithArea:(NSString *)area{ + self.area = area; + [self.presenter saveAreaConfigWithArea:area]; } #pragma mark - Getters And Setters +-(void)setSoundModel:(XPSoundCardModel *)soundModel{ + _soundModel = soundModel; + [self.tableView reloadData]; +} +-(void)setTagModel:(XPMineUserInfoTagModel *)tagModel{ + _tagModel = tagModel; + NSArray *meLabels = _tagModel.meLabels; + self.tagList = [NSMutableArray array]; + CGFloat maxWidth = 0 ; + self.maxWidth = 0; + for (int i = 0; i < meLabels.count; i++) { + XPMineUserInfoTagItemModel *model = [XPMineUserInfoTagItemModel new]; + NSString *text = meLabels[i]; + model.label = text; + CGRect stringRect = [text boundingRectWithSize:CGSizeMake(MAXFLOAT, kGetScaleWidth(18)) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:kFontRegular(10)} context:nil]; + CGFloat width = stringRect.size.width + kGetScaleWidth(14); + model.width = width; + maxWidth = maxWidth + width; + if(maxWidth < kGetScaleWidth(220)){ + self.maxWidth = maxWidth; + [self.tagList addObject:model]; + } + + } + [self.tableView reloadData]; +} - (UITableView *)tableView { - if (!_tableView) { - _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; - _tableView.delegate = self; - _tableView.dataSource = self; - _tableView.tableFooterView = [UIView new]; - _tableView.tableHeaderView = [UIView new]; - _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - _tableView.backgroundColor = [UIColor clearColor]; - if (@available(iOS 11.0, *)) { - _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; - } - [_tableView registerClass:[XPMineUserInfoEditTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])]; - } - return _tableView; + if (!_tableView) { + _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; + _tableView.delegate = self; + _tableView.dataSource = self; + _tableView.tableFooterView = [UIView new]; + _tableView.tableHeaderView = [UIView new]; + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + _tableView.backgroundColor = [UIColor clearColor]; + if (@available(iOS 11.0, *)) { + _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + } + [_tableView registerClass:[XPMineUserInfoEditTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])]; + } + return _tableView; } - (XPMineUserInfoDateView *)dateView { - if (!_dateView) { - _dateView = [[XPMineUserInfoDateView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 216+kSafeAreaBottomHeight+54)]; - _dateView.delegate = self; - } - return _dateView; + if (!_dateView) { + _dateView = [[XPMineUserInfoDateView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 216+kSafeAreaBottomHeight+54)]; + _dateView.delegate = self; + } + return _dateView; } @end diff --git a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.h b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.h index cc5b4936..c3731317 100644 --- a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.h +++ b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.h @@ -1,8 +1,8 @@ // // MineInfoViewController.h -// YUMI +// xplan-ios // -// Created by YUMI on 2021/9/22. +// Created by 冯硕 on 2021/9/22. // #import "MvpViewController.h" @@ -12,6 +12,9 @@ NS_ASSUME_NONNULL_BEGIN ///用户的id @property (nonatomic,assign) NSInteger uid; +@property (nonatomic,assign) BOOL isFormCandyTree; + + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.m b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.m index 80398c1b..87b20d11 100644 --- a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.m +++ b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.m @@ -1,8 +1,8 @@ // // MineInfoViewController.m -// YUMI +// xplan-ios // -// Created by YUMI on 2021/9/22. +// Created by 冯硕 on 2021/9/22. // #import "XPMineUserInfoViewController.h" @@ -13,26 +13,26 @@ #import #import #import +#import +#import ///Tool -#import "DJDKMIMOMColor.h" -#import "YUMIMacroUitls.h" #import "AccountInfoStorage.h" #import "TTPopup.h" -#import "YUMIHtmlUrl.h" #import "XPSkillCardPlayerManager.h" #import "UIImage+Utils.h" -#import "YUMIConstant.h" -#import "NIMMessageUtils.h" -#import "ClientConfig.h" -#import "XNDJTDDLoadingTool.h" +#import "CountDownHelper.h" ///Model #import "MineSkillCardListInfoModel.h" #import "UserInfoModel.h" +#import "XPSoundCardModel.h" +#import "XPMineUserInfoTagModel.h" +#import "UploadFile.h" ///View #import "XPMineUserInfoTableViewCell.h" #import "XPMineUserInfoHeaderView.h" #import "XPMineUserInfoCustomNavView.h" #import "XPMineUserInfoVoiceCardView.h" +#import "XPMineUserInfoIndividualTagView.h" ///P #import "XPMineUserInfoPresenter.h" #import "XPMineUserInfoProtocol.h" @@ -44,8 +44,14 @@ #import "XPRoomViewController.h" #import "XPMineUserDataViewController.h" #import "XPMonentsMineViewController.h" +#import "XPGiftUserDataViewController.h" +#import "XPMineUserInfoRecordedSoundVC.h" +#import "XPRoomMiniManager.h" +#import "XPMineUserInfoTagVC.h" -@interface XPMineUserInfoViewController () +UIKIT_EXTERN NSString * kUpdateSoundInfo; + +@interface XPMineUserInfoViewController () @property (nonatomic, strong) JXCategoryTitleView *titleView; @property (nonatomic, strong) JXCategoryIndicatorImageView *lineView; @property (nonatomic, strong) JXPagerView *pagingView; @@ -65,429 +71,616 @@ ///资料 @property (nonatomic,strong) XPMineUserDataViewController *userDataVC; ///动态 -@property (nonatomic,strong) XPMonentsMineViewController *monentsVC; +//@property (nonatomic,strong) XPMonentsMineViewController *monentsVC; +///禮物牆 +@property (nonatomic,strong) XPGiftUserDataViewController *giftVC; +///编辑资料 +@property (nonatomic,strong) XPMineUserInfoEditViewController * editVC ; ///声音秀 @property (nonatomic,strong) XPMineUserInfoVoiceCardView *voiceView; +///倒计时 +@property (nonatomic,strong) CountDownHelper *countDownHelper; +///标签 +@property (nonatomic,strong) XPMineUserInfoTagModel *tagModel; + @end @implementation XPMineUserInfoViewController - +- (void)dealloc{ + [[NSNotificationCenter defaultCenter]removeObserver:self]; +} - (XPMineUserInfoPresenter *)createPresenter { - return [[XPMineUserInfoPresenter alloc] init]; + return [[XPMineUserInfoPresenter alloc] init]; } - (BOOL)isHiddenNavBar { - return YES; + return YES; } + +-(void)viewDidAppear:(BOOL)animated{ + [super viewDidAppear:animated]; + self.countDownHelper .delegate = self; + +} + + +-(void)viewDidDisappear:(BOOL)animated{ + [super viewDidAppear:animated]; + [self.countDownHelper stopCountDown]; + self.countDownHelper .delegate = nil; + [[XPSkillCardPlayerManager shareInstance] stopMusic]; + [self.headView setPlaySoundStatus:NO]; + + +} +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + if (self.uid > 0) { + [self initHttpRequest]; + } + if([XPSkillCardPlayerManager shareInstance].isInRoom == YES && [XPSkillCardPlayerManager shareInstance].isInRoomFirstRecharge == NO){ + [XPSkillCardPlayerManager shareInstance].isInRoomFirstRecharge = YES; + } +} + + - (void)viewDidLoad { [super viewDidLoad]; - [self initSubViews]; - [self initSubViewConstraints]; + [self initSubViews]; + [self initSubViewConstraints]; + [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(updateSoundInfo:) name:kUpdateSoundInfo object:nil]; +} +-(void)updateSoundInfo:(NSNotification *)not{ + if(not.object != nil){ + self.headView.soundModel = not.object; + NSString *fileName = [[ self.headView.soundModel.audioUrl componentsSeparatedByString:@"/"] lastObject]; + NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) safeObjectAtIndex1:0] stringByAppendingPathComponent:@"kMineSoundCard"]; + NSString *fullPath = [filePath stringByAppendingPathComponent:fileName]; + if (![[NSFileManager defaultManager] fileExistsAtPath:fullPath]) { + NSFileManager *fileMgr = [[NSFileManager alloc] init]; + [fileMgr createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil]; + [UploadFile downloadAudioWithFileName:fileName musicUrl:self.headView.soundModel.audioUrl mainFileName:@"kMineSoundCard" completion:^(BOOL isSuccess, NSString *editAudioPath) { + }]; + } + }else{ + self.headView.soundModel = nil; + } + } -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - if (self.uid > 0) { - [self initHttpRequest]; - } -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - if (self.voiceView.isPlaying) { - [[XPSkillCardPlayerManager shareInstance] stopMusic]; - } -} - (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - self.pagingView.frame = self.view.bounds; + [super viewDidLayoutSubviews]; + self.pagingView.frame = self.view.bounds; } #pragma mark - Private Method - (void)initSubViews { - [self.view addSubview:self.pagingView]; - [self.view addSubview:self.navView]; - [self.view addSubview:self.voiceView]; - if (self.uid != [AccountInfoStorage instance].getUid.integerValue) { - [self.view addSubview:self.bottomStackView]; - [self.bottomStackView addArrangedSubview:self.chatButton]; - [self.bottomStackView addArrangedSubview:self.attentionButton]; - - [self.bottomStackView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.mas_equalTo(self.view).inset(25); - make.height.mas_equalTo(36); - make.bottom.mas_equalTo(self.view).offset(-kSafeAreaBottomHeight - 15); - }]; - } + [self.view addSubview:self.pagingView]; + [self.view addSubview:self.navView]; + [self.view addSubview:self.voiceView]; + if (self.uid != [AccountInfoStorage instance].getUid.integerValue) { + [self.view addSubview:self.bottomStackView]; + [self.bottomStackView addArrangedSubview:self.chatButton]; + [self.bottomStackView addArrangedSubview:self.attentionButton]; + + [self.bottomStackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.view).inset(15); + make.height.mas_equalTo(45); + make.bottom.mas_equalTo(self.view).offset(-kSafeAreaBottomHeight - 15); + }]; + } + } - (void)initSubViewConstraints { - [self.navView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.top.mas_equalTo(self.view); - make.height.mas_equalTo(kNavigationHeight); - }]; - - [self.voiceView mas_makeConstraints:^(MASConstraintMaker *make) { - make.right.mas_equalTo(self.view); - make.top.mas_equalTo(self.view.mas_safeAreaLayoutGuideTop).offset(176); - make.size.mas_equalTo(CGSizeMake(65, 25)); - }]; + [self.navView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.mas_equalTo(self.view); + make.height.mas_equalTo(kNavigationHeight); + }]; + + [self.voiceView mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.mas_equalTo(self.view); + make.top.mas_equalTo(self.view.mas_safeAreaLayoutGuideTop).offset(176); + make.size.mas_equalTo(CGSizeMake(65, 25)); + }]; } - (void)initHttpRequest { - NSString *uid = [NSString stringWithFormat:@"%ld", self.uid]; + NSString *uid = [NSString stringWithFormat:@"%ld", self.uid]; + [self.presenter getUserInfoWithUid:uid]; + + [self.presenter getUserAttentionState:uid]; - ///请求目标用户的个人信息 - [self.presenter getUserInfoWithUid:uid]; - - [self.presenter getUserAttentionState:uid]; + //获取用户详细信息 跟随进房目前使用的这个接口 + [self.presenter getUserDetailInfoWithUid:uid]; - //获取用户详细信息 跟随进房目前使用的这个接口 - [self.presenter getUserDetailInfoWithUid:uid]; - - NSString * myUid = [AccountInfoStorage instance].getUid; ///上传访问记录 - if (![uid isEqualToString:myUid]) { - ///请求我自己的个人信息 - [self.presenter getUserInfoWithUid:myUid]; + if (![uid isEqualToString:[[AccountInfoStorage instance] getUid]]) { + [self.presenter visitUser:uid]; } } #pragma mark - 拉黑 移除黑名单 +- (BOOL)isSystemAccount { + return [KeyWithType(KeyType_SecretaryUidKey) isEqualToString:[NSString stringWithFormat:@"%ld", self.uid]] || [KeyWithType(KeyType_SystemNotifiUidKey) isEqualToString:[NSString stringWithFormat:@"%ld", self.uid]] || [KeyWithType(KeyType_GuildUidKey) isEqualToString:[NSString stringWithFormat:@"%ld", self.uid]]; +} + + - (void)showRightNavHandle { - NSMutableArray *array = [NSMutableArray array]; - NSString *uid = [NSString stringWithFormat:@"%ld",self.uid]; - TTActionSheetConfig *report = [TTActionSheetConfig normalTitle:YMLocalizedString(@"XPMineUserInfoViewController0") clickAction:^{ - if ([ClientConfig shareConfig].canOpen) { - XPWebViewController *vc = [[XPWebViewController alloc]init]; - NSString *urlstr = [NSString stringWithFormat:@"%@?reportUid=%@&source=PERSONAL",URLWithType(kReportRoomURL),uid]; - vc.url = urlstr; - [self.navigationController pushViewController:vc animated:YES]; - } else { - [XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"XPMineUserInfoViewController1")]; - } + NSMutableArray *array = [NSMutableArray array]; + NSString *uid = [NSString stringWithFormat:@"%ld",self.uid]; + TTActionSheetConfig *report = [TTActionSheetConfig normalTitle:YMLocalizedString(@"XPMineUserInfoViewController0") clickAction:^{ + XPWebViewController *vc = [[XPWebViewController alloc]init]; + NSString *urlstr = [NSString stringWithFormat:@"%@?reportUid=%@&source=PERSONAL",URLWithType(kReportRoomURL),uid]; + vc.url = urlstr; + [self.navigationController pushViewController:vc animated:YES]; + }]; - }]; + TTActionSheetConfig *black = [TTActionSheetConfig normalTitle:YMLocalizedString(@"XPMineUserInfoViewController1") clickAction:^{ + [self addOrRemoveBlack:NO uid:uid]; + }]; - TTActionSheetConfig *black = [TTActionSheetConfig normalTitle:YMLocalizedString(@"XPMineUserInfoViewController2") clickAction:^{ - [self addOrRemoveBlack:NO uid:uid]; - }]; + [array addObjectsFromArray:@[report, black]]; - [array addObjectsFromArray:@[report, black]]; - - BOOL isInBlackList = [[NIMSDK sharedSDK].userManager isUserInBlackList:uid] || [NIMMessageUtils isOfficalAccount:[NSString stringWithFormat:@"%ld", self.uid]]; - if (isInBlackList) { - [array removeObject:black]; - } - [TTPopup actionSheetWithItems:array]; + BOOL isInBlackList = [[NIMSDK sharedSDK].userManager isUserInBlackList:uid] || [self isSystemAccount]; + if (isInBlackList) { + [array removeObject:black]; + } + [TTPopup actionSheetWithItems:array]; } //加入黑名单 - (void)addOrRemoveBlack:(BOOL)isRemove uid:(NSString *)uid { - NSString *title; - NSString *message; - if (isRemove) { - title = YMLocalizedString(@"XPMineUserInfoViewController3"); - message = YMLocalizedString(@"XPMineUserInfoViewController4"); - }else{ - title = YMLocalizedString(@"XPMineUserInfoViewController5"); - message = YMLocalizedString(@"XPMineUserInfoViewController6"); - } + NSString *title; + NSString *message; + if (isRemove) { + title = YMLocalizedString(@"XPMineUserInfoViewController2"); + message = YMLocalizedString(@"XPMineUserInfoViewController3"); + }else{ + title = YMLocalizedString(@"XPMineUserInfoViewController4"); + message = YMLocalizedString(@"XPMineUserInfoViewController5"); + } - TTAlertConfig *config = [[TTAlertConfig alloc] init]; - config.title = title; - config.message = message; + TTAlertConfig *config = [[TTAlertConfig alloc] init]; + config.title = title; + config.message = message; - [TTPopup alertWithConfig:config confirmHandler:^{ - if (isRemove) { - [[NIMSDK sharedSDK].userManager removeFromBlackBlackList:uid completion:^(NSError * _Nullable error) { - if (error == nil) { - [self showSuccessToast:YMLocalizedString(@"XPMineUserInfoViewController7")]; - } - }]; - } else { - [[NIMSDK sharedSDK].userManager addToBlackList:uid completion:^(NSError * _Nullable error) { - if (error == nil) { - [self showSuccessToast:YMLocalizedString(@"XPMineUserInfoViewController8")]; - } - }]; - } - } cancelHandler:^{ - }]; + [TTPopup alertWithConfig:config confirmHandler:^{ + if (isRemove) { + [[NIMSDK sharedSDK].userManager removeFromBlackBlackList:uid completion:^(NSError * _Nullable error) { + if (error == nil) { + [self showSuccessToast:YMLocalizedString(@"XPMineUserInfoViewController6")]; + } + }]; + } else { + [[NIMSDK sharedSDK].userManager addToBlackList:uid completion:^(NSError * _Nullable error) { + if (error == nil) { + [self showSuccessToast:YMLocalizedString(@"XPMineUserInfoViewController7")]; + } + }]; + } + } cancelHandler:^{ + }]; } #pragma mark - JXCategoryViewDelegate - (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView { - return 440; + return 358; } - (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView { - return self.headView; + return self.headView; } - (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { - return 50; + return 50; } - (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { - return self.titleView; + return self.titleView; } - (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView { - return self.titles.count; + return self.titles.count; } - (id)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index { - UIViewController *viewController; - if (index == 0) { - return self.userDataVC; - } else { - return self.monentsVC; - } - return (id )viewController; + UIViewController *viewController; + if (index == 0) { + return self.userDataVC; + } + else{ + return self.giftVC; + } + return (id )viewController; } #pragma mark - JXPagerMainTableViewGestureDelegate - (BOOL)mainTableViewGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { - ///1000是外部的scrollView 1001是人气主播中的collectionView - if (otherGestureRecognizer.view.tag == 1005 || otherGestureRecognizer.view.tag == 1009) { - return NO; - } - return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]; + ///1000是外部的scrollView 1001是人气主播中的collectionView + if (otherGestureRecognizer.view.tag == 1005 || otherGestureRecognizer.view.tag == 1009) { + return NO; + } + return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]; } #pragma mark - XPMineCustomNavViewDelegate - (void)xPMineCustomNavView:(XPMineUserInfoCustomNavView *)view didClickEditButton:(UIButton *)sender { - if (sender.isSelected) {///自己看自己的 去修改资料 - XPMineUserInfoEditViewController * editVC = [[XPMineUserInfoEditViewController alloc] init]; - [self.navigationController pushViewController:editVC animated:YES]; - } else { - [self showRightNavHandle]; - } + if (sender.isSelected) {///自己看自己的 去修改资料 + self.editVC.area = self.userInfo.region; + [self.navigationController pushViewController:self.editVC animated:YES]; + } else { + [self showRightNavHandle]; + } } - (void)xPMineCustomNavView:(XPMineUserInfoCustomNavView *)view didClickBackButton:(UIButton *)sender { - [self.navigationController popViewControllerAnimated:YES]; + [self.navigationController popViewControllerAnimated:YES]; } #pragma mark - XPMineUserInfoHeaderViewDelegate -- (void)xPMineUserInfoHeaderView:(XPMineUserInfoHeaderView *)view didClickGoToRoom:(NSString *)roomUid { - if (roomUid.length > 0 ) { - //退出原来的房间 如果有的话 TODO 总感觉这种处理不太优雅 进房入口多了 怎么办 进房需要整合 - [self.navigationController.viewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - if ([obj isKindOfClass:[XPRoomViewController class]]) { - [self.navigationController popToRootViewControllerAnimated:NO]; - XPRoomViewController * rooomVC = obj; - [rooomVC exitRoom]; - *stop = YES; - } - }]; - [XPRoomViewController openRoom:roomUid viewController:self]; - } +- (void)xPMineUserInfoHeaderView:(XPMineUserInfoHeaderView *)view didClickGotoEditVC:(nonnull NSMutableArray *)itemList{ + + XPMineUserInfoTagVC *tagVC =[XPMineUserInfoTagVC new]; + tagVC.tagModel = self.tagModel; + tagVC.delegate = self; + [self.navigationController pushViewController:tagVC animated:YES]; +} +- (void)xPMineUserInfoHeaderView:(XPMineUserInfoHeaderView *)view didClickGotoEditView:(NSMutableArray *)itemList{ + XPMineUserInfoIndividualTagView *tagView = [[XPMineUserInfoIndividualTagView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; + tagView.uid = @(self.uid).stringValue; + tagView.itemList = itemList; + tagView.delegate = self; + [TTPopup popupView:tagView style:TTPopupStyleAlert]; +} + +-(void)didClickGoToPlaySound{ + XPMineUserInfoRecordedSoundVC *soundVC = [[XPMineUserInfoRecordedSoundVC alloc]init]; + soundVC.soundModel = self.headView.soundModel; + [self.navigationController pushViewController:soundVC animated:YES]; +} +- (void)xPMineUserInfoHeaderView:(XPMineUserInfoHeaderView *)view didClickPlaySound:(BOOL)isPlay{ + + if(isPlay == YES){ + NSString *fileName = [[self.headView.soundModel.audioUrl componentsSeparatedByString:@"/"] lastObject]; + NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) safeObjectAtIndex1:0] stringByAppendingPathComponent:@"kMineSoundCard"]; + NSString *fullPath = [filePath stringByAppendingPathComponent:fileName]; + if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath]) { + [self playAudioWithUrl:fullPath isDelay:[XPSkillCardPlayerManager shareInstance].isMineInMic]; + }else{ + if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) { + NSFileManager *fileMgr = [[NSFileManager alloc] init]; + [fileMgr createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil]; + } + [UploadFile downloadAudioWithFileName:fileName musicUrl:self.headView.soundModel.audioUrl mainFileName:@"kMineSoundCard" completion:^(BOOL isSuccess, NSString *editAudioPath) { + if(isSuccess){ + [self playAudioWithUrl:editAudioPath isDelay:[XPSkillCardPlayerManager shareInstance].isMineInMic]; + + }else{ + [self.headView setPlaySoundStatus:NO]; + [[XPSkillCardPlayerManager shareInstance] stopMusic]; + } + }]; + } + }else{ + [self.countDownHelper stopCountDown]; + [self.headView setPlaySoundStatus:NO]; + [[XPSkillCardPlayerManager shareInstance] stopMusic]; + } + + } +/// 播放录音 +/// - Parameters: +/// - url: 录音链接 +/// - isDelay: 是否延时0.5秒播放录音,因为如果在麦上的话,需要先关麦再播放,所以要延时0.5秒来关麦后再播放,不然会没声音 +-(void)playAudioWithUrl:(NSString*)url isDelay:(BOOL)isDelay{ + if(isDelay == YES){ + [[XPSkillCardPlayerManager shareInstance] playerNewVoiceWithPath:url completionBlock:^{ + [[XPSkillCardPlayerManager shareInstance] stopMusic]; + }]; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + NSInteger getCurrentTime = ceil(self.headView.soundModel.second); + [self.countDownHelper openCountdownWithTime:(int)getCurrentTime]; + }); + return; + } + NSInteger getCurrentTime = ceil(self.headView.soundModel.second); + [self.countDownHelper openCountdownWithTime:(int)getCurrentTime]; + [[XPSkillCardPlayerManager shareInstance] playerVoiceWithPath:url completionBlock:^{ + + [[XPSkillCardPlayerManager shareInstance] stopMusic]; + }]; +} +- (void)xPMineUserInfoHeaderView:(XPMineUserInfoHeaderView *)view didClickGoToRoom:(NSString *)roomUid { + if (roomUid.length > 0 ) { + if(roomUid.integerValue == [XPSkillCardPlayerManager shareInstance].roomUid.integerValue && [XPRoomMiniManager shareManager].getRoomInfo == nil){ + [self.navigationController popViewControllerAnimated:YES]; + return; + } + //退出原来的房间 如果有的话 TODO 总感觉这种处理不太优雅 进房入口多了 怎么办 进房需要整合 + [self.navigationController.viewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:[XPRoomViewController class]]) { + [self.navigationController popToRootViewControllerAnimated:NO]; + XPRoomViewController * rooomVC = obj; + [rooomVC exitRoom]; + *stop = YES; + } + }]; + [XPRoomViewController openRoom:roomUid viewController:self]; + } +} +#pragma mark - CountDownHelperDelegate +///倒计时结束 +- (void)onCountdownFinish{ + [self.headView setPlaySoundTime:0]; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + [self.headView setPlaySoundStatus:NO]; + }); + +} +///倒计时进行 +- (void)onCountdownOpen:(int)time{ + [self.headView setPlaySoundTime:(int)time + 1]; +} +#pragma mark - XPMineUserInfoIndividualTagView +- (void)didClickGotoEditVC{ + + XPMineUserInfoTagVC *tagVC =[XPMineUserInfoTagVC new]; + tagVC.tagModel = self.tagModel; + tagVC.delegate = self; + [self.navigationController pushViewController:tagVC animated:YES]; + +} + +#pragma mark- XPMineUserInfoTagVCDelegate +- (void)xPMineUserInfoTagVC:(XPMineUserInfoTagVC *)vc didClickComplete:(NSArray *)meLabels{ + self.headView.tagModel = self.tagModel; +} #pragma mark - XPMineUserDataViewControllerDelegate - (void)xPMineUserDataViewController:(XPMineUserDataViewController *)viewController didGetVoiceSuccess:(MineSkillCardListInfoModel *)voiceCard { - if (voiceCard && [voiceCard.cardId isEqualToString:@"8"]) { - self.voiceView.hidden = NO; - self.voiceView.voiceInfo = voiceCard; - } else { - self.voiceView.hidden = YES; - } + if (voiceCard && [voiceCard.cardId isEqualToString:@"8"]) { + self.voiceView.hidden = NO; + self.voiceView.voiceInfo = voiceCard; + } else { + self.voiceView.hidden = YES; + } } #pragma mark - XPMineUserInfoProtocol - (void)onGetUserInfoSuccess:(UserInfoModel *)userInfo { - if (userInfo.uid == self.uid) { - self.userInfo = userInfo; - self.headView.userInfo = userInfo; - } else { - if (!userInfo.userVipInfoVO.lookHomepageHide) { - NSString * uid = [NSString stringWithFormat:@"%ld", self.uid]; - [self.presenter visitUser:uid]; - } - } + self.userInfo = userInfo; + self.headView.userInfo = userInfo; + self.headView.soundModel = self.userInfo.audioCard; + self.editVC.soundModel = self.headView.soundModel; + XPMineUserInfoTagModel *tagModel = [XPMineUserInfoTagModel new]; + tagModel.meLabels = userInfo.labels; + self.tagModel = tagModel; + self.editVC.tagModel = tagModel; + self.headView.tagModel = tagModel; + self.userDataVC.userInfo = userInfo; + + + NSString *fileName = [[self.headView.soundModel.audioUrl componentsSeparatedByString:@"/"] lastObject]; + NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) safeObjectAtIndex1:0] stringByAppendingPathComponent:@"kMineSoundCard"]; + NSString *fullPath = [filePath stringByAppendingPathComponent:fileName]; + if (![[NSFileManager defaultManager] fileExistsAtPath:fullPath]) { + NSFileManager *fileMgr = [[NSFileManager alloc] init]; + [fileMgr createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil]; + [UploadFile downloadAudioWithFileName:fileName musicUrl:self.headView.soundModel.audioUrl mainFileName:@"kMineSoundCard" completion:^(BOOL isSuccess, NSString *editAudioPath) { + }]; + } } + + - (void)ongetDetailInfoSuccess:(UserInfoModel *)userInfo { - self.userDataVC.userInfo = userInfo; - self.monentsVC.dynamicInfo = userInfo.dynamicInfo; - self.headView.roomUid = userInfo.roomUid; + self.userDataVC.dynamicInfo = userInfo.dynamicInfo; + self.headView.roomUid = userInfo.roomUid; + self.giftVC.userInfo = userInfo; } - (void)getAttentionStateSuccess:(BOOL)status { - self.attentionButton.selected = status; + self.attentionButton.selected = status; } - (void)attentionUserSuccess:(BOOL)status { - self.attentionButton.selected = status; + self.attentionButton.selected = status; } +#pragma mark -XPMineUserInfoEditViewController + +- (void)xPMineUserInfoEditViewControllerC:(XPMineUserInfoEditViewController *)vc didClickComplete:(NSString *)meLabels{ + self.headView.tagModel = self.tagModel; +} +- (void)xPMineUserInfoEditViewControllerC:(XPMineUserInfoEditViewController *)vc didClickCompleteArea:(NSString *)area{ + self.userInfo.region = area; + self.userDataVC.userInfo = self.userInfo; +} #pragma mark - Event Response - (void)chatButtonAction:(UIButton *)sender { - NSString * sessionId = [NSString stringWithFormat:@"%ld",self.uid]; - NIMSession * session = [NIMSession session:sessionId type:NIMSessionTypeP2P]; - SessionViewController * sessionVC = [[SessionViewController alloc] initWithSession:session]; - [self.navigationController pushViewController:sessionVC animated:YES]; + NSString * sessionId = [NSString stringWithFormat:@"%ld",self.uid]; + NIMSession * session = [NIMSession session:sessionId type:NIMSessionTypeP2P]; + SessionViewController * sessionVC = [[SessionViewController alloc] initWithSession:session]; + [self.navigationController pushViewController:sessionVC animated:YES]; } - (void)attentionButtonAction:(UIButton *)sender { - NSString *uid = [NSString stringWithFormat:@"%ld", self.uid]; - [self.presenter attentionUser:uid state:!sender.selected]; + NSString *uid = [NSString stringWithFormat:@"%ld", self.uid]; + [self.presenter attentionUser:uid state:!sender.selected]; } #pragma mark - Getters And Setters - (void)setUid:(NSInteger)uid { - _uid = uid; - if (_uid > 0) { - if (_uid == [AccountInfoStorage instance].getUid.integerValue) { - [self.navView.editButton setTitle:YMLocalizedString(@"XPMineUserInfoViewController9") forState:UIControlStateNormal]; - [self.navView.editButton setImage:[UIImage new] forState:UIControlStateNormal]; - } else { - [self.navView.editButton setTitle:@"" forState:UIControlStateNormal]; - [self.navView.editButton setImage:[UIImage imageNamed:@"mine_user_info_edit"] forState:UIControlStateNormal]; - } - self.navView.editButton.selected = _uid == [AccountInfoStorage instance].getUid.integerValue; - NSString * uidStr = [NSString stringWithFormat:@"%ld", uid]; - self.userDataVC.userUid = uidStr; - [self.presenter getUserInfoWithUid:uidStr]; - } + _uid = uid; + if (_uid > 0) { + if (_uid == [AccountInfoStorage instance].getUid.integerValue) { + [self.navView.editButton setImage:[UIImage imageNamed:@"mine_user_info_edit_self"] forState:UIControlStateNormal]; + } else { + + [self.navView.editButton setImage:[UIImage imageNamed:@"mine_user_info_edit"] forState:UIControlStateNormal]; + } + self.navView.editButton.selected = _uid == [AccountInfoStorage instance].getUid.integerValue; + NSString * uidStr = [NSString stringWithFormat:@"%ld", uid]; + self.userDataVC.userUid = uidStr; + self.giftVC.userUid = uidStr; + [self.presenter getUserInfoWithUid:uidStr]; + self.editVC.uid = uidStr; + } } - (XPMineUserInfoHeaderView *)headView { - if (!_headView) { - _headView = [[XPMineUserInfoHeaderView alloc] init]; - _headView.delegate = self; - } - return _headView; + if (!_headView) { + _headView = [[XPMineUserInfoHeaderView alloc] init]; + _headView.delegate = self; + } + return _headView; } - (XPMineUserInfoCustomNavView *)navView { - if (!_navView) { - _navView = [[XPMineUserInfoCustomNavView alloc] init]; - _navView.delegate = self; - } - return _navView; + if (!_navView) { + _navView = [[XPMineUserInfoCustomNavView alloc] init]; + _navView.delegate = self; + } + return _navView; } - (UIStackView *)bottomStackView { - if (!_bottomStackView) { - _bottomStackView = [[UIStackView alloc] init]; - _bottomStackView.axis = UILayoutConstraintAxisHorizontal; - _bottomStackView.distribution = UIStackViewDistributionFillEqually; - _bottomStackView.alignment = UIStackViewAlignmentFill; - _bottomStackView.spacing = 25; - } - return _bottomStackView; + if (!_bottomStackView) { + _bottomStackView = [[UIStackView alloc] init]; + _bottomStackView.axis = UILayoutConstraintAxisHorizontal; + _bottomStackView.distribution = UIStackViewDistributionFillEqually; + _bottomStackView.alignment = UIStackViewAlignmentFill; + _bottomStackView.spacing = 25; + } + return _bottomStackView; } - (UIButton *)chatButton { - if (!_chatButton) { - _chatButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_chatButton setTitle:YMLocalizedString(@"XPMineUserInfoViewController10") forState:UIControlStateNormal]; - [_chatButton setTitleColor:[DJDKMIMOMColor confirmButtonTextColor] forState:UIControlStateNormal]; - [_chatButton setImage:[UIImage imageNamed:@"mine_user_info_bottom_chat"] forState:UIControlStateNormal]; - _chatButton.titleLabel.font = [UIFont systemFontOfSize:15]; - [_chatButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor], [DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateNormal]; - _chatButton.layer.masksToBounds = YES; - _chatButton.layer.cornerRadius = 36/2; - [_chatButton addTarget:self action:@selector(chatButtonAction:) forControlEvents:UIControlEventTouchUpInside]; - } - return _chatButton; + if (!_chatButton) { + _chatButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_chatButton setTitle:YMLocalizedString(@"XPMineUserInfoViewController8") forState:UIControlStateNormal]; + [_chatButton setTitleColor:UIColorFromRGB(0x9168FA) forState:UIControlStateNormal]; + + _chatButton.titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; + [_chatButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[UIColorFromRGB(0xCCF8F9),UIColorFromRGB(0xDEE4FF),UIColorFromRGB(0xEEDCFF)] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateNormal]; + UIImage *lineImage = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor],[DJDKMIMOMColor confirmButtonGradientMiddleColor],[DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake((KScreenWidth - 30 - 25) / 2, 45)]; + UIColor *lineColor = [UIColor colorWithPatternImage:lineImage]; + _chatButton.layer.borderWidth = 1; + _chatButton.layer.borderColor = lineColor.CGColor; + _chatButton.layer.masksToBounds = YES; + _chatButton.layer.cornerRadius = 45/2; + [_chatButton addTarget:self action:@selector(chatButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _chatButton; } - (UIButton *)attentionButton { - if (!_attentionButton) { - _attentionButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_attentionButton setTitle:YMLocalizedString(@"XPMineUserInfoViewController11") forState:UIControlStateNormal]; - [_attentionButton setTitle:YMLocalizedString(@"XPMineUserInfoViewController12") forState:UIControlStateSelected]; - [_attentionButton setTitleColor:[DJDKMIMOMColor confirmButtonTextColor] forState:UIControlStateNormal]; - [_attentionButton setTitleColor:[DJDKMIMOMColor cancelButtonTextColor] forState:UIControlStateSelected]; - [_attentionButton setImage:[UIImage imageNamed:@"mine_user_info_bottom_attention_normal"] forState:UIControlStateNormal]; - [_attentionButton setImage:[UIImage imageNamed:@"mine_user_info_bottom_attention_select"] forState:UIControlStateSelected]; - _attentionButton.titleLabel.font = [UIFont systemFontOfSize:15]; - [_attentionButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor], [DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateNormal]; - [_attentionButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor cancelButtonGradientStartColor], [DJDKMIMOMColor cancelButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateSelected]; - _attentionButton.layer.masksToBounds = YES; - _attentionButton.layer.cornerRadius = 36/2; - [_attentionButton addTarget:self action:@selector(attentionButtonAction:) forControlEvents:UIControlEventTouchUpInside]; - } - return _attentionButton; + if (!_attentionButton) { + _attentionButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_attentionButton setTitle:YMLocalizedString(@"XPMineUserInfoViewController9") forState:UIControlStateNormal]; + [_attentionButton setTitle:YMLocalizedString(@"XPMineUserInfoViewController10") forState:UIControlStateSelected]; + [_attentionButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [_attentionButton setTitleColor:UIColorFromRGB(0xB3B3C3) forState:UIControlStateSelected]; + _attentionButton.titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; + [_attentionButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor],[DJDKMIMOMColor confirmButtonGradientMiddleColor],[DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateNormal]; + [_attentionButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[UIColorFromRGB(0xE6E6F0),UIColorFromRGB(0xE6E6F0),UIColorFromRGB(0xE6E6F0)] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateSelected]; + _attentionButton.layer.masksToBounds = YES; + _attentionButton.layer.cornerRadius = 45/2; + [_attentionButton addTarget:self action:@selector(attentionButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _attentionButton; } - (JXCategoryTitleView *)titleView { - if (!_titleView) { - _titleView = [[JXCategoryTitleView alloc] init]; - _titleView.delegate = self; - _titleView.backgroundColor = [UIColor clearColor]; - _titleView.titleColor = [DJDKMIMOMColor textThirdColor]; - _titleView.titleSelectedColor = [DJDKMIMOMColor mainTextColor]; - _titleView.titleFont = [UIFont fontWithName:@"PingFang-SC-Medium" size:12]; - _titleView.titleSelectedFont = [UIFont fontWithName:@"PingFang-SC-Medium" size:16]; - _titleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter; - _titleView.contentScrollViewClickTransitionAnimationEnabled = NO; - _titleView.defaultSelectedIndex = 0; - _titleView.averageCellSpacingEnabled = NO; - _titleView.contentEdgeInsetLeft = 20; - _titleView.titles = self.titles; - _titleView.cellSpacing = 20; - _titleView.titles = self.titles; - _titleView.listContainer = (id)self.pagingView.listContainerView; - - JXCategoryIndicatorImageView *lineView = [[JXCategoryIndicatorImageView alloc] init]; - lineView.indicatorImageViewSize = CGSizeMake(16, 6); - lineView.verticalMargin = 7; - lineView.indicatorImageView.layer.masksToBounds = YES; - lineView.indicatorImageView.layer.cornerRadius = 3; - lineView.indicatorImageView.image = [UIImage gradientColorImageFromColors:@[UIColorFromRGB(0xFFC000), UIColorFromRGB(0xFFF9DB)] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(16, 6)]; - _titleView.indicators = @[lineView]; - } - return _titleView; + if (!_titleView) { + _titleView = [[JXCategoryTitleView alloc] init]; + _titleView.delegate = self; + _titleView.backgroundColor = [UIColor clearColor]; + _titleView.titleColor = UIColorFromRGB(0x6D6B89); + _titleView.titleSelectedColor = UIColorFromRGB(0x1F1A4E); + _titleView.titleFont = [UIFont fontWithName:@"PingFang-SC-Medium" size:14]; + _titleView.titleSelectedFont = [UIFont boldSystemFontOfSize:18]; + _titleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter; + _titleView.contentScrollViewClickTransitionAnimationEnabled = NO; + _titleView.defaultSelectedIndex = 0; + _titleView.averageCellSpacingEnabled = NO; + _titleView.contentEdgeInsetLeft = 20; + _titleView.titles = self.titles; + _titleView.cellSpacing = 20; + _titleView.titles = self.titles; + _titleView.listContainer = (id)self.pagingView.listContainerView; + + JXCategoryIndicatorImageView *lineView = [[JXCategoryIndicatorImageView alloc] init]; + lineView.indicatorImageViewSize = CGSizeMake(37, 8); + lineView.verticalMargin = 15; + lineView.indicatorImageView.layer.masksToBounds = YES; + lineView.indicatorImageView.layer.cornerRadius = 3; + lineView.indicatorImageView.image = [UIImage imageNamed:@"mine_dynamic"]; + _titleView.indicators = @[lineView]; + } + return _titleView; } - (JXPagerView *)pagingView { - if (!_pagingView) { - _pagingView = [[JXPagerView alloc] initWithDelegate:self]; - _pagingView.backgroundColor = [UIColor clearColor]; - _pagingView.listContainerView.backgroundColor = [UIColor clearColor]; - _pagingView.mainTableView.backgroundColor = [UIColor clearColor]; - _pagingView.listContainerView.listCellBackgroundColor = UIColor.clearColor; - _pagingView.mainTableView.gestureDelegate = self; - } - return _pagingView; + if (!_pagingView) { + _pagingView = [[JXPagerView alloc] initWithDelegate:self]; + _pagingView.backgroundColor = [UIColor clearColor]; + _pagingView.listContainerView.backgroundColor = [UIColor clearColor]; + _pagingView.mainTableView.backgroundColor = [UIColor clearColor]; + _pagingView.listContainerView.listCellBackgroundColor = UIColor.clearColor; + _pagingView.mainTableView.gestureDelegate = self; + } + return _pagingView; } - (NSArray *)titles { - if (!_titles) { - _titles = @[YMLocalizedString(@"XPMineUserInfoViewController13"), YMLocalizedString(@"XPMineUserInfoViewController14")]; - } - return _titles; + if (!_titles) { + _titles = @[YMLocalizedString(@"XPMineUserInfoViewController11"),YMLocalizedString(@"XPMineUserInfoViewController13")]; + } + return _titles; } - (XPMineUserDataViewController *)userDataVC { - if (!_userDataVC) { - _userDataVC = [[XPMineUserDataViewController alloc] init]; - } - return _userDataVC; + if (!_userDataVC) { + _userDataVC = [[XPMineUserDataViewController alloc] init]; + _userDataVC.delegate = self; + } + return _userDataVC; } - (XPMineUserInfoVoiceCardView *)voiceView { - if (!_voiceView) { - _voiceView = [[XPMineUserInfoVoiceCardView alloc] init]; - _voiceView.hidden = YES; - } - return _voiceView; -} - -- (XPMonentsMineViewController *)monentsVC { - if (!_monentsVC) { - _monentsVC = [[XPMonentsMineViewController alloc] init]; - } - return _monentsVC; + if (!_voiceView) { + _voiceView = [[XPMineUserInfoVoiceCardView alloc] init]; + _voiceView.hidden = YES; + } + return _voiceView; } +-(XPGiftUserDataViewController *)giftVC{ + if (!_giftVC){ + _giftVC = [XPGiftUserDataViewController new]; + } + return _giftVC; +} +- (XPMineUserInfoEditViewController *)editVC{ + if (!_editVC){ + _editVC = [XPMineUserInfoEditViewController new]; + _editVC.delegate = self; + } + return _editVC; +} +- (CountDownHelper *)countDownHelper{ + if (!_countDownHelper){ + _countDownHelper = [[CountDownHelper alloc]init]; + } + return _countDownHelper; +} @end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoEditPickView.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoEditPickView.h new file mode 100644 index 00000000..87d4805f --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoEditPickView.h @@ -0,0 +1,34 @@ +// +// XPMineUserInfoEditPickView.h +// xplan-ios +// +// Created by duoban on 2023/2/17. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@protocol XPMineUserInfoEditPickViewDelegate + +///点了确认按钮 +- (void)didClickSureActionWithArea:(NSString *)area; + +@end +@interface XPMineUserInfoEditPickView : UIView +@property (nonatomic,strong)NSMutableArray * dataArray;//数据源 +/// +@property (nonatomic,copy) NSString *area; +/// +@property (nonatomic,weak) id delegate; +@end + + + +@interface AreaPickerView : UIView + + + +@property(nonatomic,strong) UILabel *titleLab; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoEditPickView.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoEditPickView.m new file mode 100644 index 00000000..0aff08f4 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoEditPickView.m @@ -0,0 +1,203 @@ +// +// XPMineUserInfoEditPickView.m +// xplan-ios +// +// Created by duoban on 2023/2/17. +// + +#import "XPMineUserInfoEditPickView.h" +@interface XPMineUserInfoEditPickView() +@property (strong, nonatomic) UIPickerView *pickerView; + +@property (nonatomic,strong) UIView *bgView; +@property (nonatomic,strong) UIButton *cancelBtn; +@property (nonatomic,strong) UIButton *confirmBtn; + +@end +@implementation XPMineUserInfoEditPickView + +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} +-(void)setDataArray:(NSMutableArray *)dataArray{ + _dataArray = dataArray; + if(_dataArray.count == 0)return; + if(![_dataArray containsObject:_area]){ + _area = _dataArray.firstObject; + } + [_pickerView reloadAllComponents]; + if([_dataArray containsObject:_area]){ + [_pickerView selectRow:[_dataArray indexOfObject:_area] inComponent:0 animated:YES]; + }else{ + [_pickerView selectRow:0 inComponent:0 animated:YES]; + } + +} +-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ + + return 1; +} + +-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ + + return [_dataArray count]; +} + +-(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{ + + return KScreenWidth; +} +-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{ + return kGetScaleWidth(38); +} + +-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{ + [self changeSpearatorLineColor]; + AreaPickerView *lab = (AreaPickerView *)view; + if (!lab) { + lab = [[AreaPickerView alloc]initWithFrame:CGRectMake(kGetScaleWidth(15),0, KScreenWidth - kGetScaleWidth(30), kGetScaleWidth(38))]; + } + NSString *area = self.dataArray[row]; + lab.titleLab.text = area; + if([area isEqualToString:self.area]){ + lab.backgroundColor = UIColorFromRGB(0xF3F5FA); + lab.titleLab.textColor = [DJDKMIMOMColor inputTextColor]; + }else{ + lab.backgroundColor = [UIColor clearColor]; + lab.titleLab.textColor = [DJDKMIMOMColor disableButtonTextColor]; + } + return lab; +} +#pragma mark - 改变分割线的颜色 +- (void)changeSpearatorLineColor { + + for(UIView *speartorView in _pickerView.subviews) { + + if (speartorView.frame.size.height < 80) {//找出当前的 View + + + speartorView.backgroundColor = [UIColor clearColor]; + }else{ + speartorView.backgroundColor = [UIColor clearColor]; + } + } +} +-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ + + self.area = self.dataArray[row]; + [pickerView reloadAllComponents]; +} +#pragma mark - Private Method +- (void)initSubViews { + self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5]; + [self addSubview:self.bgView]; + [self.bgView addSubview:self.cancelBtn]; + [self.bgView addSubview:self.confirmBtn]; + [self.bgView addSubview:self.pickerView]; +} +- (void)initSubViewConstraints { + [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.bottom.equalTo(self).inset(kGetScaleWidth(0)); + make.height.mas_equalTo(kGetScaleWidth(272)); + }]; + [self.cancelBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(kGetScaleWidth(15)); + make.top.mas_equalTo(kGetScaleWidth(20)); + make.width.mas_equalTo(kGetScaleWidth(35)); + make.height.mas_equalTo(kGetScaleWidth(20)); + + }]; + [self.confirmBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(kGetScaleWidth(20)); + make.right.mas_equalTo(-kGetScaleWidth(15)); + }]; + [self.pickerView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(kGetScaleWidth(74)); + make.left.right.bottom.equalTo(self.bgView).inset(kGetScaleWidth(0)); + + }]; +} +-(void)cancelAction{ + [self removeFromSuperview]; +} +-(void)confirmAction{ + [self removeFromSuperview]; + if(self.delegate && [self.delegate respondsToSelector:@selector(didClickSureActionWithArea:)]){ + [self.delegate didClickSureActionWithArea:self.area]; + } +} +#pragma mark -懒加载 +- (UIPickerView *)pickerView{ + if (!_pickerView){ + _pickerView = [[UIPickerView alloc]initWithFrame:CGRectZero]; + _pickerView.delegate = self; + _pickerView.dataSource = self; + } + return _pickerView; +} +- (UIButton *)cancelBtn{ + if (!_cancelBtn){ + _cancelBtn = [UIButton buttonInitWithText:YMLocalizedString(@"XPIncomeRecordGoldDetailsPickViewView0") font:kFontMedium(16) textColor:[DJDKMIMOMColor disableButtonTextColor] image:nil bgImage:nil]; + [_cancelBtn addTarget:self action:@selector(cancelAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _cancelBtn; +} +-(UIButton *)confirmBtn{ + if (!_confirmBtn){ + _confirmBtn = [UIButton buttonInitWithText:YMLocalizedString(@"XPIncomeRecordGoldDetailsPickViewView1") font:kFontMedium(16) textColor:[DJDKMIMOMColor inputTextColor] image:nil bgImage:nil]; + [_confirmBtn addTarget:self action:@selector(confirmAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _confirmBtn; +} + +- (UIView *)bgView{ + if (!_bgView){ + _bgView = [UIView new]; + _bgView.backgroundColor = [UIColor whiteColor]; + [_bgView setCornerWithLeftTopCorner:kGetScaleWidth(18) rightTopCorner:kGetScaleWidth(18) bottomLeftCorner:0 bottomRightCorner:0 size:CGSizeMake(KScreenWidth, kGetScaleWidth(302))]; + } + return _bgView; +} +@end + + + + +@implementation AreaPickerView + +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + self.backgroundColor = UIColorFromRGB(0xF3F5FA); + [self addSubview:self.titleLab]; + +} +- (void)initSubViewConstraints { + [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self); + }]; + +} +#pragma mark -懒加载 +- (UILabel *)titleLab{ + if (!_titleLab){ + _titleLab = [UILabel labelInitWithText:@"" font:kFontMedium(15) textColor:[DJDKMIMOMColor inputTextColor]]; + _titleLab.textAlignment = NSTextAlignmentCenter; + } + return _titleLab; +} + +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoGiftView.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoGiftView.m index 6aa2d681..e5c95646 100644 --- a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoGiftView.m +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoGiftView.m @@ -1,94 +1,146 @@ // -// YMMineUserInfoGiftView.m -// YUMI +// XPMineUserInfoGiftView.m +// xplan-ios // -// Created by YUMI on 2022/6/15. +// Created by 冯硕 on 2022/6/15. // #import "XPMineUserInfoGiftView.h" ///Third #import -///Tool -#import "YUMIMacroUitls.h" -#import "NSArray+Safe.h" ///View #import "XPMineDataGiftCollectionViewCell.h" #import "XPMineUserInfoEmptyCollectionViewCell.h" - +#import "UserGiftWallInfoModel.h" @interface XPMineUserInfoGiftView () ///列表 @property (nonatomic,strong) UICollectionView *collectionView; +@property (nonatomic,assign) NSInteger giftNum; @end @implementation XPMineUserInfoGiftView - (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self initSubViews]; - [self initSubViewConstraints]; - } - return self; + self = [super initWithFrame:frame]; + if (self) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; } #pragma mark - Private Method - (void)initSubViews { - self.backgroundColor = [UIColor clearColor]; - [self addSubview:self.collectionView]; + self.backgroundColor = [UIColor clearColor]; + [self addSubview:self.collectionView]; } - (void)initSubViewConstraints { - [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { - make.edges.mas_equalTo(self); - }]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self); + }]; } #pragma mark - UICollectionViewDelegate And UICollectionViewDatasource -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { - return self.datasource.count > 0? CGSizeMake(51, 65) : CGSizeMake(KScreenWidth - 30, 65 * 3 + 30); + +-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ + if (self.giftNum == 0)return 1; + return 2; + + } +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + if(self.giftNum > 0){ + + CGFloat width = KScreenWidth - 30 - kGetScaleWidth(52); + return indexPath.section == 0 ? CGSizeMake(width / 3 , kGetScaleWidth(93)): CGSizeMake((width - 24)/4 , kGetScaleWidth(82)); + } + return CGSizeMake(KScreenWidth - 30, 65 * 3 + 30); +} +- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{ + if(self.giftNum > 0){ + return section == 0 ? UIEdgeInsetsMake(0, kGetScaleWidth(16), kGetScaleWidth(12), kGetScaleWidth(16)):UIEdgeInsetsMake(0, kGetScaleWidth(16), 0, kGetScaleWidth(16)); + } + return UIEdgeInsetsMake(0, 0, 0, 0); +} - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - return self.datasource.count > 0 ? self.datasource.count : 1; + if (self.giftNum == 0)return 1; + return [self.datasource[section] count]; } - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { - if (self.datasource.count > 0) { - XPMineDataGiftCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPMineDataGiftCollectionViewCell class]) forIndexPath:indexPath]; - cell.giftInfo = [self.datasource safeObjectAtIndex1:indexPath.row]; - return cell; - } - - XPMineUserInfoEmptyCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoEmptyCollectionViewCell class]) forIndexPath:indexPath]; - cell.isGiftWall = YES; - return cell; + if (self.giftNum > 0) { + XPMineDataGiftCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPMineDataGiftCollectionViewCell class]) forIndexPath:indexPath]; + if (indexPath.section == 0 && self.datasource.count > 0){ + NSArray *dataList = self.datasource[indexPath.section]; + if(indexPath.row < dataList.count){ + cell.giftInfo = [dataList safeObjectAtIndex1:indexPath.row]; + [cell setLevel:((int)indexPath.row + 1)]; + }else{ + UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([UICollectionViewCell class]) forIndexPath:indexPath]; + + return cell; + } + + } + if (indexPath.section == 1 && self.datasource.count > 1){ + NSArray *dataList = self.datasource[indexPath.section]; + if(indexPath.row < dataList.count){ + cell.giftInfo = [dataList safeObjectAtIndex1:indexPath.row]; + }else{ + UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([UICollectionViewCell class]) forIndexPath:indexPath]; + + return cell; + } + [cell setLevel:4]; + } + + return cell; + } + + XPMineUserInfoEmptyCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoEmptyCollectionViewCell class]) forIndexPath:indexPath]; + cell.isGiftWall = YES; + return cell; } #pragma mark - JXCategoryListContentViewDelegate - (UIView *)listView { - return self; + return self; } #pragma mark - Getters And Setters - (void)setDatasource:(NSArray *)datasource { - _datasource = datasource; - [self.collectionView reloadData]; + _giftNum = datasource.count ; + NSMutableArray *firstDataSource = [NSMutableArray array]; + NSMutableArray *secondDataSource = [NSMutableArray array]; + for (int i = 0; i < datasource.count; i++) { + UserGiftWallInfoModel *obj = datasource[i]; + if(i < 3){ + [firstDataSource addObject:obj]; + }else{ + [secondDataSource addObject:obj]; + } + } + _datasource = @[firstDataSource,secondDataSource]; + [self.collectionView reloadData]; } - (UICollectionView *)collectionView{ - if (!_collectionView) { - UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; - layout.minimumInteritemSpacing = (KScreenWidth - 15 *2 - 10 * 2 -51 * 5) / 3.0;; - layout.minimumLineSpacing = 10; - layout.sectionInset = UIEdgeInsetsMake(0, 10, 0, 10); - _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; - _collectionView.dataSource = self; - _collectionView.delegate = self; - _collectionView.scrollEnabled = NO; - _collectionView.backgroundColor = [UIColor clearColor]; - [_collectionView registerClass:[XPMineDataGiftCollectionViewCell class] forCellWithReuseIdentifier:NSStringFromClass([XPMineDataGiftCollectionViewCell class])]; - [_collectionView registerClass:[XPMineUserInfoEmptyCollectionViewCell class] forCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoEmptyCollectionViewCell class])]; - - } - return _collectionView; + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.minimumLineSpacing = kGetScaleWidth(12); + layout.minimumInteritemSpacing = 0; + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.dataSource = self; + _collectionView.delegate = self; + _collectionView.pagingEnabled = NO; + + _collectionView.backgroundColor = [UIColor clearColor]; + [_collectionView registerClass:[XPMineDataGiftCollectionViewCell class] forCellWithReuseIdentifier:NSStringFromClass([XPMineDataGiftCollectionViewCell class])]; + [_collectionView registerClass:[XPMineUserInfoEmptyCollectionViewCell class] forCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoEmptyCollectionViewCell class])]; + [_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:NSStringFromClass([UICollectionViewCell class])]; + + } + return _collectionView; } diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagCell.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagCell.h new file mode 100644 index 00000000..fd814a36 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagCell.h @@ -0,0 +1,21 @@ +// +// XPMineUserInfoHeaderTagCell.h +// xplan-ios +// +// Created by duoban on 2023/2/16. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XPMineUserInfoHeaderTagCell : UICollectionViewCell +/// +@property (nonatomic,assign) BOOL isTag; +/// +@property (nonatomic,copy) NSString *title; +/// +@property (nonatomic,strong,readonly) UILabel *titleView; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagCell.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagCell.m new file mode 100644 index 00000000..d6ef1ec7 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagCell.m @@ -0,0 +1,51 @@ +// +// XPMineUserInfoHeaderTagCell.m +// xplan-ios +// +// Created by duoban on 2023/2/16. +// + +#import "XPMineUserInfoHeaderTagCell.h" +@interface XPMineUserInfoHeaderTagCell() +/// +@property (nonatomic,strong) UILabel *titleView; +@end +@implementation XPMineUserInfoHeaderTagCell +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + [self.contentView addSubview:self.titleView]; + self.contentView.layer.cornerRadius = 9; + self.contentView.layer.masksToBounds = YES; +} +- (void)initSubViewConstraints { + [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.contentView); + }]; +} +-(void)setIsTag:(BOOL)isTag{ + _isTag = isTag; + self.contentView.backgroundColor = _isTag ? [UIColor colorWithRed:58/255.0 green:213/255.0 blue:248/255.0 alpha:0.12]: UIColorFromRGB(0xF3F5F9); + _titleView.textColor = _isTag ? UIColorFromRGB(0x00C4EA):UIColorFromRGB(0x6D6B89); +} +- (void)setTitle:(NSString *)title{ + _title = title; + _titleView.text = _title; +} +#pragma mark -懒加载 +- (UILabel *)titleView{ + if (!_titleView){ + _titleView = [UILabel labelInitWithText:@"" font:[UIFont systemFontOfSize:10 weight:UIFontWeightRegular] textColor:UIColorFromRGB(0x00C4EA)]; + _titleView.textAlignment = NSTextAlignmentCenter; + } + return _titleView; +} +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagView.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagView.h new file mode 100644 index 00000000..eaa45300 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagView.h @@ -0,0 +1,26 @@ +// +// XPMineUserInfoHeaderTagView.h +// xplan-ios +// +// Created by duoban on 2023/2/16. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@class XPMineUserInfoHeaderTagView; +@protocol XPMineUserInfoHeaderTagViewDelegate + +- (void)didClickGotoIvidualView; +- (void)didClickGotoEditVC; + +@end +@interface XPMineUserInfoHeaderTagView : UIView +@property (nonatomic,strong) NSMutableArray *itemList; +/// +@property (nonatomic,copy) NSString *uid; +/// +@property (nonatomic,weak) id delegate; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagView.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagView.m new file mode 100644 index 00000000..be533f86 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderTagView.m @@ -0,0 +1,161 @@ +// +// XPMineUserInfoHeaderTagView.m +// xplan-ios +// +// Created by duoban on 2023/2/16. +// + +#import "XPMineUserInfoHeaderTagView.h" +#import "XPMineUserInfoTagFlowLayout.h" +#import "XPMineUserInfoHeaderTagCell.h" +#import "XPMineUserInfoTagModel.h" +@interface XPMineUserInfoHeaderTagView() +@property (nonatomic,strong) UICollectionView *collectionView; +/// +@property (nonatomic,strong) UIButton *clickBtn; +///设置个人标签 +@property (nonatomic,strong) UIView *editView; +@end +@implementation XPMineUserInfoHeaderTagView + +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + self.hidden = YES; + [self addSubview:self.collectionView]; + [self addSubview:self.clickBtn]; + [self addSubview:self.editView]; +} +- (void)initSubViewConstraints { + [self.clickBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.mas_equalTo(0); + make.centerY.equalTo(self); + make.width.height.mas_equalTo(20); + }]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.centerY.equalTo(self); + make.height.mas_equalTo(18); + make.right.equalTo(self.clickBtn.mas_left); + }]; + [self.editView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.top.equalTo(self); + make.height.equalTo(self.clickBtn); + make.width.mas_greaterThanOrEqualTo(128); + }]; + +} +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + XPMineUserInfoTagItemModel *model = self.itemList[indexPath.row]; + return CGSizeMake(model.width, 18); +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + + return self.itemList.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + + XPMineUserInfoHeaderTagCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoHeaderTagCell class]) forIndexPath:indexPath]; + cell.isTag = indexPath.row < 3; + XPMineUserInfoTagItemModel *model = self.itemList[indexPath.row]; + cell.title = model.label; + + return cell; +} +-(void)setItemList:(NSMutableArray *)itemList{ + _itemList = itemList; + for (XPMineUserInfoTagItemModel *model in _itemList) { + CGRect stringRect = [model.label boundingRectWithSize:CGSizeMake(MAXFLOAT, kGetScaleWidth(18)) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:kFontRegular(10)} context:nil]; + model.width = stringRect.size.width + kGetScaleWidth(14); + } + [_collectionView reloadData]; + NSString *uid = [[AccountInfoStorage instance]getUid]; + BOOL isMe = [self.uid isEqualToString:uid]; + if(isMe == YES && _itemList.count == 0){ + _collectionView.hidden = YES; + _clickBtn.hidden = YES; + _editView.hidden = NO; + }else{ + _collectionView.hidden = NO; + _clickBtn.hidden = NO; + _editView.hidden = YES; + } +} +-(void)clickAction{ + if(self.delegate && [self.delegate respondsToSelector:@selector(didClickGotoIvidualView)]){ + [self.delegate didClickGotoIvidualView]; + } +} +-(void)editAction{ + if(self.delegate && [self.delegate respondsToSelector:@selector(didClickGotoEditVC)]){ + [self.delegate didClickGotoEditVC]; + } +} +#pragma mark -懒加载 +- (UICollectionView *)collectionView{ + if (!_collectionView) { + XPMineUserInfoTagFlowLayout *layout = [[XPMineUserInfoTagFlowLayout alloc] init]; + layout.delegate = self; + layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0); + layout.minimumLineSpacing = 0; + layout.minimumInteritemSpacing = 5; + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.dataSource = self; + _collectionView.delegate = self; + _collectionView.pagingEnabled = NO; + _collectionView.scrollEnabled = NO; + _collectionView.backgroundColor = [UIColor clearColor]; + [_collectionView registerClass:[XPMineUserInfoHeaderTagCell class] forCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoHeaderTagCell class])]; + _collectionView.showsVerticalScrollIndicator = NO; + } + return _collectionView; +} +- (UIButton *)clickBtn{ + if (!_clickBtn){ + _clickBtn = [UIButton new]; + [_clickBtn setBackgroundImage:kImage(@"mine_info_tag_arrow") forState:UIControlStateNormal]; + [_clickBtn setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; + [_clickBtn addTarget:self action:@selector(clickAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _clickBtn; +} +- (UIView *)editView{ + if (!_editView){ + _editView = [UIView new]; + _editView.backgroundColor = UIColorFromRGB(0xE1FAFF); + UIImageView *imageView = [UIImageView new]; + imageView.image = kImage(@"mine_user_info_head_edit"); + imageView.userInteractionEnabled = YES; + [_editView addSubview:imageView]; + [imageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(14); + make.left.mas_equalTo(9); + make.top.mas_equalTo(4); + }]; + UILabel *label = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserInfoHeaderTagView0") font:[UIFont systemFontOfSize:10 weight:UIFontWeightMedium] textColor:UIColorFromRGB(0x00C4EA)]; + [_editView addSubview:label]; + label.userInteractionEnabled = YES; + [label mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(33); + make.right.mas_equalTo(-15); + make.top.mas_equalTo(3); + make.bottom.mas_equalTo(-3); + }]; + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(editAction)]; + [_editView addGestureRecognizer:tap]; + _editView.hidden = YES; + _editView.layer.cornerRadius = 10; + _editView.layer.masksToBounds = YES; + } + return _editView; +} +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.h index cdebc941..3667d9cb 100644 --- a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.h +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.h @@ -1,28 +1,46 @@ // -// YMMineHeaderView.h -// YUMI +// XPMineHeaderView.h +// xplan-ios // -// Created by YUMI on 2021/9/22. +// Created by 冯硕 on 2021/9/22. // #import - +#import "XPSoundCardModel.h" +#import "XPMineUserInfoTagModel.h" NS_ASSUME_NONNULL_BEGIN @class UserInfoModel, SDCycleScrollView,XPMineUserInfoHeaderView; @protocol XPMineUserInfoHeaderViewDelegate - +///去房间 - (void)xPMineUserInfoHeaderView:(XPMineUserInfoHeaderView *)view didClickGoToRoom:(NSString *)roomUid; - +//播放声音,播放或关闭 +- (void)xPMineUserInfoHeaderView:(XPMineUserInfoHeaderView *)view didClickPlaySound:(BOOL)isPlay; +///去录音VC +- (void)didClickGoToPlaySound; +///去标签页 +- (void)xPMineUserInfoHeaderView:(XPMineUserInfoHeaderView *)view didClickGotoEditView:(NSMutableArray *)itemList; +///去标签vc +- (void)xPMineUserInfoHeaderView:(XPMineUserInfoHeaderView *)view didClickGotoEditVC:(NSMutableArray *)itemList; @end @interface XPMineUserInfoHeaderView : UIView +///用户信息 @property (nonatomic,strong) UserInfoModel *userInfo; +///声音卡基本信息 +@property (nonatomic,strong) XPSoundCardModel *__nullable soundModel; +///标签 +@property (nonatomic,strong) XPMineUserInfoTagModel *tagModel; ///轮播图 -@property (nonatomic,strong, readonly) SDCycleScrollView *pi_BannerView; +@property (nonatomic,strong, readonly) SDCycleScrollView *pi_cycleScrollView; ///代理 @property (nonatomic,weak) id delegate; ///当前查看用户是否在直播 @property (nonatomic,copy) NSString *roomUid; +///声音卡时,svga是否播放动画 +-(void)setPlaySoundStatus:(BOOL)isPlay; +///声音卡倒计时 +-(void)setPlaySoundTime:(NSInteger)time; + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.m index 3e48e238..3e4c27ed 100644 --- a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.m +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.m @@ -1,8 +1,8 @@ // -// YMMineHeaderView.m -// YUMI +// XPMineHeaderView.m +// xplan-ios // -// Created by YUMI on 2021/9/22. +// Created by 冯硕 on 2021/9/22. // #import "XPMineUserInfoHeaderView.h" @@ -11,21 +11,22 @@ #import #import "SDPhotoBrowser.h" #import +#import ///Tool -#import "DJDKMIMOMColor.h" -#import "YUMIMacroUitls.h" #import "UIImage+ImageEffects.h" #import "UIImage+Utils.h" #import "NetImageView.h" -#import "NSArray+Safe.h" -#import "XNDJTDDLoadingTool.h" -#import "StatisticsServiceHelper.h" +#import "XPSkillCardPlayerManager.h" +#import "XPRoomMiniManager.h" +///view +#import "XPMineUserInfoHeaderTagView.h" ///Model #import "UserInfoModel.h" - -@interface XPMineUserInfoHeaderView () +@interface XPMineUserInfoHeaderView () ///轮播图 -@property (nonatomic,strong) SDCycleScrollView *pi_BannerView; +@property (nonatomic,strong) SDCycleScrollView *cycleScrollView; +///背景图 +@property (nonatomic,strong) UIImageView *bgView; ///覆盖的view @property (nonatomic,strong) UIImageView * coverImageView; ///显示当前的页数 @@ -38,15 +39,23 @@ @property (nonatomic,strong) NSMutableArray *userPhtotArray; ///用户信息 @property (nonatomic,strong) UIView * userInfoView; + + + ///用户信息的背景 @property (nonatomic,strong) UIImageView *usershadowImageView; -///贵族等级icon -@property (nonatomic,strong) NetImageView *nobleImageView; @property (nonatomic,strong) UIStackView *nickStackView; ///名字 @property (nonatomic,strong) UILabel *nameLabel; ///sex @property (nonatomic,strong) UIImageView *sexImageView; + +///正在直播父图 +@property (nonatomic,strong) UIImageView *onlineView; +///正在直播icon图 +@property (nonatomic,strong) SVGAImageView *onlineIconView; +///正在直播中tilte +@property (nonatomic,strong) UILabel *onlineTitleView; ///正在直播中 @property (nonatomic,strong) UIButton *onlineButton; /// @@ -57,8 +66,6 @@ @property (nonatomic,strong) UILabel *idLabel; ///空白的占位图 @property (nonatomic,strong) UIView * spaceView; -///复制ID -@property (nonatomic,strong) UIImageView *copysIdImageView; ///粉丝数 @property (nonatomic,strong) UILabel *fansNumLabel; ///魅力等级 等级 铭牌 @@ -79,634 +86,984 @@ @property (nonatomic,strong) UIImageView *newUserImageView; ///官方的 @property (nonatomic,strong) UIImageView *officalImageView; + +///标签跟签名容器 +@property (nonatomic,strong) UIStackView *singStackView; +///标签 +@property (nonatomic,strong) XPMineUserInfoHeaderTagView *tagView; ///签名的背景 @property (nonatomic,strong) UIView * signBackView; ///签名 @property (nonatomic,strong) UILabel *signLabel; ///分割线 -@property (nonatomic,strong) UIView * lineView; +//@property (nonatomic,strong) UIView * lineView; ///头像的 @property (nonatomic,strong) UserPhoto *avatarPhoto; +///头像 +@property (nonatomic,strong) NetImageView * avatarView; +///声音背景 +@property (nonatomic,strong) UIImageView *soundView; +///声音播放 +@property (nonatomic,strong) UIButton *palySoundBtn; +///声音动效 +@property (nonatomic,strong) SVGAImageView *soundSVGAView; +///声音时间 +@property (nonatomic,strong) UILabel *soundTimeView; +///录制声音提示 +@property (nonatomic,strong) UILabel *soundPromptView; +///录制声音按钮 +@property (nonatomic,strong) UIButton *toSoundBtn; + @end @implementation XPMineUserInfoHeaderView - (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self initSubViews]; - [self initSubViewConstraints]; - } - return self; + self = [super initWithFrame:frame]; + if (self) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; } #pragma mark - Private Method - (void)initSubViews { - [self addSubview:self.pi_BannerView]; - [self addSubview:self.coverImageView]; - [self addSubview:self.reviewIcon]; - [self addSubview:self.userInfoView]; - - [self.userInfoView addSubview:self.usershadowImageView]; - [self.userInfoView addSubview:self.signBackView]; - [self.userInfoView addSubview:self.lineView]; - - [self.usershadowImageView addSubview:self.nickStackView]; - [self.usershadowImageView addSubview:self.idStackView]; - [self.usershadowImageView addSubview:self.tagStackView]; - [self.usershadowImageView addSubview:self.pageButton]; - [self.usershadowImageView addSubview:self.nobleImageView]; + + [self addSubview:self.cycleScrollView]; + + [self addSubview:self.coverImageView]; + [self addSubview:self.bgView]; + [self addSubview:self.reviewIcon]; + [self addSubview:self.userInfoView]; + [self addSubview:self.pageButton]; + [self addSubview:self.avatarView]; + [self.avatarView addSubview:self.onlineView]; - [self.nickStackView addArrangedSubview:self.nameLabel]; - [self.nickStackView addArrangedSubview:self.sexImageView]; - [self.nickStackView addArrangedSubview:self.onlineButton]; - - [self.idStackView addArrangedSubview:self.beautifulImageViw]; - [self.idStackView addArrangedSubview:self.idLabel]; - [self.idStackView addArrangedSubview:self.copysIdImageView]; - [self.idStackView addArrangedSubview:self.spaceView]; - [self.idStackView addArrangedSubview:self.fansNumLabel]; + [self.onlineView addSubview:self.onlineIconView]; + [self.onlineView addSubview:self.onlineTitleView]; + [self.onlineView addSubview:self.onlineButton]; + + + [self.userInfoView addSubview:self.usershadowImageView]; + + + [self.usershadowImageView addSubview:self.singStackView]; +// [self.userInfoView addSubview:self.lineView]; + + + + [self.usershadowImageView addSubview:self.nickStackView]; + [self.usershadowImageView addSubview:self.idStackView]; + [self.usershadowImageView addSubview:self.tagStackView]; + [self.usershadowImageView addSubview:self.soundView]; + + [self.soundView addSubview:self.palySoundBtn]; + [self.soundView addSubview:self.soundSVGAView]; + [self.soundView addSubview:self.soundTimeView]; + [self.soundView addSubview:self.soundPromptView]; + [self.soundView addSubview:self.toSoundBtn]; + + [self.nickStackView addArrangedSubview:self.nameLabel]; + [self.nickStackView addArrangedSubview:self.sexImageView]; + + + [self.idStackView addArrangedSubview:self.beautifulImageViw]; + [self.idStackView addArrangedSubview:self.idLabel]; + [self.idStackView addArrangedSubview:self.spaceView]; + [self.idStackView addArrangedSubview:self.fansNumLabel]; - - ///用户信息中的标签 - [self.tagStackView addArrangedSubview:self.newUserImageView]; - [self.tagStackView addArrangedSubview:self.officalImageView]; - [self.tagStackView addArrangedSubview:self.experImageView]; - [self.tagStackView addArrangedSubview:self.charmImageView]; - [self.tagStackView addArrangedSubview:self.namePlateView]; - ///铭牌 - [self.namePlateView addSubview:self.nameplateImageView]; - [self.namePlateView addSubview:self.nameplateLabel]; - - [self.signBackView addSubview:self.signLabel]; + + ///用户信息中的标签 + [self.tagStackView addArrangedSubview:self.newUserImageView]; + [self.tagStackView addArrangedSubview:self.officalImageView]; + [self.tagStackView addArrangedSubview:self.experImageView]; + [self.tagStackView addArrangedSubview:self.charmImageView]; + [self.tagStackView addArrangedSubview:self.namePlateView]; + ///铭牌 + [self.namePlateView addSubview:self.nameplateImageView]; + [self.namePlateView addSubview:self.nameplateLabel]; + + [self.singStackView addArrangedSubview:self.tagView]; + [self.singStackView addArrangedSubview:self.signBackView]; + [self.signBackView addSubview:self.signLabel]; + + @kWeakify(self); + SVGAParser * parser = [[SVGAParser alloc]init]; + [parser parseWithNamed:@"mine_info_online" inBundle:[NSBundle mainBundle] completionBlock:^(SVGAVideoEntity * _Nonnull videoItem) { + @kStrongify(self); + self.onlineIconView.loops = 0; + self.onlineIconView.clearsAfterStop = NO; + self.onlineIconView.videoItem = videoItem; + [self.onlineIconView startAnimation]; + } failureBlock:^(NSError * _Nonnull error) { + + }]; + + SVGAParser *soundParser = [SVGAParser new]; + [soundParser parseWithNamed:@"mine_info_sound_play" inBundle:[NSBundle mainBundle] completionBlock:^(SVGAVideoEntity * _Nonnull videoItem) { + @kStrongify(self); + self.soundSVGAView.loops = 0; + self.soundSVGAView.clearsAfterStop = NO; + self.soundSVGAView.videoItem = videoItem; + } failureBlock:^(NSError * _Nonnull error) { + + }]; + + } - (void)initSubViewConstraints { - [self.pi_BannerView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.top.mas_equalTo(self); - make.height.mas_equalTo(375); - }]; - - [self.coverImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.edges.mas_equalTo(self.pi_BannerView); - }]; - - [self.reviewIcon mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.right.mas_equalTo(self); - make.width.mas_equalTo(85); - make.height.mas_equalTo(50); - }]; - - [self.userInfoView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.mas_equalTo(self); - make.bottom.mas_equalTo(self); - make.height.mas_equalTo(210); - }]; - - [self.usershadowImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.top.mas_equalTo(self.userInfoView); - make.height.mas_equalTo(146); - }]; - - [self.pageButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.right.mas_equalTo(-15); - make.width.mas_equalTo(35); - make.height.mas_equalTo(16); - make.bottom.mas_equalTo(self.signBackView.mas_top).offset(-13); - }]; - - [self.signBackView mas_makeConstraints:^(MASConstraintMaker *make) { - make.height.mas_equalTo(79); - make.left.right.mas_equalTo(self.userInfoView); - make.top.mas_equalTo(self.usershadowImageView.mas_bottom).offset(-15); - }]; - - [self.lineView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.right.mas_equalTo(self.userInfoView).inset(15); - make.bottom.mas_equalTo(self.userInfoView); - make.height.mas_equalTo(1); - }]; - - [self.nobleImageView mas_makeConstraints:^(MASConstraintMaker *make) { + [self.cycleScrollView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.mas_equalTo(self); + make.height.mas_equalTo(245); + }]; + + [self.coverImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.cycleScrollView); + }]; + [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.left.right.equalTo(self.cycleScrollView); + make.height.mas_equalTo(25); + }]; + [self.reviewIcon mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.right.mas_equalTo(self); + make.width.mas_equalTo(85); + make.height.mas_equalTo(50); + }]; + + [self.userInfoView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self); + make.bottom.mas_equalTo(self); + make.height.mas_greaterThanOrEqualTo(133); + }]; + + [self.usershadowImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(15); + make.right.mas_equalTo(-15); + make.top.height.mas_equalTo(self.userInfoView); + }]; + + [self.avatarView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(88); + make.left.mas_equalTo(30); + make.top.equalTo(self.userInfoView.mas_top).mas_offset(-28); + }]; + [self.onlineView mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.equalTo(self.avatarView); + make.width.mas_equalTo(84); + make.left.mas_equalTo(4); + make.height.mas_equalTo(22); + + }]; + [self.onlineIconView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(18); + make.top.mas_equalTo(3); + make.width.mas_equalTo(12); + make.height.mas_equalTo(12); + }]; + [self.onlineTitleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(self.onlineIconView); + make.left.mas_equalTo(32); + make.height.mas_equalTo(14); + }]; + [self.onlineButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.onlineView); + }]; + + [self.pageButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.mas_equalTo(-15); + make.width.mas_equalTo(42); + make.height.mas_equalTo(22); + make.bottom.mas_equalTo(self.userInfoView.mas_top).offset(-8); + }]; + + + +// [self.lineView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.left.right.mas_equalTo(self.userInfoView).inset(15); +// make.bottom.mas_equalTo(self.userInfoView); +// make.height.mas_equalTo(1); +// }]; + + [self.nickStackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.usershadowImageView).offset(115); + make.top.mas_equalTo(self.usershadowImageView).offset(11); + make.right.lessThanOrEqualTo(@(-15)); + }]; + + [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(25); + }]; + + [self.sexImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(14, 14)); + }]; + + + + [self.idStackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.nickStackView); + make.top.mas_equalTo(self.nickStackView.mas_bottom).offset(4); + make.right.mas_equalTo(-15); + }]; + + [self.beautifulImageViw mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(15, 15)); + }]; + + [self.spaceView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.greaterThanOrEqualTo(@10); + make.height.mas_equalTo(15); + }]; + + + + + [self.tagStackView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(self.usershadowImageView).offset(15); - make.top.mas_equalTo(self.usershadowImageView).offset(50); + + make.top.mas_equalTo(self.userInfoView).offset(68); + make.right.lessThanOrEqualTo(@70); + make.height.mas_equalTo(25); + }]; + + [self.experImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(25); + }]; + + [self.charmImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(25); + }]; + + [self.newUserImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.width.height.mas_equalTo(20); }]; - [self.nickStackView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.mas_equalTo(self.nobleImageView.mas_right).mas_offset(5); - make.centerY.mas_equalTo(self.nobleImageView); - }]; - - [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.height.mas_equalTo(20); - }]; - - [self.sexImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.size.mas_equalTo(CGSizeMake(15, 15)); - }]; - - [self.onlineButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.size.mas_equalTo(CGSizeMake(55, 18)); - }]; - - [self.idStackView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.mas_equalTo(self.nobleImageView); - make.top.mas_equalTo(self.nickStackView.mas_bottom).offset(5); - }]; - - [self.beautifulImageViw mas_makeConstraints:^(MASConstraintMaker *make) { - make.size.mas_equalTo(CGSizeMake(15, 15)); - }]; + + [self.officalImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(20); + }]; + + [self.namePlateView mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(20); + make.width.mas_equalTo(self.nameplateImageView.mas_width); + }]; + + + [self.nameplateImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(20); + make.width.mas_equalTo(60); + make.left.top.mas_equalTo(self.namePlateView); + }]; + + [self.nameplateLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.bottom.mas_equalTo(self.nameplateImageView); + make.right.mas_equalTo(self.namePlateView).offset(-2); + }]; + [self.singStackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(15); + make.top.mas_equalTo(103); + make.right.mas_equalTo(-15); + + + }]; + [self.tagView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.equalTo(self.singStackView); + make.height.mas_equalTo(20); + }]; + [self.signBackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_greaterThanOrEqualTo(10); + make.left.right.equalTo(self.singStackView); + make.bottom.equalTo(self.userInfoView.mas_bottom).mas_offset(-17); + }]; + [self.signLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.signBackView); + }]; + + + [self.soundView mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.mas_equalTo(-15); + make.width.mas_equalTo(98); + make.height.mas_equalTo(28); + make.centerY.equalTo(self.tagStackView); + }]; + + [self.palySoundBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(18); + make.top.mas_equalTo(5); + make.left.mas_equalTo(4); + }]; + [self.soundSVGAView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(27); + make.width.mas_equalTo(35); + make.height.mas_equalTo(19); + make.centerY.equalTo(self.soundView); + + }]; + [self.soundTimeView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(67); + make.centerY.equalTo(self.soundView); + }]; + + [self.soundPromptView mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.mas_equalTo(-8); + make.centerY.equalTo(self.soundView); + }]; + [self.toSoundBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.soundView); + }]; + + [self.usershadowImageView.superview layoutIfNeeded]; + - [self.copysIdImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.size.mas_equalTo(CGSizeMake(14, 14)); - }]; - - [self.spaceView mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.mas_equalTo(12); - make.height.mas_equalTo(15); - }]; - - [self.tagStackView mas_makeConstraints:^(MASConstraintMaker *make) { -// make.left.mas_equalTo(self.usershadowImageView).offset(15); - make.left.mas_equalTo(self.nobleImageView); - make.top.mas_equalTo(self.beautifulImageViw.mas_bottom).offset(5); - make.height.mas_equalTo(25); - }]; - - [self.experImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.height.mas_equalTo(25); - }]; - - [self.charmImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.height.mas_equalTo(25); - }]; - - [self.newUserImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.height.mas_equalTo(20); - }]; - - [self.officalImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.height.mas_equalTo(20); - }]; - - [self.namePlateView mas_makeConstraints:^(MASConstraintMaker *make) { - make.height.mas_equalTo(20); - make.width.mas_equalTo(self.nameplateImageView.mas_width); - }]; - - - [self.nameplateImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.height.mas_equalTo(20); - make.width.mas_equalTo(60); - make.left.top.mas_equalTo(self.namePlateView); - }]; - - [self.nameplateLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.bottom.mas_equalTo(self.nameplateImageView); - make.right.mas_equalTo(self.namePlateView).offset(-2); - }]; - - [self.signLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.mas_equalTo(self.signBackView).offset(10); - make.right.mas_equalTo(self.signBackView).offset(10); - make.top.mas_equalTo(self.signBackView).offset(23); - }]; } #pragma mark - SDPhotoBrowserDelegate - (NSURL *)photoBrowser:(SDPhotoBrowser *)browser highQualityImageURLForIndex:(NSInteger)index { - NSString * photoUrl = [self.imageUrls safeObjectAtIndex1:index]; - return [NSURL URLWithString:photoUrl]; + if(browser.isAvatar == YES){ + return [NSURL URLWithString:self.avatarView.imageUrl]; + } + NSString * photoUrl = [self.imageUrls objectAtIndex:index]; + return [NSURL URLWithString:photoUrl]; } - (UIImage *)photoBrowser:(SDPhotoBrowser *)browser placeholderImageForIndex:(NSInteger)index { - return [UIImageConstant defalutBannerPlaceholder]; + return [UIImageConstant defalutBannerPlaceholder]; } #pragma mark - SDCycleScrollViewDelegate -(void)cycleScrollView:(SDCycleScrollView *)cycleScrollView didScrollToIndex:(NSInteger)index { - [self.pageButton setTitle:[NSString stringWithFormat:@"%ld/%lu",(index + 1), (unsigned long)self.imageUrls.count] forState:UIControlStateNormal]; - UserPhoto * photo = [self.userPhtotArray safeObjectAtIndex1:index]; - self.reviewIcon.hidden = !photo.isReview; + [self.pageButton setTitle:[NSString stringWithFormat:@"%ld/%lu",(index + 1), (unsigned long)self.imageUrls.count] forState:UIControlStateNormal]; + UserPhoto * photo = [self.userPhtotArray objectAtIndex:index]; + self.reviewIcon.hidden = !photo.isReview; } // 轮播图点击 - (void)cycleScrollView:(SDCycleScrollView *)cycleScrollView didSelectItemAtIndex:(NSInteger)index { - NSInteger count = self.imageUrls.count; - SDPhotoBrowser *browser = [[SDPhotoBrowser alloc]init]; - browser.sourceImagesContainerView = self.pi_BannerView; - browser.delegate = self; - browser.imageCount = count; - browser.currentImageIndex = index; - browser.isMe = NO; - [browser show]; + NSInteger count = self.imageUrls.count; + SDPhotoBrowser *browser = [[SDPhotoBrowser alloc]init]; + browser.sourceImagesContainerView = self.cycleScrollView; + browser.delegate = self; + browser.imageCount = count; + browser.currentImageIndex = index; + browser.isMe = NO; + [browser show]; +} +///复制id +-(void)copyNameAction{ + [XNDJTDDLoadingTool showSuccessWithMessage:YMLocalizedString(@"XPMineUserInfoHeaderView0")]; + UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; + pasteboard. string = [NSString stringWithFormat:@"%ld", (long)_userInfo.erbanNo]; +} +-(void)toSoundAction{ + if(self.soundTimeView.hidden == NO){ + [self playSoundAction]; + return; + } + if(self.delegate && [self.delegate respondsToSelector:@selector(didClickGoToPlaySound)]){ + [self.delegate didClickGoToPlaySound]; + } +} +-(void)setPlaySoundStatus:(BOOL)isPlay{ + self.palySoundBtn.selected = isPlay; + if(self.palySoundBtn.selected == YES){ + [self.soundSVGAView startAnimation]; + }else{ + [self.soundSVGAView stopAnimation]; + self.soundTimeView.text = [NSString stringWithFormat:@"%ld\"",_soundModel.second]; + } +} +-(void)setPlaySoundTime:(NSInteger)time{ + self.soundTimeView.text = [NSString stringWithFormat:@"%ld\"",time]; +} +#pragma mark - XPMineUserInfoHeaderTagView +- (void)didClickGotoIvidualView{ + if(self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoHeaderView:didClickGotoEditView:)]){ + [self.delegate xPMineUserInfoHeaderView:self didClickGotoEditView:self.tagView.itemList]; + } +} +- (void)didClickGotoEditVC{ + if(self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoHeaderView:didClickGotoEditVC:)]){ + [self.delegate xPMineUserInfoHeaderView:self didClickGotoEditVC:self.tagView.itemList]; + } } - #pragma mark - Event Response -- (void)onlineButtonAction:(UIButton *)sender { - if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoHeaderView:didClickGoToRoom:)]) { - [self.delegate xPMineUserInfoHeaderView:self didClickGoToRoom:self.roomUid]; - } +-(void)clickAvatarAction{ + + SDPhotoBrowser *browser = [[SDPhotoBrowser alloc]init]; + browser.sourceImagesContainerView = self.avatarView; + browser.delegate = self; + browser.imageCount = 1; + browser.currentImageIndex = 0; + browser.isMe = NO; + browser.isAvatar = YES; + [browser show]; } - -- (void)copysIdRecognizer { - [UIPasteboard generalPasteboard].string = [NSString stringWithFormat:@"%ld", self.userInfo.erbanNo]; - [XNDJTDDLoadingTool showSuccessWithMessage:YMLocalizedString(@"XPMineUserInfoHeaderView0")]; - [StatisticsServiceHelper trackEventWithKey:StatisticsServiceEventID_mydata_copyid_click]; +- (void)onlineButtonAction:(UIButton *)sender { + if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoHeaderView:didClickGoToRoom:)]) { + [self.delegate xPMineUserInfoHeaderView:self didClickGoToRoom:self.roomUid]; + } +} +-(void)playSoundAction{ + self.palySoundBtn.selected = !self.palySoundBtn.selected; + if(self.palySoundBtn.selected == YES){ + [self.soundSVGAView startAnimation]; + }else{ + [self.soundSVGAView stopAnimation]; + } + if(self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoHeaderView:didClickPlaySound:)]){ + [self.delegate xPMineUserInfoHeaderView:self didClickPlaySound:self.palySoundBtn.selected]; + } } #pragma mark - Getters And Setters -- (void)setUserInfo:(UserInfoModel *)userInfo { - _userInfo = userInfo; - if (_userInfo) { - self.nameLabel.text = _userInfo.nick; - self.idLabel.text = [NSString stringWithFormat:@"ID:%ld", (long)_userInfo.erbanNo]; - self.signLabel.text = _userInfo.userDesc.length > 0 ? _userInfo.userDesc : YMLocalizedString(@"XPMineUserInfoHeaderView1"); - self.fansNumLabel.text =[NSString stringWithFormat:YMLocalizedString(@"XPMineUserInfoHeaderView2"), _userInfo.fansNum]; - self.sexImageView.image = userInfo.gender == GenderType_Female ? [UIImage imageNamed:@"common_female"] : [UIImage imageNamed:@"common_male"]; - self.officalImageView.hidden = userInfo.defUser != UserLevelType_Offical; - self.beautifulImageViw.hidden = !userInfo.hasPrettyErbanNo; - self.newUserImageView.hidden = !userInfo.newUser; - self.nobleImageView.imageUrl = userInfo.userVipInfoVO.vipIcon; - UIImage *nobleImage = self.nobleImageView.image; - if (nobleImage) { - CGFloat scale = nobleImage.size.width / nobleImage.size.height; - [self.nobleImageView mas_updateConstraints:^(MASConstraintMaker *make) { - make.size.mas_equalTo(CGSizeMake(20* scale, 20)); - }]; - [self.nickStackView mas_updateConstraints:^(MASConstraintMaker *make) { - make.left.mas_equalTo(self.nobleImageView.mas_right).mas_offset(5); - }]; - } else { - [self.nobleImageView mas_updateConstraints:^(MASConstraintMaker *make) { - make.size.mas_equalTo(CGSizeMake(0, 20)); - }]; - [self.nickStackView mas_updateConstraints:^(MASConstraintMaker *make) { - make.left.mas_equalTo(self.nobleImageView.mas_right); - }]; + +-(void)setSoundModel:(XPSoundCardModel *)soundModel{ + _soundModel = soundModel; + if(_soundModel != nil){ + if(_soundModel.status == 2){ + _soundView.hidden = NO; + _soundTimeView.hidden = NO; + _soundSVGAView.hidden = NO; + _soundPromptView.hidden = YES; + _soundTimeView.text = [NSString stringWithFormat:@"%ld\"",_soundModel.second]; + return; } - if (userInfo.userLevelVo.experUrl) { - self.experImageView.imageUrl = userInfo.userLevelVo.experUrl; - } - self.experImageView.hidden = userInfo.userLevelVo.experUrl.length <= 0; - - if (userInfo.userLevelVo.charmUrl) { - self.charmImageView.imageUrl = userInfo.userLevelVo.charmUrl; - } - self.charmImageView.hidden = userInfo.userLevelVo.charmUrl.length <= 0; - - if (userInfo.nameplateWord.length>0 && userInfo.nameplatePic.length>0) { - self.nameplateImageView.imageUrl = userInfo.nameplatePic; - self.nameplateLabel.text = userInfo.nameplateWord; - self.namePlateView.hidden = NO; - } else { - self.namePlateView.hidden = YES; - } - [self.userPhtotArray removeAllObjects]; - self.copysIdImageView.hidden = NO; - // 轮播图 - NSMutableArray * imageUrls = [NSMutableArray array]; - if (userInfo.avatar) { - [imageUrls addObject:userInfo.avatar]; - if (![self.userPhtotArray containsObject:self.avatarPhoto]) { - [self.userPhtotArray addObject:self.avatarPhoto]; - } - self.avatarPhoto.isReview = userInfo.isReview; - self.avatarPhoto.photoUrl = userInfo.avatar; - } - if (self.userInfo.privatePhoto.count > 0) { - for (int i = 0; i < self.userInfo.privatePhoto.count; i++) { - UserPhoto * photo = [self.userInfo.privatePhoto safeObjectAtIndex1:i]; - if (photo.photoUrl.length > 0) { - [self.userPhtotArray addObject:photo]; - [imageUrls addObject:photo.photoUrl]; - } - } - } - - if (imageUrls.count > 0) { - self.imageUrls = imageUrls; - self.pi_BannerView.imageURLStringsGroup = imageUrls; - [self.pageButton setTitle:[NSString stringWithFormat:@"1/%lu",(unsigned long)imageUrls.count] forState:UIControlStateNormal];; - // 要初始化一下当前的审核状态 - self.reviewIcon.hidden = ![self.userPhtotArray objectAtIndex:0].isReview; - } - } + if(_soundModel.uid.integerValue == [[AccountInfoStorage instance] getUid].integerValue){ + _soundView.hidden = NO; + _soundPromptView.hidden = NO; + _soundTimeView.hidden = YES; + _soundSVGAView.hidden = YES; + } + + return; + } + + if(_soundModel.uid.integerValue == [[AccountInfoStorage instance] getUid].integerValue){ + _soundView.hidden = NO; + _soundPromptView.hidden = NO; + _soundTimeView.hidden = YES; + _soundSVGAView.hidden = YES; + return; + } + _soundView.hidden = YES; + _soundTimeView.text = [NSString stringWithFormat:@"%d\"",0]; + + +} +- (void)setUserInfo:(UserInfoModel *)userInfo { + _userInfo = userInfo; + if (_userInfo) { + self.nameLabel.text = _userInfo.nick; + NSString *text = [NSString stringWithFormat:@"ID:%ld", (long)_userInfo.erbanNo]; + NSMutableAttributedString *textAtt = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@ ",text] attributes:@{NSForegroundColorAttributeName:self.idLabel.textColor}]; + NSTextAttachment * attachment = [[NSTextAttachment alloc] init]; + UIImage *iconImage = [UIImage imageNamed:@"user_card_copy_id1"];; + attachment.bounds = CGRectMake(0, roundf(self.idLabel.font.capHeight - iconImage.size.height)/2.f, iconImage.size.width, iconImage.size.height); + attachment.image = iconImage; + [textAtt insertAttributedString:[NSMutableAttributedString attributedStringWithAttachment:attachment] atIndex:textAtt.length]; + self.idLabel.attributedText = textAtt; + + + self.signLabel.text = _userInfo.userDesc.length > 0 ? _userInfo.userDesc : YMLocalizedString(@"XPMineUserInfoHeaderView0"); + self.fansNumLabel.text =[NSString stringWithFormat:YMLocalizedString(@"XPMineUserInfoHeaderView2"), _userInfo.fansNum]; + self.sexImageView.image = userInfo.gender == GenderType_Female ? [UIImage imageNamed:@"common_female"] : [UIImage imageNamed:@"common_male"]; + self.officalImageView.hidden = userInfo.defUser != UserLevelType_Offical; + self.beautifulImageViw.hidden = !userInfo.hasPrettyErbanNo; + self.newUserImageView.hidden = !userInfo.newUser; + if (userInfo.userLevelVo.experUrl) { + self.experImageView.imageUrl = userInfo.userLevelVo.experUrl; + } + self.experImageView.hidden = userInfo.userLevelVo.experUrl.length <= 0; + + if (userInfo.userLevelVo.charmUrl) { + self.charmImageView.imageUrl = userInfo.userLevelVo.charmUrl; + } + self.charmImageView.hidden = userInfo.userLevelVo.charmUrl.length <= 0; + + if (userInfo.nameplateWord.length>0 && userInfo.nameplatePic.length>0) { + self.nameplateImageView.imageUrl = userInfo.nameplatePic; + self.nameplateLabel.text = userInfo.nameplateWord; + self.namePlateView.hidden = NO; + } else { + self.namePlateView.hidden = YES; + } + [self.userPhtotArray removeAllObjects]; + // 轮播图 + NSMutableArray * imageUrls = [NSMutableArray array]; + if (userInfo.avatar) { + [imageUrls addObject:userInfo.avatar]; + if (![self.userPhtotArray containsObject:self.avatarPhoto]) { + [self.userPhtotArray addObject:self.avatarPhoto]; + } + self.avatarPhoto.isReview = userInfo.isReview; + self.avatarPhoto.photoUrl = userInfo.avatar; + self.avatarView.imageUrl = userInfo.avatar; + } + if (self.userInfo.privatePhoto.count > 0) { + for (int i = 0; i < self.userInfo.privatePhoto.count; i++) { + UserPhoto * photo = [self.userInfo.privatePhoto objectAtIndex:i]; + if (photo.photoUrl.length > 0) { + [self.userPhtotArray addObject:photo]; + [imageUrls addObject:photo.photoUrl]; + } + } + } + + if (imageUrls.count > 0) { + self.imageUrls = imageUrls; + self.cycleScrollView.imageURLStringsGroup = imageUrls; + [self.pageButton setTitle:[NSString stringWithFormat:@"1/%lu",(unsigned long)imageUrls.count] forState:UIControlStateNormal];; + // 要初始化一下当前的审核状态 + if(self.userPhtotArray.count > 0){ + self.reviewIcon.hidden = ![self.userPhtotArray objectAtIndex:0].isReview; + } + } + } } - (void)setRoomUid:(NSString *)roomUid { - _roomUid = roomUid; - self.onlineButton.hidden = _roomUid.length <= 0; + _roomUid = roomUid; + if([XPSkillCardPlayerManager shareInstance].isInRoom == YES || [[XPRoomMiniManager shareManager] getRoomInfo] != nil){ + self.onlineView.hidden = _roomUid.length <= 0; + }else{ + self.onlineView.hidden = YES; + } + +} +-(void)setTagModel:(XPMineUserInfoTagModel *)tagModel{ + _tagModel = tagModel; + NSMutableArray *itemList = [NSMutableArray array]; + for (NSString *text in _tagModel.meLabels) { + if(text.length > 0){ + XPMineUserInfoTagItemModel *model = [XPMineUserInfoTagItemModel new]; + model.label = text; + CGRect stringRect = [text boundingRectWithSize:CGSizeMake(MAXFLOAT, 18) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:10 weight:UIFontWeightRegular]} context:nil]; + model.width = stringRect.size.width + 14; + [itemList addObject:model]; + } + } + NSString *uid = [[AccountInfoStorage instance]getUid]; + BOOL isMe = self.userInfo.uid == uid.integerValue; + if(isMe == YES){ + _tagView.hidden = NO; + }else{ + _tagView.hidden = !(itemList.count > 0); + } + _tagView.uid = @(self.userInfo.uid).stringValue; + _tagView.itemList = itemList; + } - - (UIImageView *)coverImageView { - if (!_coverImageView) { - _coverImageView = [[UIImageView alloc] init]; - _coverImageView.userInteractionEnabled = NO; - _coverImageView.image = [UIImage imageNamed:@"mine_userinfo_header_shadow_bg"]; - } - return _coverImageView; + if (!_coverImageView) { + _coverImageView = [[UIImageView alloc] init]; + _coverImageView.userInteractionEnabled = NO; + _coverImageView.image = [UIImage imageNamed:@"mine_userinfo_header_shadow_bg"]; + + } + return _coverImageView; } - (UIView *)userInfoView { - if (!_userInfoView) { - _userInfoView = [[UIView alloc] init]; - _userInfoView.backgroundColor = [UIColor clearColor]; - _userInfoView.layer.masksToBounds = YES; - _userInfoView.layer.cornerRadius = 12; - } - return _userInfoView; + if (!_userInfoView) { + _userInfoView = [[UIView alloc] init]; + _userInfoView.backgroundColor = [UIColor clearColor]; + _userInfoView.layer.masksToBounds = YES; + _userInfoView.layer.cornerRadius = 12; + } + return _userInfoView; } - (UIImageView *)usershadowImageView { - if (!_usershadowImageView) { - _usershadowImageView = [[UIImageView alloc] init]; - _usershadowImageView.userInteractionEnabled = YES; - } - return _usershadowImageView; -} - -- (NetImageView *)nobleImageView { - if (!_nobleImageView) { - _nobleImageView = [[NetImageView alloc] init]; + if (!_usershadowImageView) { + _usershadowImageView = [[UIImageView alloc] init]; + _usershadowImageView.userInteractionEnabled = YES; + _usershadowImageView.backgroundColor = [UIColor whiteColor]; + _usershadowImageView.layer.cornerRadius = 13; + _usershadowImageView.layer.masksToBounds = YES; } - return _nobleImageView; + return _usershadowImageView; } - (UIStackView *)nickStackView { - if (!_nickStackView) { - _nickStackView = [[UIStackView alloc] init]; - _nickStackView.axis = UILayoutConstraintAxisHorizontal; - _nickStackView.distribution = UIStackViewDistributionFill; - _nickStackView.alignment = UIStackViewAlignmentCenter; - _nickStackView.spacing = 10; - } - return _nickStackView; + if (!_nickStackView) { + _nickStackView = [[UIStackView alloc] init]; + _nickStackView.axis = UILayoutConstraintAxisHorizontal; + _nickStackView.distribution = UIStackViewDistributionFill; + _nickStackView.alignment = UIStackViewAlignmentCenter; + _nickStackView.spacing = 5; + } + return _nickStackView; } - (UILabel *)nameLabel { - if (!_nameLabel) { - _nameLabel = [[UILabel alloc] init]; - _nameLabel.font = [UIFont fontWithName:@"PingFang-SC-Medium" size:15]; - _nameLabel.textColor = [UIColor whiteColor]; - } - return _nameLabel; + if (!_nameLabel) { + _nameLabel = [[UILabel alloc] init]; + _nameLabel.font = [UIFont fontWithName:@"PingFang-SC-Medium" size:18]; + _nameLabel.textColor = UIColorFromRGB(0x1F1A4E); + + + } + return _nameLabel; } - (UIImageView *)sexImageView { - if (!_sexImageView) { - _sexImageView = [[UIImageView alloc] init]; - _sexImageView.userInteractionEnabled = YES; - } - return _sexImageView; + if (!_sexImageView) { + _sexImageView = [[UIImageView alloc] init]; + _sexImageView.userInteractionEnabled = YES; + } + return _sexImageView; } - (UIStackView *)idStackView { - if (!_idStackView) { - _idStackView = [[UIStackView alloc] init]; - _idStackView.axis = UILayoutConstraintAxisHorizontal; - _idStackView.distribution = UIStackViewDistributionFill; - _idStackView.alignment = UIStackViewAlignmentCenter; - _idStackView.spacing = 3; - } - return _idStackView; + if (!_idStackView) { + _idStackView = [[UIStackView alloc] init]; + _idStackView.axis = UILayoutConstraintAxisHorizontal; + _idStackView.distribution = UIStackViewDistributionFill; + _idStackView.alignment = UIStackViewAlignmentCenter; + _idStackView.spacing = 5; + } + return _idStackView; } - (UIImageView *)beautifulImageViw { - if (!_beautifulImageViw) { - _beautifulImageViw = [[UIImageView alloc] init]; - _beautifulImageViw.userInteractionEnabled = YES; - _beautifulImageViw.image = [UIImage imageNamed:@"common_icon_beautiful"]; - } - return _beautifulImageViw; + if (!_beautifulImageViw) { + _beautifulImageViw = [[UIImageView alloc] init]; + _beautifulImageViw.userInteractionEnabled = YES; + _beautifulImageViw.image = [UIImage imageNamed:@"common_icon_beautiful"]; + } + return _beautifulImageViw; } - (UILabel *)fansNumLabel { - if (!_fansNumLabel) { - _fansNumLabel = [[UILabel alloc] init]; - _fansNumLabel.font = [UIFont systemFontOfSize:12]; - _fansNumLabel.textColor = [UIColor whiteColor]; - } - return _fansNumLabel; + if (!_fansNumLabel) { + _fansNumLabel = [[UILabel alloc] init]; + _fansNumLabel.font = [UIFont systemFontOfSize:12 weight:UIFontWeightRegular]; + _fansNumLabel.textColor = UIColorFromRGB(0x6D6B89); + } + return _fansNumLabel; } - (UIView *)spaceView { - if (!_spaceView) { - _spaceView = [[UIView alloc] init]; - _spaceView.backgroundColor = [UIColor clearColor]; - } - return _spaceView; + if (!_spaceView) { + _spaceView = [[UIView alloc] init]; + _spaceView.backgroundColor = [UIColor clearColor]; + } + return _spaceView; } - (UILabel *)idLabel { - if (!_idLabel) { - _idLabel = [[UILabel alloc] init]; - _idLabel.font = [UIFont systemFontOfSize:11]; - _idLabel.textColor = [UIColor whiteColor]; - _idLabel.userInteractionEnabled = YES; - UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(copysIdRecognizer)]; - [_idLabel addGestureRecognizer:tap]; - } - return _idLabel; + if (!_idLabel) { + _idLabel = [[UILabel alloc] init]; + _idLabel.font = [UIFont systemFontOfSize:12 weight:UIFontWeightRegular]; + _idLabel.textColor = UIColorFromRGB(0x6D6B89); + _idLabel.userInteractionEnabled = YES; + UITapGestureRecognizer *longPress = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(copyNameAction)]; + [_idLabel addGestureRecognizer:longPress]; + } + return _idLabel; +} +-(UIImageView *)onlineView{ + if (!_onlineView){ + _onlineView = [UIImageView new]; + UIImage *image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor],[DJDKMIMOMColor confirmButtonGradientMiddleColor],[DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:1 imgSize:CGSizeMake(84, 22)]; + _onlineView.image = image; + _onlineView.userInteractionEnabled = YES; + _onlineView.hidden = YES; + + } + return _onlineView; } +- (SVGAImageView *)onlineIconView { + if (_onlineIconView == nil) { + _onlineIconView = [[SVGAImageView alloc]init]; + _onlineIconView.contentMode = UIViewContentModeScaleToFill; + _onlineIconView.userInteractionEnabled = NO; + _onlineIconView.backgroundColor = [UIColor clearColor]; + } + return _onlineIconView; +} + + +-(UILabel *)onlineTitleView{ + if (!_onlineTitleView){ + _onlineTitleView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserInfoHeaderView3") font:[UIFont systemFontOfSize:11 weight:UIFontWeightRegular] textColor:[UIColor whiteColor]]; + } + return _onlineTitleView; +} - (UIButton *)onlineButton { - if (!_onlineButton) { - _onlineButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_onlineButton setTitle:YMLocalizedString(@"XPMineUserInfoHeaderView3") forState:UIControlStateNormal]; - [_onlineButton setTitleColor:[DJDKMIMOMColor confirmButtonTextColor] forState:UIControlStateNormal]; - _onlineButton.titleLabel.font = [UIFont systemFontOfSize:12]; - [_onlineButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor], [DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateNormal]; - _onlineButton.layer.masksToBounds = YES; - _onlineButton.layer.cornerRadius = 10; - [_onlineButton addTarget:self action:@selector(onlineButtonAction:) forControlEvents:UIControlEventTouchUpInside]; - } - return _onlineButton; + if (!_onlineButton) { + _onlineButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_onlineButton addTarget:self action:@selector(onlineButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + [_onlineButton setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; + } + return _onlineButton; } -- (SDCycleScrollView *)pi_BannerView{ - if (!_pi_BannerView) { - _pi_BannerView = [SDCycleScrollView cycleScrollViewWithFrame:CGRectZero delegate:self placeholderImage:[UIImageConstant defalutBannerPlaceholder]]; - _pi_BannerView.backgroundColor = [UIColor clearColor]; - _pi_BannerView.bannerImageViewContentMode = UIViewContentModeScaleAspectFill; - _pi_BannerView.pageControlStyle = SDCycleScrollViewPageContolStyleNone; - _pi_BannerView.autoScroll = NO; - } - return _pi_BannerView; +- (SDCycleScrollView *)cycleScrollView { + if (!_cycleScrollView) { + _cycleScrollView = [SDCycleScrollView cycleScrollViewWithFrame:CGRectZero delegate:self placeholderImage:[UIImageConstant defalutBannerPlaceholder]]; + _cycleScrollView.backgroundColor = [UIColor clearColor]; + _cycleScrollView.bannerImageViewContentMode = UIViewContentModeScaleAspectFill; + _cycleScrollView.pageControlStyle = SDCycleScrollViewPageContolStyleNone; + _cycleScrollView.autoScroll = NO; + } + return _cycleScrollView; } - (UIButton *)pageButton { - if (!_pageButton) { - _pageButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_pageButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - _pageButton.titleLabel.font = [UIFont systemFontOfSize:10]; - [_pageButton setBackgroundImage:[UIImage imageNamed:@"mine_user_info_header_page_bg"] forState:UIControlStateNormal]; - } - return _pageButton; + if (!_pageButton) { + _pageButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_pageButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + _pageButton.titleLabel.font = [UIFont systemFontOfSize:12 weight:UIFontWeightRegular]; + _pageButton.backgroundColor = UIColorRGBAlpha(0x000000, 0.4); + _pageButton.layer.cornerRadius = 11; + _pageButton.layer.masksToBounds = YES; + + } + return _pageButton; } - (UIImageView *)reviewIcon { - if (!_reviewIcon) { - _reviewIcon = [[UIImageView alloc] init]; - _reviewIcon.image = [UIImage imageNamed:@"mine_album_reviewing"]; - _reviewIcon.hidden = YES; - } - return _reviewIcon; + if (!_reviewIcon) { + _reviewIcon = [[UIImageView alloc] init]; + _reviewIcon.image = [UIImage imageNamed:@"mine_album_reviewing"]; + _reviewIcon.hidden = YES; + } + return _reviewIcon; } - (UIStackView *)tagStackView { - if (!_tagStackView) { - _tagStackView = [[UIStackView alloc] init]; - _tagStackView.axis = UILayoutConstraintAxisHorizontal; - _tagStackView.distribution = UIStackViewDistributionFill; - _tagStackView.alignment = UIStackViewAlignmentCenter; - _tagStackView.spacing = 2; - } - return _tagStackView; + if (!_tagStackView) { + _tagStackView = [[UIStackView alloc] init]; + _tagStackView.axis = UILayoutConstraintAxisHorizontal; + _tagStackView.distribution = UIStackViewDistributionFill; + _tagStackView.alignment = UIStackViewAlignmentCenter; + _tagStackView.spacing = 6; + } + return _tagStackView; } - (NetImageView *)experImageView { - if (!_experImageView) { - NetImageConfig * config = [[NetImageConfig alloc] init]; - config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; - config.imageType = ImageTypeUserCardLevel; - _experImageView = [[NetImageView alloc] initWithConfig:config]; - _experImageView.userInteractionEnabled = YES; - _experImageView.hidden = YES; - _experImageView.contentMode = UIViewContentModeScaleAspectFit; - } - return _experImageView; + if (!_experImageView) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserCardLevel; + _experImageView = [[NetImageView alloc] initWithConfig:config]; + _experImageView.userInteractionEnabled = YES; + _experImageView.hidden = YES; + _experImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _experImageView; } - (NetImageView *)charmImageView { - if (!_charmImageView) { - NetImageConfig * config = [[NetImageConfig alloc] init]; - config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; - config.imageType = ImageTypeUserCardLevel; - _charmImageView = [[NetImageView alloc] initWithConfig:config]; - _charmImageView.userInteractionEnabled = YES; - _charmImageView.hidden = YES; - _charmImageView.contentMode = UIViewContentModeScaleAspectFit; - } - return _charmImageView; + if (!_charmImageView) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserCardLevel; + _charmImageView = [[NetImageView alloc] initWithConfig:config]; + _charmImageView.userInteractionEnabled = YES; + _charmImageView.hidden = YES; + _charmImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _charmImageView; } - (NetImageView *)nobleIconImageView { - if (!_nobleIconImageView) { - NetImageConfig * config = [[NetImageConfig alloc] init]; - config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; - config.imageType = ImageTypeUserCardLevel; - _nobleIconImageView = [[NetImageView alloc] initWithConfig:config]; - _nobleIconImageView.contentMode = UIViewContentModeScaleAspectFit; - } - return _nobleIconImageView; + if (!_nobleIconImageView) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserCardLevel; + _nobleIconImageView = [[NetImageView alloc] initWithConfig:config]; + _nobleIconImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _nobleIconImageView; } - (UIView *)namePlateView { - if (!_namePlateView) { - _namePlateView = [[UIView alloc] init]; - _namePlateView.backgroundColor = [UIColor clearColor]; - _namePlateView.hidden = YES; - } - return _namePlateView; + if (!_namePlateView) { + _namePlateView = [[UIView alloc] init]; + _namePlateView.backgroundColor = [UIColor clearColor]; + _namePlateView.hidden = YES; + } + return _namePlateView; } - (NetImageView *)nameplateImageView { - if (!_nameplateImageView) { - NetImageConfig * config = [[NetImageConfig alloc] init]; - config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; - config.imageType = ImageTypeUserCardLevel; - _nameplateImageView = [[NetImageView alloc] initWithConfig:config]; - _nameplateImageView.userInteractionEnabled = YES; - _nameplateImageView.contentMode = UIViewContentModeScaleAspectFit; - } - return _nameplateImageView; + if (!_nameplateImageView) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserCardLevel; + _nameplateImageView = [[NetImageView alloc] initWithConfig:config]; + _nameplateImageView.userInteractionEnabled = YES; + _nameplateImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _nameplateImageView; } - (UILabel *)nameplateLabel { - if (!_nameplateLabel) { - _nameplateLabel = [[UILabel alloc] init]; - _nameplateLabel.font = [UIFont systemFontOfSize:10]; - _nameplateLabel.textAlignment = NSTextAlignmentCenter; - _nameplateLabel.textColor = [UIColor whiteColor]; - } - return _nameplateLabel; + if (!_nameplateLabel) { + _nameplateLabel = [[UILabel alloc] init]; + _nameplateLabel.font = [UIFont systemFontOfSize:10]; + _nameplateLabel.textAlignment = NSTextAlignmentCenter; + _nameplateLabel.textColor = [UIColor whiteColor]; + } + return _nameplateLabel; } - (UIImageView *)newUserImageView { - if (!_newUserImageView) { - _newUserImageView = [[UIImageView alloc] init]; - _newUserImageView.userInteractionEnabled = YES; - _newUserImageView.image = [UIImage imageNamed:@"common_new_user"]; - _newUserImageView.hidden = YES; - } - return _newUserImageView; + if (!_newUserImageView) { + _newUserImageView = [[UIImageView alloc] init]; + _newUserImageView.userInteractionEnabled = YES; + _newUserImageView.image = [UIImage imageNamed:@"common_new_user"]; + _newUserImageView.hidden = YES; + } + return _newUserImageView; } - (UIImageView *)officalImageView { - if (!_officalImageView) { - _officalImageView = [[UIImageView alloc] init]; - _officalImageView.userInteractionEnabled = YES; - _officalImageView.image = [UIImage imageNamed:@"common_offical"]; - _officalImageView.hidden = YES; - } - return _officalImageView; + if (!_officalImageView) { + _officalImageView = [[UIImageView alloc] init]; + _officalImageView.userInteractionEnabled = YES; + _officalImageView.image = [UIImage imageNamed:@"common_offical"]; + _officalImageView.hidden = YES; + } + return _officalImageView; } - (UIView *)signBackView { - if (!_signBackView) { - _signBackView = [[UIView alloc] init]; - _signBackView.backgroundColor = [DJDKMIMOMColor appBackgroundColor]; - CAShapeLayer * layer = [CAShapeLayer layer]; - layer.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, KScreenWidth, 79) byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(12, 12)].CGPath; - _signBackView.layer.mask = layer; - } - return _signBackView; + if (!_signBackView) { + _signBackView = [[UIView alloc] init]; + _signBackView.backgroundColor = [UIColor whiteColor]; + + } + return _signBackView; } -- (UIView *)lineView { - if (!_lineView) { - _lineView = [[UIView alloc] init]; - _lineView.backgroundColor = [DJDKMIMOMColor dividerColor]; - } - return _lineView; -} +//- (UIView *)lineView { +// if (!_lineView) { +// _lineView = [[UIView alloc] init]; +// _lineView.backgroundColor = [DJDKMIMOMColor dividerColor]; +// } +// return _lineView; +//} - (UILabel *)signLabel { - if (!_signLabel) { - _signLabel = [[UILabel alloc] init]; - _signLabel.font = [UIFont systemFontOfSize:12];; - _signLabel.textColor = [DJDKMIMOMColor secondTextColor]; - _signLabel.numberOfLines = 2; - } - return _signLabel; + if (!_signLabel) { + _signLabel = [[UILabel alloc] init]; + _signLabel.font = [UIFont systemFontOfSize:13 weight:UIFontWeightRegular];; + _signLabel.textColor = UIColorFromRGB(0xB3B3C3); + _signLabel.numberOfLines = 2; + + } + return _signLabel; } - (NSMutableArray *)userPhtotArray { - if (!_userPhtotArray) { - _userPhtotArray = [NSMutableArray array]; - } - return _userPhtotArray; + if (!_userPhtotArray) { + _userPhtotArray = [NSMutableArray array]; + } + return _userPhtotArray; } - (UserPhoto *)avatarPhoto { - if (!_avatarPhoto) { - _avatarPhoto = [[UserPhoto alloc] init]; - } - return _avatarPhoto; + if (!_avatarPhoto) { + _avatarPhoto = [[UserPhoto alloc] init]; + } + return _avatarPhoto; } - -- (UIImageView *)copysIdImageView { - if (!_copysIdImageView) { - _copysIdImageView = [[UIImageView alloc] init]; - _copysIdImageView.userInteractionEnabled = YES; - _copysIdImageView.image = [UIImage imageNamed:@"mine_user_id_copy_white"]; - _copysIdImageView.hidden = YES; - UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(copysIdRecognizer)]; - [_copysIdImageView addGestureRecognizer:tap]; - } - return _copysIdImageView; +-(NetImageView *)avatarView{ + if (!_avatarView){ + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserIcon; + _avatarView = [[NetImageView alloc]initWithConfig:config]; + _avatarView.layer.cornerRadius = 44; + _avatarView.layer.masksToBounds = YES; + _avatarView.layer.borderWidth = 1; + _avatarView.userInteractionEnabled = YES; + _avatarView.layer.borderColor = [UIColor whiteColor].CGColor; + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickAvatarAction)]; + [_avatarView addGestureRecognizer:tap]; + } + return _avatarView; +} +-(UIImageView *)bgView{ + if (!_bgView){ + _bgView = [UIImageView new]; + _bgView.image = [UIImage imageNamed:@"mine_userinfo_header_bg"]; + } + return _bgView; +} +- (UIImageView *)soundView{ + if (!_soundView){ + _soundView = [UIImageView new]; + UIImage *image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor],[DJDKMIMOMColor confirmButtonGradientMiddleColor],[DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(98, 28)]; + _soundView.image = image; + _soundView.layer.cornerRadius = 14; + _soundView.userInteractionEnabled = YES; + _soundView.layer.masksToBounds = YES; + _soundView.hidden = YES; + } + return _soundView; +} +- (UIButton *)palySoundBtn{ + if (!_palySoundBtn){ + _palySoundBtn = [UIButton new]; + [_palySoundBtn setBackgroundImage:kImage(@"mine_info_close") forState:UIControlStateNormal]; + [_palySoundBtn setBackgroundImage:kImage(@"mine_info_paly") forState:UIControlStateSelected]; + [_palySoundBtn setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; + [_palySoundBtn addTarget:self action:@selector(playSoundAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _palySoundBtn; +} +- (SVGAImageView *)soundSVGAView { + if (_soundSVGAView == nil) { + _soundSVGAView = [[SVGAImageView alloc]init]; + _soundSVGAView.contentMode = UIViewContentModeScaleToFill; + _soundSVGAView.userInteractionEnabled = NO; + _soundSVGAView.backgroundColor = [UIColor clearColor]; + } + return _soundSVGAView; +} +- (UILabel *)soundTimeView{ + if (!_soundTimeView){ + _soundTimeView = [UILabel labelInitWithText:@"0\"" font:[UIFont systemFontOfSize:14 weight:UIFontWeightMedium] textColor:[UIColor whiteColor]]; + } + return _soundTimeView; +} +- (UILabel *)soundPromptView{ + if (!_soundPromptView){ + _soundPromptView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserInfoHeaderView4") font:[UIFont systemFontOfSize:12 weight:UIFontWeightMedium] textColor:[UIColor whiteColor]]; + _soundPromptView.hidden = YES; + _soundPromptView.userInteractionEnabled = YES; + } + return _soundPromptView; +} +-(UIButton *)toSoundBtn{ + if (!_toSoundBtn){ + _toSoundBtn = [UIButton new]; + [_toSoundBtn addTarget:self action:@selector(toSoundAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _toSoundBtn; +} +-(XPMineUserInfoHeaderTagView *)tagView{ + if (!_tagView){ + _tagView = [[XPMineUserInfoHeaderTagView alloc]initWithFrame:CGRectZero]; + _tagView.delegate = self; + } + return _tagView; +} +- (UIStackView *)singStackView { + if (!_singStackView) { + _singStackView = [[UIStackView alloc] init]; + _singStackView.axis = UILayoutConstraintAxisVertical; + _singStackView.distribution = UIStackViewDistributionFill; + _singStackView.alignment = UIStackViewAlignmentCenter; + _singStackView.spacing = 11; + } + return _singStackView; } - @end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoIndividualTagView.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoIndividualTagView.h new file mode 100644 index 00000000..d8f6b75a --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoIndividualTagView.h @@ -0,0 +1,26 @@ +// +// XPMineUserInfoIndividualTagView.h +// xplan-ios +// +// Created by duoban on 2023/2/16. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@protocol XPMineUserInfoIndividualTagViewDelegate + +- (void)didClickGotoEditVC; + + +@end + +@interface XPMineUserInfoIndividualTagView : UIView +@property (nonatomic,strong) NSMutableArray *itemList; +/// +@property (nonatomic,copy) NSString *uid; +/// +@property (nonatomic,weak) id delegate; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoIndividualTagView.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoIndividualTagView.m new file mode 100644 index 00000000..ec541de5 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoIndividualTagView.m @@ -0,0 +1,184 @@ +// +// XPMineUserInfoIndividualTagView.m +// xplan-ios +// +// Created by duoban on 2023/2/16. +// +#import "XPMineUserInfoTagFlowLayout.h" +#import "XPMineUserInfoHeaderTagCell.h" +#import "XPMineUserInfoTagModel.h" +#import "XPMineUserInfoIndividualTagView.h" +@interface XPMineUserInfoIndividualTagView() + + +@property (nonatomic,strong) UICollectionView *collectionView; +///标题 +@property (nonatomic,strong) UILabel *titleView; +///返回按钮 +@property (nonatomic,strong) UIButton *backBtn; +///编辑按钮 +@property (nonatomic,strong) UIButton *editBtn; +///背景 +@property (nonatomic,strong) UIView *bgView; +///容器 +@property (nonatomic,strong) UIStackView *stackView; + +@end +@implementation XPMineUserInfoIndividualTagView + +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} +-(void)setUid:(NSString *)uid{ + _uid = uid; + BOOL isMe = [[[AccountInfoStorage instance]getUid]isEqualToString:_uid]; + _editBtn.hidden = !isMe; + _titleView.text = isMe ? YMLocalizedString(@"XPMineUserInfoIndividualTagView1"):YMLocalizedString(@"XPMineUserInfoIndividualTagView0"); +} +#pragma mark - Private Method +- (void)initSubViews { + + [self addSubview:self.bgView]; + [self.bgView addSubview:self.backBtn]; + [self.bgView addSubview:self.titleView]; + [self.bgView addSubview:self.stackView]; + [self.stackView addArrangedSubview:self.collectionView]; + [self.stackView addArrangedSubview:self.editBtn]; +} +- (void)initSubViewConstraints { + [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(kGetScaleWidth(310)); + make.height.mas_equalTo(kGetScaleWidth(220)); + make.center.equalTo(self); + }]; + [self.backBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(22)); + make.top.mas_equalTo(kGetScaleWidth(10)); + make.right.mas_equalTo(-kGetScaleWidth(15)); + }]; + [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(kGetScaleWidth(18)); + make.centerX.equalTo(self.bgView); + }]; + + [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.equalTo(self.bgView); + make.bottom.mas_equalTo(-kGetScaleWidth(20)); + make.top.equalTo(self.titleView.mas_bottom); + }]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.left.right.equalTo(self.stackView); + }]; + [self.editBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(kGetScaleWidth(130)); + make.height.mas_equalTo(kGetScaleWidth(34)); + make.centerX.equalTo(self.stackView); + }]; + +} +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + XPMineUserInfoTagItemModel *model = self.itemList[indexPath.row]; + return CGSizeMake(model.width, kGetScaleWidth(18)); +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + + return self.itemList.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + + XPMineUserInfoHeaderTagCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoHeaderTagCell class]) forIndexPath:indexPath]; + cell.isTag = indexPath.row < 3; + XPMineUserInfoTagItemModel *model = self.itemList[indexPath.row]; + cell.title = model.label; + cell.contentView.layer.cornerRadius = 9; + cell.titleView.font = kFontRegular(10); + return cell; +} +-(void)setItemList:(NSMutableArray *)itemList{ + _itemList = itemList; + + [_collectionView reloadData]; +} +-(void)backAction{ + [TTPopup dismiss]; +} +-(void)editAction{ + + if(self.delegate && [self.delegate respondsToSelector:@selector(didClickGotoEditVC)]){ + [self.delegate didClickGotoEditVC]; + } + [TTPopup dismiss]; +} +#pragma mark -懒加载 +- (UICollectionView *)collectionView{ + if (!_collectionView) { + XPMineUserInfoTagFlowLayout *layout = [[XPMineUserInfoTagFlowLayout alloc] init]; + layout.delegate = self; + layout.sectionInset = UIEdgeInsetsMake(kGetScaleWidth(15), kGetScaleWidth(15), kGetScaleWidth(15), kGetScaleWidth(15)); + layout.minimumLineSpacing = kGetScaleWidth(12); + layout.minimumInteritemSpacing = kGetScaleWidth(5); + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.dataSource = self; + _collectionView.delegate = self; + _collectionView.backgroundColor = [UIColor clearColor]; + [_collectionView registerClass:[XPMineUserInfoHeaderTagCell class] forCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoHeaderTagCell class])]; + _collectionView.showsVerticalScrollIndicator = YES; + _collectionView.showsHorizontalScrollIndicator = YES; + } + return _collectionView; +} +- (UIView *)bgView{ + if (!_bgView){ + _bgView = [UIView new]; + _bgView.backgroundColor = [UIColor whiteColor]; + [_bgView setCornerWithLeftTopCorner:kGetScaleWidth(12) rightTopCorner:kGetScaleWidth(12) bottomLeftCorner:kGetScaleWidth(12) bottomRightCorner:kGetScaleWidth(12) size:CGSizeMake(kGetScaleWidth(310), kGetScaleWidth(220))]; + } + return _bgView; +} +- (UILabel *)titleView{ + if (!_titleView){ + _titleView = [UILabel labelInitWithText:@"" font:kFontMedium(17) textColor:UIColorFromRGB(0x1F1B4F)]; + } + return _titleView; +} +-(UIButton *)backBtn{ + if (!_backBtn){ + _backBtn = [UIButton new]; + [_backBtn setBackgroundImage:kImage(@"mine_guild_close") forState:UIControlStateNormal]; + [_backBtn setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; + [_backBtn addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _backBtn; +} +- (UIStackView *)stackView { + if (!_stackView) { + _stackView = [[UIStackView alloc] init]; + _stackView.axis = UILayoutConstraintAxisVertical; + _stackView.distribution = UIStackViewDistributionFill; + _stackView.alignment = UIStackViewAlignmentCenter; + _stackView.spacing = kGetScaleWidth(10); + } + return _stackView; +} +-(UIButton *)editBtn{ + if (!_editBtn){ + _editBtn = [UIButton new]; + UIImage *image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor],[DJDKMIMOMColor confirmButtonGradientMiddleColor],[DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(kGetScaleWidth(130), kGetScaleWidth(34))]; + [_editBtn setBackgroundImage:image forState:UIControlStateNormal]; + [_editBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + _editBtn.titleLabel.font = kFontMedium(14); + [_editBtn setTitle:YMLocalizedString(@"XPMineUserInfoIndividualTagView2") forState:UIControlStateNormal]; + [_editBtn addTarget:self action:@selector(editAction) forControlEvents:UIControlEventTouchUpInside]; + _editBtn.layer.cornerRadius = kGetScaleWidth(17); + _editBtn.layer.masksToBounds = YES; + } + return _editBtn; +} +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagEmptyView.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagEmptyView.h new file mode 100644 index 00000000..a056d85f --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagEmptyView.h @@ -0,0 +1,16 @@ +// +// XPMineUserInfoTagEmptyView.h +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XPMineUserInfoTagEmptyView : UIView + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagEmptyView.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagEmptyView.m new file mode 100644 index 00000000..d312c4a6 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagEmptyView.m @@ -0,0 +1,58 @@ +// +// XPMineUserInfoTagEmptyView.m +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import "XPMineUserInfoTagEmptyView.h" +@interface XPMineUserInfoTagEmptyView () +///图片 +@property (nonatomic,strong) UIImageView *iconView; +///标题 +@property (nonatomic,strong) UILabel *titleView; +@end +@implementation XPMineUserInfoTagEmptyView + +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + [self addSubview:self.iconView]; + [self addSubview:self.titleView]; +} +- (void)initSubViewConstraints { + [self.iconView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(kGetScaleWidth(55)); + make.height.mas_equalTo(kGetScaleWidth(56)); + make.top.mas_equalTo(kNavigationHeight + kGetScaleWidth(18)); + make.centerX.equalTo(self); + }]; + [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(kNavigationHeight + kGetScaleWidth(95)); + make.centerX.equalTo(self); + }]; +} +#pragma mark -懒加载 +- (UIImageView *)iconView{ + if (!_iconView){ + _iconView = [UIImageView new]; + _iconView.image = kImage(@"mine_info_tag_empty"); + } + return _iconView; +} +-(UILabel *)titleView{ + if (!_titleView){ + _titleView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserInfoTagEmptyViewCell0") font:kFontRegular(14) textColor:[UIColor whiteColor]]; + } + return _titleView; +} + +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagFlowLayout.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagFlowLayout.h new file mode 100644 index 00000000..e99692e2 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagFlowLayout.h @@ -0,0 +1,19 @@ +// +// XPMineUserInfoTagFlowLayout.h +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol EqualSpaceFlowLayoutDelegate +@end +@interface XPMineUserInfoTagFlowLayout : UICollectionViewFlowLayout +@property (nonatomic,weak) id delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagFlowLayout.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagFlowLayout.m new file mode 100644 index 00000000..ccd2a0d3 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagFlowLayout.m @@ -0,0 +1,65 @@ +// +// XPMineUserInfoTagFlowLayout.m +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import "XPMineUserInfoTagFlowLayout.h" +@interface XPMineUserInfoTagFlowLayout() +@property (nonatomic, strong) NSMutableArray *itemAttributes; +@end +@implementation XPMineUserInfoTagFlowLayout +#pragma mark - Methods to Override +- (void)prepareLayout +{ + [super prepareLayout]; + + NSInteger itemCount = [[self collectionView] numberOfItemsInSection:0]; + self.itemAttributes = [NSMutableArray arrayWithCapacity:itemCount]; + + CGFloat xOffset = self.sectionInset.left; + CGFloat yOffset = self.sectionInset.top; + CGFloat xNextOffset = self.sectionInset.left; + for (NSInteger idx = 0; idx < itemCount; idx++) { + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:idx inSection:0]; + CGSize itemSize = [self.delegate collectionView:self.collectionView layout:self sizeForItemAtIndexPath:indexPath]; + + xNextOffset+=(self.minimumInteritemSpacing + itemSize.width); + if (xNextOffset > [self collectionView].bounds.size.width - self.sectionInset.right) { + xOffset = self.sectionInset.left; + xNextOffset = (self.sectionInset.left + self.minimumInteritemSpacing + itemSize.width); + yOffset += (itemSize.height + self.minimumLineSpacing); + } + else + { + xOffset = xNextOffset - (self.minimumInteritemSpacing + itemSize.width); + } + + UICollectionViewLayoutAttributes *layoutAttributes = + [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; + + layoutAttributes.frame = CGRectMake(xOffset, yOffset, itemSize.width, itemSize.height); + [_itemAttributes addObject:layoutAttributes]; + } +} + +- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath +{ + return (self.itemAttributes)[indexPath.item]; +} + +- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect +{ + return [self.itemAttributes filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(UICollectionViewLayoutAttributes *evaluatedObject, NSDictionary *bindings) { + return CGRectIntersectsRect(rect, [evaluatedObject frame]); + }]]; +} + +- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds +{ + return NO; +} + + +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagHeadView.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagHeadView.h new file mode 100644 index 00000000..b2f3ede2 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagHeadView.h @@ -0,0 +1,20 @@ +// +// XPMineUserInfoTagHeadView.h +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import +#import "XPMineUserInfoTagModel.h" +NS_ASSUME_NONNULL_BEGIN + + + +@interface XPMineUserInfoTagHeadView : UIView +/// +@property (nonatomic,strong) XPMineUserInfoTagModel *tagModel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagHeadView.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagHeadView.m new file mode 100644 index 00000000..69f06a0c --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagHeadView.m @@ -0,0 +1,146 @@ +// +// XPMineUserInfoTagHeadView.m +// xplan-ios +// +// Created by duoban on 2023/2/15. +// +UIKIT_EXTERN NSString * kMineInfoDelTag; +#import "XPMineUserInfoTagHeadView.h" +///cell +#import "XPMineUserInfoTagViewCell.h" +#import "XPMineUserInfoTagEmptyView.h" +#import "XPMineUserInfoTagFlowLayout.h" +@interface XPMineUserInfoTagHeadView() +@property (nonatomic,strong) UICollectionView *collectionView; +/// +@property (nonatomic,strong) NSMutableArray *itemList; +/// +@property (nonatomic,strong) XPMineUserInfoTagEmptyView *emptyView; + +@end +@implementation XPMineUserInfoTagHeadView +-(void)dealloc{ + [[NSNotificationCenter defaultCenter]removeObserver:self]; +} +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} +-(void)setTagModel:(XPMineUserInfoTagModel *)tagModel{ + _tagModel = tagModel; + [_itemList removeAllObjects]; + for (NSString *text in _tagModel.meLabels) { + if(text.length > 0){ + XPMineUserInfoTagItemModel *model = [XPMineUserInfoTagItemModel new]; + model.label = text; + CGRect stringRect = [text boundingRectWithSize:CGSizeMake(MAXFLOAT, kGetScaleWidth(18)) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:kFontRegular(13)} context:nil]; + model.width = stringRect.size.width + kGetScaleWidth(46); + [_itemList addObject:model]; + } + + } + _collectionView.hidden = !(_itemList.count > 0); + _emptyView.hidden = _itemList.count > 0; + [_collectionView reloadData]; + + if(_itemList.count > 0 && [_collectionView visibleCells] > 0){ + [self scrollBottom]; + + } + +} +-(void)scrollBottom{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:self.itemList.count - 1 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:YES]; + + }); +} + +#pragma mark - Private Method +- (void)initSubViews { + _itemList = [NSMutableArray array]; + UIImage *image = [UIImage gradientColorImageFromColors:@[UIColorFromRGB(0xB0DAFF),UIColorFromRGB(0xB0DAFF),UIColorFromRGB(0xF4DBFF)] gradientType:GradientTypeTopToBottom imgSize:CGSizeMake(KScreenWidth, kGetScaleWidth(304))]; + self.backgroundColor = [UIColor colorWithPatternImage:image]; + [self addSubview:self.emptyView]; + [self addSubview:self.collectionView]; + [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(delTagItem:) name:kMineInfoDelTag object:nil]; +} +- (void)initSubViewConstraints { + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.bottom.equalTo(self); + make.top.mas_equalTo(kNavigationHeight); + }]; + [self.emptyView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self); + }]; +} +-(void)delTagItem:(NSNotification *)not{ + XPMineUserInfoTagItemModel *model = not.object; + NSMutableArray *meLabels = [NSMutableArray arrayWithArray:self.tagModel.meLabels]; + if([meLabels containsObject:model.label]){ + [meLabels removeObject:model.label]; + } + self.tagModel.meLabels = meLabels; + [self.itemList removeObject:model]; + _collectionView.hidden = !(_itemList.count > 0); + _emptyView.hidden = _itemList.count > 0; + [_collectionView reloadData]; + if(_itemList.count > 0 && [_collectionView visibleCells] > 0){ + [self scrollBottom]; + } +} +#pragma mark - UICollectionViewDelegate And UICollectionViewDatasource + + + +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + + XPMineUserInfoTagItemModel *model = self.itemList[indexPath.row]; + return CGSizeMake(model.width, kGetScaleWidth(34)); + +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.itemList.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + + XPMineUserInfoTagViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoTagViewCell class]) forIndexPath:indexPath]; + XPMineUserInfoTagItemModel *model = self.itemList[indexPath.row]; + cell.headModel = model; + return cell; + + +} +#pragma mark -懒加载 +- (UICollectionView *)collectionView{ + if (!_collectionView) { + XPMineUserInfoTagFlowLayout *layout = [[XPMineUserInfoTagFlowLayout alloc] init]; + layout.delegate = self; + layout.minimumLineSpacing = kGetScaleWidth(15); + layout.minimumInteritemSpacing = kGetScaleWidth(15); + layout.sectionInset = UIEdgeInsetsMake(kGetScaleWidth(15), kGetScaleWidth(15), kGetScaleWidth(64), kGetScaleWidth(15)); + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.dataSource = self; + _collectionView.delegate = self; + _collectionView.hidden = YES; + _collectionView.pagingEnabled = NO; + _collectionView.backgroundColor = [UIColor clearColor]; + [_collectionView registerClass:[XPMineUserInfoTagViewCell class] forCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoTagViewCell class])]; + _collectionView.showsVerticalScrollIndicator = NO; + } + return _collectionView; +} + +- (XPMineUserInfoTagEmptyView *)emptyView{ + if (!_emptyView){ + _emptyView = [[XPMineUserInfoTagEmptyView alloc]initWithFrame:CGRectZero]; + } + return _emptyView; +} +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagItemView.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagItemView.h new file mode 100644 index 00000000..d1737707 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagItemView.h @@ -0,0 +1,28 @@ +// +// XPMineUserInfoTagItemView.h +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import +#import +#import "XPMineUserInfoTagModel.h" +#import "XPMineUserInfoTagModel.h" +NS_ASSUME_NONNULL_BEGIN + +@protocol XPMineUserInfoTagItemViewDelegate + +-(void)didSelectTag; + + +@end + +@interface XPMineUserInfoTagItemView : UIView +@property (nonatomic,strong) XPMineUserInfoTagModel *tagModel; +@property (nonatomic,strong) NSMutableArray *itemList; +/// +@property (nonatomic,weak) id delegate; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagItemView.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagItemView.m new file mode 100644 index 00000000..537196f8 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagItemView.m @@ -0,0 +1,118 @@ +// +// XPMineUserInfoTagItemView.m +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import "XPMineUserInfoTagItemView.h" +///view +#import "XPMineUserInfoTagViewCell.h" +#import "XPMineUserInfoTagModel.h" +#import "XPMineUserInfoTagFlowLayout.h" +@interface XPMineUserInfoTagItemView () +@property (nonatomic,strong) UICollectionView *collectionView; + + +@end +@implementation XPMineUserInfoTagItemView + +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + [self addSubview:self.collectionView]; +} +- (void)initSubViewConstraints { + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.equalTo(self); + make.bottom.mas_equalTo(0); + }]; +} +-(void)setItemList:(NSMutableArray *)itemList{ + _itemList = itemList; + for (XPMineUserInfoTagItemModel *model in self.itemList) { + CGRect stringRect = [model.label boundingRectWithSize:CGSizeMake(MAXFLOAT, kGetScaleWidth(18)) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:kFontRegular(13)} context:nil]; + model.width = stringRect.size.width + kGetScaleWidth(32); + model.isNoChooseTag = YES; + } + + [self.collectionView reloadData]; + + + +} +#pragma mark - UICollectionViewDelegate And UICollectionViewDatasource + + + +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + XPMineUserInfoTagItemModel *model = self.itemList[indexPath.row]; + return CGSizeMake(model.width, kGetScaleWidth(34)); +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + + return self.itemList.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + + XPMineUserInfoTagViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoTagViewCell class]) forIndexPath:indexPath]; + cell.mainTagModel = self.tagModel; + cell.tagModel = self.itemList[indexPath.row]; + + return cell; +} +-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ + XPMineUserInfoTagItemModel *model = self.itemList[indexPath.row]; + NSMutableArray *meLabels = [NSMutableArray arrayWithArray:self.tagModel.meLabels]; + [meLabels removeObject:@""]; + if(model.picked == NO && meLabels.count >= 20){ + [XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"XPMineUserInfoTagItemView0")]; + return; + } + model.picked = !model.picked; + if(model.picked == NO){ + [meLabels removeObject:model.label]; + }else{ + [meLabels addObject:model.label]; + } + self.tagModel.meLabels = meLabels; + [self.collectionView reloadData]; + if(self.delegate && [self.delegate respondsToSelector:@selector(didSelectTag)]){ + [self.delegate didSelectTag]; + } +} +#pragma mark -懒加载 +- (UICollectionView *)collectionView{ + if (!_collectionView) { + XPMineUserInfoTagFlowLayout *layout = [[XPMineUserInfoTagFlowLayout alloc] init]; + layout.delegate = self; + layout.sectionInset = UIEdgeInsetsMake(kGetScaleWidth(7), kGetScaleWidth(15), kGetScaleWidth(30), kGetScaleWidth(15)); + layout.minimumLineSpacing = kGetScaleWidth(15); + layout.minimumInteritemSpacing = kGetScaleWidth(15); + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.dataSource = self; + _collectionView.delegate = self; + _collectionView.pagingEnabled = NO; + _collectionView.backgroundColor = [UIColor clearColor]; + [_collectionView registerClass:[XPMineUserInfoTagViewCell class] forCellWithReuseIdentifier:NSStringFromClass([XPMineUserInfoTagViewCell class])]; + + _collectionView.showsVerticalScrollIndicator = NO; + } + return _collectionView; +} +#pragma mark - JXCategoryListContentViewDelegate +- (UIView *)listView { + return self; +} + +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagView.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagView.h new file mode 100644 index 00000000..76ee4dcc --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagView.h @@ -0,0 +1,24 @@ +// +// XPMineUserInfoTagView.h +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import +#import "XPMineUserInfoTagModel.h" +NS_ASSUME_NONNULL_BEGIN +@protocol XPMineUserInfoTagViewDelegate + +-(void)didingSelectTag; + + +@end +@interface XPMineUserInfoTagView : UIView +/// +@property (nonatomic,strong) XPMineUserInfoTagModel *tagModel; +/// +@property (nonatomic,weak) id delegate; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagView.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagView.m new file mode 100644 index 00000000..ea24870f --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagView.m @@ -0,0 +1,135 @@ +// +// XPMineUserInfoTagView.m +// xplan-ios +// +// Created by duoban on 2023/2/15. +// +///Third +#import +#import +#import +#import +#import "XPMineUserInfoTagView.h" +///view +#import "XPMineUserInfoTagItemView.h" +@interface XPMineUserInfoTagView() +///分页标题 +@property (nonatomic, strong) NSArray *titles; +///分页控件 +@property (nonatomic, strong) JXCategoryTitleView *titleView; +///分页lineView +@property (nonatomic, strong) JXCategoryListContainerView *pi_containerView; +///数据源 +/// +@property (nonatomic,strong) NSMutableArray *dataList; +@end +@implementation XPMineUserInfoTagView + + +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + self.dataList = [NSMutableArray array]; + self.backgroundColor = [UIColor whiteColor]; + [self addSubview:self.titleView]; + [self addSubview:self.pi_containerView]; +} +- (void)initSubViewConstraints { + [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.equalTo(self); + make.height.mas_equalTo(kGetScaleWidth(40)); + }]; + + [self.pi_containerView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.bottom.equalTo(self); + make.top.mas_equalTo(self.titleView.mas_bottom); + }]; +} +-(void)setTagModel:(XPMineUserInfoTagModel *)tagModel{ + _tagModel = tagModel; + _titles = _tagModel.groups; + [_dataList removeAllObjects]; + for (NSString *label in _titles) { + NSMutableArray *array = [NSMutableArray array]; + for (XPMineUserInfoTagItemModel *model in _tagModel.labels) { + if([model.group isEqualToString:label]){ + [array addObject:model]; + } + } + [_dataList addObject:array]; + } + _titleView.titles = _titles; + [_titleView reloadData]; +} +#pragma mark -XPMineUserInfoTagItemViewDelegate +-(void)didSelectTag{ + if(self.delegate && [self.delegate respondsToSelector:@selector(didingSelectTag)]){ + [self.delegate didingSelectTag]; + } +} +#pragma mark - JXCategoryViewDelegate +- (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView { + return self.titles.count; +} + +- (id)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index { + XPMineUserInfoTagItemView *tagView = [[XPMineUserInfoTagItemView alloc]init]; + NSMutableArray *modelList = self.dataList[index]; + tagView.itemList = modelList; + tagView.tagModel = self.tagModel; + tagView.delegate = self; + return tagView; +} +#pragma mark -懒加载 +- (JXCategoryTitleView *)titleView { + if (!_titleView) { + _titleView = [[JXCategoryTitleView alloc] init]; + _titleView.delegate = self; + _titleView.titles = self.titles; + _titleView.backgroundColor = [UIColor clearColor]; + _titleView.titleColor = UIColorFromRGB(0xB3B3C3); + _titleView.titleSelectedColor = UIColorFromRGB(0x1F1B4F); + _titleView.titleFont = kFontMedium(15); + _titleView.titleSelectedFont = kFontMedium(15); + _titleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter; + _titleView.contentScrollViewClickTransitionAnimationEnabled = NO; + _titleView.defaultSelectedIndex = 0; + _titleView.cellWidthIncrement = 5; + _titleView.listContainer = self.pi_containerView; + + JXCategoryIndicatorImageView *lineView = [[JXCategoryIndicatorImageView alloc] init]; + lineView.indicatorImageViewSize = CGSizeMake(kGetScaleWidth(12), kGetScaleWidth(3)); + lineView.verticalMargin = kGetScaleWidth(5); + lineView.indicatorImageView.image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor], [DJDKMIMOMColor confirmButtonGradientMiddleColor],[DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(kGetScaleWidth(12), kGetScaleWidth(3))]; + lineView.indicatorImageView.layer.masksToBounds = YES; + lineView.indicatorImageView.layer.cornerRadius = kGetScaleWidth(3)/2; + _titleView.indicators = @[lineView]; + } + return _titleView; +} + +- (JXCategoryListContainerView *)pi_containerView { + if (!_pi_containerView) { + _pi_containerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self]; + _pi_containerView.defaultSelectedIndex = 0; + _pi_containerView.scrollView.tag = 1009; + } + return _pi_containerView; +} + +- (NSArray *)titles { + if (!_titles) { + _titles = @[]; + } + return _titles; +} + +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagViewCell.h b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagViewCell.h new file mode 100644 index 00000000..b56610ac --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagViewCell.h @@ -0,0 +1,22 @@ +// +// XPMineUserInfoTagViewCell.h +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import +#import "XPMineUserInfoTagModel.h" +NS_ASSUME_NONNULL_BEGIN + + + +@interface XPMineUserInfoTagViewCell : UICollectionViewCell +@property (nonatomic,strong) XPMineUserInfoTagItemModel *headModel; +/// +@property (nonatomic,strong) XPMineUserInfoTagItemModel *tagModel; + +@property (nonatomic,strong) XPMineUserInfoTagModel *mainTagModel; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagViewCell.m b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagViewCell.m new file mode 100644 index 00000000..ab23d0d7 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/MineInfo/XPMineUserInfoTagViewCell.m @@ -0,0 +1,118 @@ +// +// XPMineUserInfoTagViewCell.m +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import "XPMineUserInfoTagViewCell.h" +UIKIT_EXTERN NSString * kMineInfoDelTag; +@interface XPMineUserInfoTagViewCell() +///容器 +@property (nonatomic,strong) UIStackView *stackView; +///内容 +@property (nonatomic,strong) UILabel *titleView; +///删除 +@property (nonatomic,strong) UIButton *delBtn; + +@end +@implementation XPMineUserInfoTagViewCell +-(void)dealloc{ + [[NSNotificationCenter defaultCenter]removeObserver:self]; +} +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + self.contentView.backgroundColor = [UIColor whiteColor]; + self.contentView.layer.cornerRadius = kGetScaleWidth(17); + self.contentView.layer.masksToBounds = YES; + [self.contentView addSubview:self.stackView]; + [self.stackView addArrangedSubview:self.titleView]; + [self.stackView addArrangedSubview:self.delBtn]; + [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(delTagItem:) name:kMineInfoDelTag object:nil]; + +} + +-(void)delTagItem:(NSNotification *)not{ + XPMineUserInfoTagItemModel *model = not.object; + NSString *label = model.label; + if(self.tagModel != nil && [self.tagModel.label isEqualToString:label] ){ + self.tagModel.picked = NO; + self.contentView.backgroundColor = UIColorFromRGB(0xF7F7F9); + self.titleView.textColor = [DJDKMIMOMColor inputTextColor]; + } +} +- (void)initSubViewConstraints { + [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(kGetScaleWidth(8)); + make.left.mas_equalTo(kGetScaleWidth(16)); + make.right.mas_equalTo(-kGetScaleWidth(12)); + make.bottom.mas_equalTo(-kGetScaleWidth(8)); + }]; + [self.delBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(15)); + }]; + [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) { + + make.height.mas_equalTo(kGetScaleWidth(18)); + + }]; +} +-(void)setHeadModel:(XPMineUserInfoTagItemModel *)headModel{ + _headModel = headModel; + _titleView.text = _headModel.label; +} +-(void)setTagModel:(XPMineUserInfoTagItemModel *)tagModel{ + _tagModel = tagModel; + _titleView.text = _tagModel.label; + _delBtn.hidden = _tagModel.isNoChooseTag; + if(_tagModel.picked == YES || [_mainTagModel.meLabels containsObject:_tagModel.label]){ + UIImage *image = [UIImage gradientColorImageFromColors:@[UIColorFromRGB(0xCCF8F9),UIColorFromRGB(0xDEE4FF),UIColorFromRGB(0xEEDCFF)] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(_tagModel.width, kGetScaleWidth(34))]; + self.contentView.backgroundColor = [UIColor colorWithPatternImage:image]; + _titleView.textColor = UIColorFromRGB(0x9168FA); + }else{ + self.contentView.backgroundColor = UIColorFromRGB(0xF7F7F9); + _titleView.textColor = [DJDKMIMOMColor inputTextColor]; + } +} +-(void)delItemAction{ + [[NSNotificationCenter defaultCenter]postNotificationName:kMineInfoDelTag object:self.headModel]; +} +#pragma mark -懒加载 +-(UIStackView *)stackView{ + if (!_stackView){ + _stackView = [[UIStackView alloc] init]; + _stackView.axis = UILayoutConstraintAxisHorizontal; + _stackView.distribution = UIStackViewDistributionFill; + _stackView.alignment = UIStackViewAlignmentFill; + _stackView.spacing = kGetScaleWidth(2); + } + return _stackView; +} +- (UILabel *)titleView{ + if (!_titleView){ + _titleView = [UILabel labelInitWithText:@"" font:kFontRegular(13) textColor:[DJDKMIMOMColor inputTextColor]]; + _titleView.textAlignment = NSTextAlignmentCenter; + + } + return _titleView; +} +-(UIButton *)delBtn{ + if (!_delBtn){ + _delBtn = [UIButton new]; + [_delBtn setBackgroundImage:kImage(@"mine_info_tag_del") forState:UIControlStateNormal]; + [_delBtn setEnlargeEdgeWithTop:20 right:20 bottom:20 left:20]; + [_delBtn addTarget:self action:@selector(delItemAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _delBtn; +} + +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/XPMineDataSkillDataCollectionViewCell.h b/YuMi/Modules/YMMine/View/SubViews/XPMineDataSkillDataCollectionViewCell.h new file mode 100644 index 00000000..aef7a67c --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/XPMineDataSkillDataCollectionViewCell.h @@ -0,0 +1,16 @@ +// +// XPMineDataSkillDataCollectionViewCell.h +// xplan-ios +// +// Created by 冯硕 on 2022/4/14. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@class MineSkillCardListInfoModel; +@interface XPMineDataSkillDataCollectionViewCell : UICollectionViewCell +@property (nonatomic,strong) MineSkillCardListInfoModel *skillInfo; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/SubViews/XPMineDataSkillDataCollectionViewCell.m b/YuMi/Modules/YMMine/View/SubViews/XPMineDataSkillDataCollectionViewCell.m new file mode 100644 index 00000000..cdae336e --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/XPMineDataSkillDataCollectionViewCell.m @@ -0,0 +1,145 @@ +// +// XPMineDataSkillDataCollectionViewCell.m +// xplan-ios +// +// Created by 冯硕 on 2022/4/14. +// + +#import "XPMineDataSkillDataCollectionViewCell.h" +///Third +#import +///Tool +#import "NetImageView.h" +///Model +#import "MineSkillCardListInfoModel.h" + +@interface XPMineDataSkillDataCollectionViewCell () + +///背景 +@property (nonatomic,strong) UIView * backView; +///显示图片 +@property (nonatomic,strong) NetImageView *logoImageView; +///标题 +@property (nonatomic,strong) UILabel *titleLabel; +///技能卡 +@property (nonatomic,strong) UILabel *skillLabel; + +@end + +@implementation XPMineDataSkillDataCollectionViewCell + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + self.backgroundColor = [UIColor clearColor]; + [self.contentView addSubview:self.backView]; + [self.backView addSubview:self.logoImageView]; + [self.backView addSubview:self.titleLabel]; + [self.backView addSubview:self.skillLabel]; +} + +- (void)initSubViewConstraints { + [self.backView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.contentView); + }]; + + [self.logoImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.bottom.mas_equalTo(self.backView).inset(8); + make.left.mas_equalTo(self.backView).offset(4); + make.height.mas_equalTo(self.logoImageView.mas_width); + }]; + + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.mas_equalTo(self.logoImageView.mas_centerY).offset(-2); + make.left.mas_equalTo(self.logoImageView.mas_right).offset(4); + make.right.mas_lessThanOrEqualTo(self.backView); + }]; + + [self.skillLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.titleLabel); + make.top.mas_equalTo(self.logoImageView.mas_centerY).offset(2); + }]; +} +- (UIColor *)getSkillCardBackColor:(NSString *)cardId { + UIColor * color = UIColorFromRGB(0xFEF5E8); + if ([cardId isEqualToString:@"1"]) { + color = UIColorFromRGB(0xEEF2FF); + } else if([cardId isEqualToString:@"2"]) { + color = UIColorFromRGB(0xFEF5E8); + }else if([cardId isEqualToString:@"3"]) { + color = UIColorFromRGB(0xF2FFE0); + }else if([cardId isEqualToString:@"4"]) { + color = UIColorFromRGB(0xE9FFF4); + }else if([cardId isEqualToString:@"5"]) { + color = UIColorFromRGB(0xFFE7EF); + }else if([cardId isEqualToString:@"6"]) { + color = UIColorFromRGB(0xF9ECFF); + }else if([cardId isEqualToString:@"7"]) { + color = UIColorFromRGB(0xFFE4FB); + }else if([cardId isEqualToString:@"9"]) { + color = UIColorFromRGB(0xF7EFDB); + } + return color; +} + +#pragma mark - Getters And Setters +- (void)setSkillInfo:(MineSkillCardListInfoModel *)skillInfo { + _skillInfo = skillInfo; + if (_skillInfo) { + self.logoImageView.imageUrl = _skillInfo.icon; + NSString * title = [_skillInfo.propVals componentsJoinedByString:@"/"]; + self.skillLabel.text = title; + self.titleLabel.text = _skillInfo.name; + self.backView.backgroundColor = [self getSkillCardBackColor:skillInfo.cardId]; + } +} + +- (NetImageView *)logoImageView { + if (!_logoImageView) { + NetImageConfig * config = [[NetImageConfig alloc]init]; + config.imageType = ImageTypeUserIcon; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + _logoImageView = [[NetImageView alloc] initWithConfig:config]; + } + return _logoImageView; +} + +- (UIView *)backView { + if (!_backView) { + _backView = [[UIView alloc] init]; + _backView.backgroundColor = UIColorFromRGB(0xFEF5E8); + _backView.layer.masksToBounds = YES; + _backView.layer.cornerRadius = 8; + } + return _backView; +} + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.font = [UIFont systemFontOfSize:12 weight:UIFontWeightMedium]; + _titleLabel.textColor = [DJDKMIMOMColor mainTextColor]; + } + return _titleLabel; +} + +- (UILabel *)skillLabel { + if (!_skillLabel) { + _skillLabel = [[UILabel alloc] init]; + _skillLabel.font = [UIFont systemFontOfSize:12 weight:UIFontWeightMedium]; + _skillLabel.textColor = [DJDKMIMOMColor mainTextColor]; + } + return _skillLabel; +} + + + +@end diff --git a/YuMi/Modules/YMMine/View/SubViews/XPMineUserInfoRecordedSoundView.h b/YuMi/Modules/YMMine/View/SubViews/XPMineUserInfoRecordedSoundView.h new file mode 100644 index 00000000..2f51912c --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/XPMineUserInfoRecordedSoundView.h @@ -0,0 +1,58 @@ +// +// XPMineUserInfoRecordedSoundView.h +// xplan-ios +// +// Created by duoban on 2022/12/29. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + + +@protocol XPMineUserInfoRecordedSoundViewDelegate +///开始录音 +- (void)startRecordAudio; +///停止录音 +-(void)stopRecordAudio; +///重新录音 +-(void)resetRecordAudio; +///播放录音 +-(void)playRecordAudio; +///停止播放录音 +-(void)stopPlayRecordAudio; +///删除录音 +-(void)deleteRecordingAudio; +///保存录音 +-(void)saveRecordAudio; + +@end + + +@interface XPMineUserInfoRecordedSoundView : UIView +@property (nonatomic,weak) id delegate; + +///正在录制 +-(void)recordingWithTime:(NSString *)time progress:(CGFloat)progress animated:(BOOL)animated; +///录制完成 +-(void)recordCompleted; +///开始录制 +-(void)startRecord; +///停止录制 +-(void)stopRecord; +///重置录制 +-(void)resetRecord; +///播放录音 +-(void)playRecord; +///停止播放录音 +-(void)stopPlayRecord; +///保存声音 +-(void)uploadRecordSuccess:(BOOL)isAudit; +///录制按钮的点击事件 +-(void)recordAction; +@end + +NS_ASSUME_NONNULL_END + + + diff --git a/YuMi/Modules/YMMine/View/SubViews/XPMineUserInfoRecordedSoundView.m b/YuMi/Modules/YMMine/View/SubViews/XPMineUserInfoRecordedSoundView.m new file mode 100644 index 00000000..9820c040 --- /dev/null +++ b/YuMi/Modules/YMMine/View/SubViews/XPMineUserInfoRecordedSoundView.m @@ -0,0 +1,525 @@ +// +// XPMineUserInfoRecordedSoundView.m +// xplan-ios +// +// Created by duoban on 2022/12/29. +// + +#import "XPMineUserInfoRecordedSoundView.h" +#import "SGYProgressView.h" +#import +#import "XPSkillCardPlayerManager.h" + +@interface XPMineUserInfoRecordedSoundView() +@property (nonatomic,strong) UIScrollView *scrollView; +///背景 +@property (nonatomic,strong) UIImageView *bgImageView; +///记录背景 +@property (nonatomic,strong) UIImageView *recordView; +///录制圆环进度条 +@property (nonatomic,strong) SGYProgressView *progressView; +///录制麦图标 +@property (nonatomic,strong) UIImageView *maiView; +///声音动效 +@property (nonatomic,strong) SVGAImageView *soundSVGAView; +///录制时间 +@property (nonatomic,strong) UILabel *timeView; +///提示 +@property (nonatomic,strong) UILabel *promptView; +///录制背景 +@property (nonatomic,strong) UIView *bgRecordView; +///录制 +@property (nonatomic,strong) UIButton *recordBtn; +///完成录制 +@property (nonatomic,strong) UIButton *completedBtn; +///录制下面提示 +@property (nonatomic,strong) UILabel *recordTitleView; + +///重新录制背景 +@property (nonatomic,strong) UIView *bgRerecordView; +///重新录制 +@property (nonatomic,strong) UIButton *rerecordBtn; +///重新录制下面提示 +@property (nonatomic,strong) UILabel *rerecordTitleView; +///保存声音 +@property (nonatomic,strong) UIButton *saveBtn; +///保存声音下面提示 +@property (nonatomic,strong) UILabel *saveTitleView; +///删除背景 +@property (nonatomic,strong) UIView *bgDeleteView; +///删除 +@property (nonatomic,strong) UIButton *deleteBtn; +///结果提示 +@property (nonatomic,strong) UILabel *resultView; +@end +@implementation XPMineUserInfoRecordedSoundView + +-(instancetype)initWithFrame:(CGRect)frame{ + self = [super initWithFrame:frame]; + if(self){ + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + [self addSubview:self.scrollView]; + [self.scrollView addSubview:self.bgImageView]; + [self.scrollView addSubview:self.recordView]; + [self.recordView addSubview:self.progressView]; + [self.recordView addSubview:self.maiView]; + [self.recordView addSubview:self.soundSVGAView]; + [self.scrollView addSubview:self.timeView]; + [self.scrollView addSubview:self.promptView]; + [self.scrollView addSubview:self.bgRecordView]; + [self.bgRecordView addSubview:self.recordBtn]; + [self.bgRecordView addSubview:self.completedBtn]; + [self.scrollView addSubview:self.recordTitleView]; + [self.scrollView addSubview:self.bgRerecordView]; + [self.bgRerecordView addSubview:self.rerecordBtn]; + [self.scrollView addSubview:self.rerecordTitleView]; + [self.scrollView addSubview:self.bgDeleteView]; + [self.bgDeleteView addSubview:self.deleteBtn]; + [self.scrollView addSubview:self.saveBtn]; + [self.scrollView addSubview:self.saveTitleView]; + [self.scrollView addSubview:self.resultView]; + + + self.bgRerecordView.hidden = YES; + self.rerecordTitleView.hidden = YES; + self.bgDeleteView.hidden = YES; + self.saveBtn.hidden = YES; + self.saveTitleView.hidden = YES; + self.resultView.hidden = YES; + + SVGAParser *soundParser = [SVGAParser new]; + @kWeakify(self) + [soundParser parseWithNamed:@"mine_info_sound_record" inBundle:[NSBundle mainBundle] completionBlock:^(SVGAVideoEntity * _Nonnull videoItem) { + @kStrongify(self); + self.soundSVGAView.loops = 0; + self.soundSVGAView.clearsAfterStop = NO; + self.soundSVGAView.videoItem = videoItem; + [self.soundSVGAView startAnimation]; + } failureBlock:^(NSError * _Nonnull error) { + + }]; +} +- (void)initSubViewConstraints { + [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self); + }]; + [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.equalTo(self); + make.height.mas_equalTo(kGetScaleWidth(216)); + }]; + [self.recordView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(kGetScaleWidth(168)); + make.width.height.mas_equalTo(kGetScaleWidth(180)); + make.centerX.equalTo(self); + }]; + [self.maiView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(110)); + make.center.equalTo(self.recordView); + }]; + [self.soundSVGAView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(110)); + make.center.equalTo(self.recordView); + }]; + [self.timeView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.recordView.mas_bottom).mas_offset(kGetScaleWidth(30)); + make.centerX.equalTo(self); + }]; + [self.promptView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.timeView.mas_bottom).mas_offset(kGetScaleWidth(15)); + make.centerX.equalTo(self); + }]; + [self.bgRecordView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.promptView.mas_bottom).mas_offset(kGetScaleWidth(116)); + make.width.height.mas_equalTo(kGetScaleWidth(64)); + make.centerX.equalTo(self); + }]; + [self.completedBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(28)); + make.center.equalTo(self.bgRecordView); + }]; + [self.recordBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(28)); + make.center.equalTo(self.bgRecordView); + }]; + [self.recordTitleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.bgRecordView.mas_bottom).mas_offset(kGetScaleWidth(15)); + make.centerX.equalTo(self); + }]; + + [self.bgRerecordView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(42)); + make.centerY.equalTo(self.recordBtn); + make.right.equalTo(self.recordBtn.mas_left).mas_offset(-kGetScaleWidth(56)); + }]; + + [self.rerecordBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(18)); + make.center.equalTo(self.bgRerecordView); + }]; + [self.rerecordTitleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.bgRerecordView.mas_bottom).mas_offset(kGetScaleWidth(10)); + make.centerX.equalTo(self.rerecordBtn); + + }]; + + + [self.bgDeleteView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(42)); + make.centerY.equalTo(self.recordBtn); + make.left.equalTo(self.recordBtn.mas_right).mas_offset(kGetScaleWidth(56)); + }]; + + [self.deleteBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(18)); + make.center.equalTo(self.bgDeleteView); + }]; + + [self.saveBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(42)); + make.centerY.equalTo(self.recordBtn); + make.left.equalTo(self.recordBtn.mas_right).mas_offset(kGetScaleWidth(56)); + }]; + [self.saveTitleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.rerecordTitleView); + make.centerX.equalTo(self.saveBtn); + }]; + [self.resultView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.recordTitleView.mas_bottom).mas_offset(kGetScaleWidth(54)); + make.centerX.equalTo(self); + + }]; + [self.resultView.superview layoutIfNeeded]; + self.scrollView.contentSize = CGSizeMake(0, self.resultView.frame.origin.y + self.resultView.frame.size.height ); +} +-(void)recordingWithTime:(NSString *)time progress:(CGFloat)progress animated:(BOOL)animated{ + self.timeView.text = time; + [self.progressView setProgress:progress animated:animated startAngle:-M_PI_2 clockwise:YES]; +} +-(void)uploadRecordSuccess:(BOOL)isAudit{ + self.bgDeleteView.hidden = NO; + self.resultView.hidden = NO; + self.bgRerecordView.hidden = NO; + self.rerecordTitleView.hidden = NO; + self.saveBtn.hidden = YES; + self.soundSVGAView.hidden = YES; + self.maiView.hidden = NO; + self.recordBtn.hidden = YES; + self.completedBtn.hidden = NO; + self.saveTitleView.hidden = NO; + self.recordTitleView.text = YMLocalizedString(@"XPMineUserInfoRecordedSoundView6"); + self.saveTitleView.text = YMLocalizedString(@"XPMineUserInfoRecordedSoundView8"); + self.resultView.text = isAudit == YES ? YMLocalizedString(@"XPMineUserInfoRecordedSoundView9") : YMLocalizedString(@"XPMineUserInfoRecordedSoundView4"); + +} +-(void)recordCompleted{ + self.resultView.hidden = YES; + self.bgDeleteView.hidden = YES; + self.bgRerecordView.hidden = NO; + self.rerecordTitleView.hidden = NO; + self.saveBtn.hidden = NO; + self.soundSVGAView.hidden = YES; + self.maiView.hidden = NO; + self.recordBtn.hidden = YES; + self.completedBtn.hidden = NO; + self.saveTitleView.hidden = NO; + self.recordTitleView.text = YMLocalizedString(@"XPMineUserInfoRecordedSoundView6"); + self.saveTitleView.text = YMLocalizedString(@"XPMineUserInfoRecordedSoundView3"); +} +- (void)startRecord{ + + self.recordBtn.selected = YES; + self.soundSVGAView.hidden = NO; + self.maiView.hidden = YES; + self.recordTitleView.text = YMLocalizedString(@"XPMineUserInfoRecordedSoundView5"); +} +-(void)stopRecord{ + self.recordBtn.selected = NO; + self.soundSVGAView.hidden = YES; + self.maiView.hidden = NO; + self.recordTitleView.text = YMLocalizedString(@"XPMineUserInfoRecordedSoundView1"); +} +-(void)resetRecord{ + self.recordBtn.selected = NO; + self.soundSVGAView.hidden = YES; + self.maiView.hidden = NO; + self.recordTitleView.text = YMLocalizedString(@"XPMineUserInfoRecordedSoundView1"); + self.bgRerecordView.hidden = YES; + self.rerecordTitleView.hidden = YES; + self.saveBtn.hidden = YES; + self.soundSVGAView.hidden = YES; + self.maiView.hidden = NO; + self.recordBtn.hidden = NO; + self.completedBtn.hidden = YES; + self.saveTitleView.hidden = YES; + self.bgDeleteView.hidden = YES; + self.resultView.hidden = YES; + self.completedBtn.selected = NO; +} +-(void)playRecord{ + self.maiView.hidden = YES; + self.soundSVGAView.hidden = NO; + + self.recordTitleView.text = YMLocalizedString(@"XPMineUserInfoRecordedSoundView7"); + +} +-(void)stopPlayRecord{ + self.maiView.hidden = NO; + self.soundSVGAView.hidden = YES; + self.completedBtn.selected = NO; + self.recordTitleView.text = YMLocalizedString(@"XPMineUserInfoRecordedSoundView6"); +} +-(void)saveRecordAction{ + if(self.delegate && [self.delegate respondsToSelector:@selector(saveRecordAudio)]){ + [self.delegate saveRecordAudio]; + } +} +#pragma mark - buttonAction +-(void)recordAction{ + if([XPSkillCardPlayerManager shareInstance].isMineInMic == YES){ + [XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"XPMineUserInfoRecordedSoundView10")]; + return; + } + + + self.recordBtn.selected = !self.recordBtn.selected; + if(!self.recordBtn.selected){ + self.recordBtn.userInteractionEnabled = NO; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + self.recordBtn.userInteractionEnabled = YES; + }); + } + if(self.recordBtn.selected){ + if(self.delegate && [self.delegate respondsToSelector:@selector(startRecordAudio)]){ + [self.delegate startRecordAudio]; + } + return; + } + if(self.delegate && [self.delegate respondsToSelector:@selector(stopRecordAudio)]){ + [self.delegate stopRecordAudio]; + } + +} +-(void)playSoundAction{ + self.completedBtn.selected = !self.completedBtn.selected; + if(self.completedBtn.selected){ + if(self.delegate && [self.delegate respondsToSelector:@selector(playRecordAudio)]){ + [self.delegate playRecordAudio]; + } + + return; + } + if(self.delegate && [self.delegate respondsToSelector:@selector(stopPlayRecordAudio)]){ + [self.delegate stopPlayRecordAudio]; + } +} +-(void)resetRecordAction{ + if(self.delegate && [self.delegate respondsToSelector:@selector(resetRecordAudio)]){ + [self.delegate resetRecordAudio]; + } +} +-(void)deleteRecordingAction{ + if(self.delegate && [self.delegate respondsToSelector:@selector(deleteRecordingAudio)]){ + [self.delegate deleteRecordingAudio]; + } +} +#pragma mark -懒加载 +- (UIImageView *)bgImageView{ + if (!_bgImageView){ + _bgImageView = [UIImageView new]; + UIImage *image = [UIImage gradientColorImageFromColors:@[UIColorFromRGB(0xDBE3FC),UIColorFromRGB(0xF2F1FF),[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1]] gradientType:GradientTypeTopToBottom imgSize:CGSizeMake(KScreenWidth, kGetScaleWidth(216))]; + _bgImageView.image = image; + } + return _bgImageView; +} +- (UIImageView *)recordView{ + if (!_recordView){ + _recordView = [UIImageView new]; + _recordView.image = kImage(@"mine_recorded_sound_bg"); + } + return _recordView; +} +- (SGYProgressView *)progressView{ + if (!_progressView){ + _progressView = [[SGYProgressView alloc]initWithFrame:CGRectMake(0, 0, kGetScaleWidth(180), kGetScaleWidth(180)) trackWidth:kGetScaleWidth(8)]; + UIImage *image = [UIImage gradientColorImageFromColors:@[[DJDKMIMOMColor confirmButtonGradientStartColor],[DJDKMIMOMColor confirmButtonGradientMiddleColor],[DJDKMIMOMColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(kGetScaleWidth(180), kGetScaleWidth(180))]; + _progressView.progressColor = [UIColor colorWithPatternImage:image]; + _progressView.progressBgColor = [UIColor clearColor]; + } + return _progressView; +} +- (UIImageView *)maiView{ + if (!_maiView){ + _maiView = [UIImageView new]; + _maiView.image = kImage(@"mine_recorded_sound_mic"); + } + return _maiView; +} +- (SVGAImageView *)soundSVGAView { + if (_soundSVGAView == nil) { + _soundSVGAView = [[SVGAImageView alloc]init]; + _soundSVGAView.contentMode = UIViewContentModeScaleToFill; + _soundSVGAView.userInteractionEnabled = NO; + _soundSVGAView.hidden = YES; + _soundSVGAView.backgroundColor = [UIColor clearColor]; + } + return _soundSVGAView; +} +- (UILabel *)timeView{ + if (!_timeView){ + _timeView = [UILabel labelInitWithText:@"0s/60s" font:kFontSemibold(14) textColor:[DJDKMIMOMColor inputTextColor]]; + } + return _timeView; +} +- (UILabel *)promptView{ + if (!_promptView){ + _promptView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserInfoRecordedSoundView0") font:kFontRegular(14) textColor:[DJDKMIMOMColor disableButtonTextColor]]; + } + return _promptView; +} + +- (UIView *)bgRecordView{ + if (!_bgRecordView){ + _bgRecordView = [[UIView alloc] init]; + _bgRecordView.frame = CGRectMake(0,0,kGetScaleWidth(64),kGetScaleWidth(64)); + _bgRecordView.layer.backgroundColor = [UIColor clearColor].CGColor; + _bgRecordView.layer.shadowColor = [UIColor colorWithRed:225/255.0 green:232/255.0 blue:246/255.0 alpha:1.0].CGColor; + _bgRecordView.layer.shadowOffset = CGSizeMake(0,kGetScaleWidth(1)); + _bgRecordView.layer.shadowOpacity = kGetScaleWidth(1); + _bgRecordView.layer.shadowRadius = kGetScaleWidth(11); + UIView *bgView = [UIView new]; + bgView.frame = CGRectMake(0,0,kGetScaleWidth(64),kGetScaleWidth(64)); + bgView.backgroundColor = [UIColor whiteColor]; + bgView.layer.cornerRadius = kGetScaleWidth(32); + bgView.layer.masksToBounds = YES; + [_bgRecordView addSubview:bgView]; + } + return _bgRecordView; +} +-(UIButton *)completedBtn{ + if (!_completedBtn){ + _completedBtn = [UIButton new]; + _completedBtn.hidden = YES; + [_completedBtn setImage:kImage(@"mine_recorded_sound_completed") forState:UIControlStateNormal]; + [_completedBtn setImage:kImage(@"mine_recorded_sound_completeding") forState:UIControlStateSelected]; + [_completedBtn setEnlargeEdgeWithTop:20 right:20 bottom:20 left:20]; + [_completedBtn addTarget:self action:@selector(playSoundAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _completedBtn; +} +-(UIButton *)recordBtn{ + if (!_recordBtn){ + _recordBtn = [UIButton new]; + [_recordBtn setBackgroundImage:kImage(@"mine_recorded_sound_start_record") forState:UIControlStateNormal]; + [_recordBtn setBackgroundImage:kImage(@"mine_recorded_sound_recording") forState:UIControlStateSelected]; + [_recordBtn setEnlargeEdgeWithTop:20 right:20 bottom:20 left:20]; + [_recordBtn addTarget:self action:@selector(recordAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _recordBtn; +} +-(UILabel *)recordTitleView{ + if (!_recordTitleView){ + _recordTitleView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserInfoRecordedSoundView1") font:kFontRegular(14) textColor:UIColorFromRGB(0x6D6B89)]; + } + return _recordTitleView; +} +- (UIView *)bgRerecordView{ + if (!_bgRerecordView){ + _bgRerecordView = [[UIView alloc] init]; + _bgRerecordView.frame = CGRectMake(0,0,kGetScaleWidth(42),kGetScaleWidth(42)); + _bgRerecordView.layer.backgroundColor = [UIColor clearColor].CGColor; + _bgRerecordView.layer.shadowColor = [UIColor colorWithRed:225/255.0 green:232/255.0 blue:246/255.0 alpha:1.0].CGColor; + _bgRerecordView.layer.shadowOffset = CGSizeMake(0,kGetScaleWidth(1)); + _bgRerecordView.layer.shadowOpacity = kGetScaleWidth(1); + _bgRerecordView.layer.shadowRadius = kGetScaleWidth(11); + UIView *bgView = [UIView new]; + bgView.frame = CGRectMake(0,0,kGetScaleWidth(42),kGetScaleWidth(42)); + bgView.backgroundColor = [UIColor whiteColor]; + bgView.layer.cornerRadius = kGetScaleWidth(21); + bgView.layer.masksToBounds = YES; + [_bgRerecordView addSubview:bgView]; + } + return _bgRerecordView; +} +-(UIButton *)rerecordBtn{ + if (!_rerecordBtn){ + _rerecordBtn = [UIButton new]; + [_rerecordBtn setImage:kImage(@"mine_recorded_sound_rerecord") forState:UIControlStateNormal]; + [_rerecordBtn setEnlargeEdgeWithTop:20 right:20 bottom:20 left:20]; + [_rerecordBtn addTarget:self action:@selector(resetRecordAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _rerecordBtn; +} +-(UILabel *)rerecordTitleView{ + if (!_rerecordTitleView){ + _rerecordTitleView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserInfoRecordedSoundView2") font:kFontRegular(12) textColor:UIColorFromRGB(0x6D6B89)]; + } + return _rerecordTitleView; +} +-(UIView *)bgDeleteView{ + if (!_bgDeleteView){ + _bgDeleteView = [[UIView alloc] init]; + _bgDeleteView.frame = CGRectMake(0,0,kGetScaleWidth(42),kGetScaleWidth(42)); + _bgDeleteView.layer.backgroundColor = [UIColor clearColor].CGColor; + _bgDeleteView.layer.shadowColor = [UIColor colorWithRed:225/255.0 green:232/255.0 blue:246/255.0 alpha:1.0].CGColor; + _bgDeleteView.layer.shadowOffset = CGSizeMake(0,kGetScaleWidth(1)); + _bgDeleteView.layer.shadowOpacity = kGetScaleWidth(1); + _bgDeleteView.layer.shadowRadius = kGetScaleWidth(11); + UIView *bgView = [UIView new]; + bgView.frame = CGRectMake(0,0,kGetScaleWidth(42),kGetScaleWidth(42)); + bgView.backgroundColor = [UIColor whiteColor]; + bgView.layer.cornerRadius = kGetScaleWidth(21); + bgView.layer.masksToBounds = YES; + [_bgDeleteView addSubview:bgView]; + } + return _bgDeleteView; +} +-(UIButton *)deleteBtn{ + if (!_deleteBtn){ + _deleteBtn = [UIButton new]; + [_deleteBtn setImage:kImage(@"mine_recorded_sound_del") forState:UIControlStateNormal]; + [_deleteBtn setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; + [_deleteBtn addTarget:self action:@selector(deleteRecordingAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _deleteBtn; +} +-(UIButton *)saveBtn{ + if (!_saveBtn){ + _saveBtn = [UIButton new]; + [_saveBtn setImage:kImage(@"mine_recorded_sound_save") forState:UIControlStateNormal]; + [_saveBtn setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; + [_saveBtn addTarget:self action:@selector(saveRecordAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _saveBtn; +} +-(UILabel *)saveTitleView{ + if (!_saveTitleView){ + _saveTitleView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserInfoRecordedSoundView3") font:kFontRegular(12) textColor:UIColorFromRGB(0x6D6B89)]; + } + return _saveTitleView; +} +-(UILabel *)resultView{ + if (!_resultView){ + _resultView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserInfoRecordedSoundView4") font:kFontRegular(14) textColor:UIColorFromRGB(0x6D6B89)]; + } + return _resultView; +} +-(UIScrollView *)scrollView{ + if (!_scrollView){ + _scrollView = [UIScrollView new]; + + } + return _scrollView; +} +@end + + + + diff --git a/YuMi/Modules/YMMine/View/XPGiftUserDataViewController.h b/YuMi/Modules/YMMine/View/XPGiftUserDataViewController.h new file mode 100644 index 00000000..9c71099e --- /dev/null +++ b/YuMi/Modules/YMMine/View/XPGiftUserDataViewController.h @@ -0,0 +1,21 @@ +// +// XPGiftUserDataViewController.h +// xplan-ios +// +// Created by duoban on 2022/10/11. +// + +#import +#import "MvpViewController.h" +#import +NS_ASSUME_NONNULL_BEGIN +@class UserInfoModel, MineSkillCardListInfoModel, XPMineUserDataViewController; + + +@interface XPGiftUserDataViewController : MvpViewController +@property (nonatomic,copy) NSString *userUid; +///用户信息 +@property (nonatomic,strong) UserInfoModel *userInfo; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/XPGiftUserDataViewController.m b/YuMi/Modules/YMMine/View/XPGiftUserDataViewController.m new file mode 100644 index 00000000..5bc1f1cc --- /dev/null +++ b/YuMi/Modules/YMMine/View/XPGiftUserDataViewController.m @@ -0,0 +1,158 @@ +// +// XPGiftUserDataViewController.m +// xplan-ios +// +// Created by duoban on 2022/10/11. +// + +#import "XPGiftUserDataViewController.h" +///Third +#import +///Tool +#import "AccountInfoStorage.h" + +///View + +#import "XPMineDataGiftTableViewCell.h" +///Model + +#import "UserInfoModel.h" + + + +///View + +#import "XPMineUserInfoGiftWallViewController.h" + +@interface XPGiftUserDataViewController () +///列表 +@property (nonatomic,strong) UITableView *tableView; + + +@property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView); + +@end + +@implementation XPGiftUserDataViewController + +- (BOOL)isHiddenNavBar { + return YES; +} + + + +- (void)viewDidLoad { + [super viewDidLoad]; + [self initHettpRequest]; + [self initSubViews]; + [self initSubViewConstraints]; + +} +#pragma mark - Http +- (void)initHettpRequest { + +} +#pragma mark - Private Method +- (void)initSubViews { + [self.view addSubview:self.tableView]; + +} + +- (void)initSubViewConstraints { + [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.view); + }]; +} + +#pragma mark - UITableViewDelegate And UITableViewDataSource +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return 1; + +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + + return kGetScaleWidth(385); +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + + XPMineDataGiftTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineDataGiftTableViewCell class])]; + if (cell == nil) { + cell = [[XPMineDataGiftTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineDataGiftTableViewCell class])]; + } + + cell.delegate = self; + cell.userGiftWall = self.userInfo.userGiftWall; + cell.userLuckyBagGiftWall = self.userInfo.userLuckyBagGiftWall; + return cell; + +} + + + + + + + +#pragma mark - XPMineDataGiftTableViewCellDelegate +- (void)xPMineDataGiftTableViewCell:(XPMineDataGiftTableViewCell *)view didClickMore:(UIButton *)sender { + XPMineUserInfoGiftWallViewController * giftWallVC = [[XPMineUserInfoGiftWallViewController alloc] init]; + giftWallVC.userUid = self.userUid; + [self.navigationController pushViewController:giftWallVC animated:YES]; +} + + +#pragma mark - JXPagingViewListViewDelegate +- (UIView *)listView { + return self.view; +} + +- (UIScrollView *)listScrollView { + return self.tableView; +} + +- (void)listViewDidScrollCallback:(void (^)(UIScrollView *))callback { + self.scrollCallback = callback; +} + +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { + self.scrollCallback(scrollView); +} + + + + + + + +#pragma mark - Getters And Setters +- (void)setUserInfo:(UserInfoModel *)userInfo { + _userInfo = userInfo; + [self.tableView reloadData]; +// [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:UITableViewRowAnimationNone]; +} + +- (UITableView *)tableView { + if (!_tableView) { + _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; + _tableView.delegate = self; + _tableView.dataSource = self; + _tableView.tableFooterView = [UIView new]; + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + _tableView.backgroundColor = [UIColor clearColor]; + if (@available(iOS 11.0, *)) { + _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + } + [_tableView registerClass:[XPMineDataGiftTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineDataGiftTableViewCell class])]; + + } + return _tableView; +} + + +@end diff --git a/YuMi/Modules/YMMine/View/XPMineUserInfoRecordedSoundVC.h b/YuMi/Modules/YMMine/View/XPMineUserInfoRecordedSoundVC.h new file mode 100644 index 00000000..50f92d0d --- /dev/null +++ b/YuMi/Modules/YMMine/View/XPMineUserInfoRecordedSoundVC.h @@ -0,0 +1,17 @@ +// +// XPMineUserInfoRecordedSoundVC.h +// xplan-ios +// +// Created by duoban on 2022/12/29. +// + +#import "MvpViewController.h" +#import "XPSoundCardModel.h" +NS_ASSUME_NONNULL_BEGIN + +@interface XPMineUserInfoRecordedSoundVC : MvpViewController +@property (nonatomic,strong) XPSoundCardModel *__nullable soundModel; +@property (nonatomic,copy) NSString* uid; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/XPMineUserInfoRecordedSoundVC.m b/YuMi/Modules/YMMine/View/XPMineUserInfoRecordedSoundVC.m new file mode 100644 index 00000000..c24e1148 --- /dev/null +++ b/YuMi/Modules/YMMine/View/XPMineUserInfoRecordedSoundVC.m @@ -0,0 +1,466 @@ +// +// XPMineUserInfoRecordedSoundVC.m +// xplan-ios +// +// Created by duoban on 2022/12/29. +// + +#import "XPMineUserInfoRecordedSoundVC.h" +#import "XPMineUserInfoRecordedSoundView.h" +#import +#import +#import "XPMineUserInfoPresenter.h" +#import "XPMineUserInfoProtocol.h" +#import +#import "XPSkillCardPlayerManager.h" +#import "CountDownHelper.h" +#import "TTNewAlertView.h" +#import "UploadFile.h" + +UIKIT_EXTERN NSString * kUpdateSoundInfo; + +@interface XPMineUserInfoRecordedSoundVC () +@property (nonatomic,strong) XPMineUserInfoRecordedSoundView *recordSoundView; +///录音文件路径 +@property (nonatomic,copy) NSString *filePath; +///当前录音时间 +@property (nonatomic,assign) NSTimeInterval currentTime; +///总时间 +@property (nonatomic,assign) NSTimeInterval totalTime; +///titleView +@property (nonatomic,strong) UILabel *titleView; +///返回按钮 +@property (nonatomic,strong) UIButton *backBtn; +///是否正在播放录音 +@property (nonatomic,assign) BOOL isPlaying; +///播放录音倒计时 +@property (nonatomic,strong) CountDownHelper *countDownAdmin; +///是否没有保存录音文件 +@property (nonatomic,assign) BOOL isNoSave; + + + +@end + +@implementation XPMineUserInfoRecordedSoundVC + +- (XPMineUserInfoPresenter *)createPresenter { + return [[XPMineUserInfoPresenter alloc] init]; +} +- (void)dealloc { + if([NIMSDK sharedSDK].mediaManager.isRecording){ + [[NIMSDK sharedSDK].mediaManager stopRecord]; + [[XPSkillCardPlayerManager shareInstance]recoverMicroAndVoiceWithBroadcast:NO]; + }else{ + [[XPSkillCardPlayerManager shareInstance] stopMusic]; + if([XPSkillCardPlayerManager shareInstance].isMineInMic==YES && [XPSkillCardPlayerManager shareInstance].isPlay == YES){ + [[XPSkillCardPlayerManager shareInstance]recoverMicroAndVoiceWithBroadcast:YES]; + } + + } + + [self.countDownAdmin stopClockwise]; + [[NIMSDK sharedSDK].mediaManager removeDelegate:self]; +} +- (BOOL)isHiddenNavBar{ + return YES; +} +-(void)backAction{ + + TTNewAlertView *alertView = [[TTNewAlertView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; + @kWeakify(self) + alertView.confirmHandle = ^(){ + @kStrongify(self) + [self.navigationController popViewControllerAnimated:YES]; + }; + BOOL isBack = NO; + NSString *message = @""; + if([NIMSDK sharedSDK].mediaManager.isRecording){ + [self.recordSoundView recordAction]; + return; + } + if(self.isNoSave == YES){ + message = YMLocalizedString(@"XPMineUserInfoRecordedSoundVC8"); + isBack = YES; + } + if(isBack == YES){ + alertView.message = message; + [TTPopup popupView:alertView style:TTPopupStyleAlert]; + return; + } + [self.navigationController popViewControllerAnimated:YES]; +} +-(void)viewDidDisappear:(BOOL)animated{ + [super viewDidDisappear:animated]; + self.navigationController.interactivePopGestureRecognizer.enabled = YES; +} +- (void)viewDidLoad { + [super viewDidLoad]; + [self initSubViews]; + [self initSubViewConstraints]; + [self setUI]; + + + +} +#pragma mark - Private Method +- (void)initSubViews { + self.view.backgroundColor = [UIColor whiteColor]; + [self.view addSubview:self.recordSoundView]; + [self.view addSubview:self.titleView]; + [self.view addSubview:self.backBtn]; + [[NIMSDK sharedSDK].mediaManager addDelegate:self]; + [NIMSDK sharedSDK].mediaManager.recordProgressUpdateTimeInterval = 0.01; + self.countDownAdmin.delegate = self; + self.countDownAdmin.seconds = 0.01; + self.isNoSave = NO; + self.totalTime = 60.0; + +} +- (void)initSubViewConstraints { + [self.titleView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(kGetScaleWidth(54)); + make.centerX.equalTo(self.view); + }]; + [self.backBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(kGetScaleWidth(28)); + make.centerY.equalTo(self.titleView); + make.left.mas_equalTo(kGetScaleWidth(20)); + }]; +} +#pragma mark -XPMineUserInfoProtocol +- (void)uploadVoiceFileToThirdSuccess:(NSString *)fileUrl{ + NSInteger getCurrentTime = ceil(self.totalTime); + [self.presenter saveSoundWithUrl:fileUrl second:[NSString stringWithFormat:@"%ld",getCurrentTime]]; +} + +- (void)uploadVoiceFileFail:(NSString *)message{ + [XNDJTDDLoadingTool hideOnlyView:self.view]; + [self showErrorToast:message]; +} + +///保存声音成功 +-(void)saveSoundSuccess:(NSString *)fileUrl{ + [XNDJTDDLoadingTool hideOnlyView:self.view]; + [self showSuccessToast:YMLocalizedString(@"XPMineUserInfoRecordedSoundVC4")]; + [self.recordSoundView uploadRecordSuccess:NO]; + self.soundModel = [XPSoundCardModel new]; + self.soundModel.uid = self.uid; + self.soundModel.audioUrl = fileUrl; + NSInteger getCurrentTime = ceil(self.totalTime); + self.soundModel.second = getCurrentTime ?: 0; + self.soundModel.status = 1; + self.isNoSave = NO; + self.navigationController.interactivePopGestureRecognizer.enabled = YES; + [[NSNotificationCenter defaultCenter]postNotificationName:kUpdateSoundInfo object:self.soundModel]; +} +///保存声音失败 +-(void)saveSoundFailWithMsg:(NSString *)msg{ + [XNDJTDDLoadingTool hideOnlyView:self.view]; + [self showErrorToast:msg]; +} +-(void)deleteSoundSuccess{ + [self showSuccessToast:YMLocalizedString(@"XPMineUserInfoRecordedSoundVC5")]; + [self resetRecordAudio]; + self.soundModel = nil; + [[NSNotificationCenter defaultCenter]postNotificationName:kUpdateSoundInfo object:nil]; +} +-(void)setUI{ + if(self.soundModel.status == 1 || self.soundModel.status == 2){ + [self.recordSoundView uploadRecordSuccess:self.soundModel.status == 2]; + self.filePath = self.soundModel.audioUrl; + self.totalTime = self.soundModel.second; + self.currentTime = 0; + NSInteger getCurrentTime = ceil(self.totalTime); + [self.recordSoundView recordingWithTime:[NSString stringWithFormat:@"0s/%lds",getCurrentTime] progress:0 animated:NO]; + } +} +#pragma mark -CountDownHelperDelegate +///顺计时结束 +- (void)onClockwiseFinish{ + [self stopPlayAudioCompleted]; +} +///顺计时进行 +- (void)onClockwiseOpen:(CGFloat)time{ + NSInteger getValue = floor(time); + NSInteger getCurrentTime = ceil(self.totalTime); + if(getValue > getCurrentTime){ + getValue = getCurrentTime; + } + [self.recordSoundView recordingWithTime:[NSString stringWithFormat:@"%lds/%lds",getValue,getCurrentTime] progress:time / getCurrentTime animated:NO]; +} + + + +#pragma mark - XPMineUserInfoRecordedSoundViewDelegate +-(void)startRecordAudio{ + AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio]; + if(authStatus != AVAuthorizationStatusAuthorized){ + [self.recordSoundView stopRecord]; + [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted){ + if(!granted){ + dispatch_async(dispatch_get_main_queue(), ^{ + TTAlertConfig *config = [[TTAlertConfig alloc]init]; + config.message = YMLocalizedString(@"XPMineUserInfoRecordedSoundVC0"); + [TTPopup alertWithConfig:config showBorder:NO confirmHandler:^{ + NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; + if( [[UIApplication sharedApplication]canOpenURL:url] ) { + [[UIApplication sharedApplication]openURL:url options:@{}completionHandler:^(BOOL success) { + }]; + } + + } cancelHandler:^{ + + }]; + }); + + }else{ + dispatch_async(dispatch_get_main_queue(), ^{ + [self startRecordAction]; + }); + + } + }]; + return; + } + [self startRecordAction]; +} +-(void)startRecordAction{ + if([XPSkillCardPlayerManager shareInstance].isMineInMic == YES){ + [[XPSkillCardPlayerManager shareInstance]closeMicroAndVoiceWithBroadcast:NO]; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + [[NIMSDK sharedSDK].mediaManager recordForDuration:self.totalTime]; + [self.recordSoundView startRecord]; + }); + return; + } + [[NIMSDK sharedSDK].mediaManager recordForDuration:self.totalTime]; + [self.recordSoundView startRecord]; +} +-(void)stopRecordAudio{ + [[NIMSDK sharedSDK].mediaManager stopRecord]; +} +-(void)resetRecordAudio{ + self.isNoSave = NO; + self.navigationController.interactivePopGestureRecognizer.enabled = YES; + [self.countDownAdmin stopClockwise]; + [[XPSkillCardPlayerManager shareInstance] stopMusic]; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + self.filePath = nil; + self.currentTime = 0; + self.totalTime = 60.0; + [self.recordSoundView recordingWithTime:[NSString stringWithFormat:@"%.0fs/%.0fs",0.0,self.totalTime] progress:0 animated:NO]; + [self.recordSoundView resetRecord]; + }); + + +} +-(void)playRecordAudio{ + if(self.filePath.length==0)return; + [self.recordSoundView playRecord]; + NSInteger getCurrentTime = ceil(self.totalTime); + [self.recordSoundView recordingWithTime:[NSString stringWithFormat:@"0s/%lds",getCurrentTime] progress:0 animated:NO]; + if (!self.isPlaying) { + if(![self.filePath containsString:@"http"]){ + [self playAudioWithUrl:self.filePath time:(int)getCurrentTime isDelay:[XPSkillCardPlayerManager shareInstance].isMineInMic]; + return; + } + + NSString *fileName = [[self.filePath componentsSeparatedByString:@"/"] lastObject]; + NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) safeObjectAtIndex1:0] stringByAppendingPathComponent:@"kMineSoundCard"]; + NSString *fullPath = [filePath stringByAppendingPathComponent:fileName]; + if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath]) { + [self playAudioWithUrl:fullPath time:(int)getCurrentTime isDelay:[XPSkillCardPlayerManager shareInstance].isMineInMic]; + + } else { + if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) { + NSFileManager *fileMgr = [[NSFileManager alloc] init]; + [fileMgr createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil]; + } + [UploadFile downloadAudioWithFileName:fileName musicUrl:self.filePath mainFileName:@"kMineSoundCard" completion:^(BOOL isSuccess, NSString *editAudioPath) { + if(isSuccess){ + [self playAudioWithUrl:editAudioPath time:(int)getCurrentTime isDelay:[XPSkillCardPlayerManager shareInstance].isMineInMic]; + + }else{ + [self stopPlayAudioCompleted]; + } + + + }]; + } + + } else { + [self stopPlayAudioCompleted]; + + } + + + + +} +/// 播放录音 +/// - Parameters: +/// - url: 录音链接 +/// - time: 录音时间 +/// - isDelay: 是否延时0.5秒播放录音,因为如果在麦上的话,需要先关麦再播放,所以要延时0.5秒来关麦后再播放,不然会没声音 +-(void)playAudioWithUrl:(NSString*)url time:(int)time isDelay:(BOOL)isDelay{ + if(isDelay == YES){ + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + self.isPlaying = YES; + [self.countDownAdmin openClockwiseWithTime:time]; + }); + [[XPSkillCardPlayerManager shareInstance] playerNewVoiceWithPath:url completionBlock:^{ + + }]; + return; + } + self.isPlaying = YES; + [self.countDownAdmin openClockwiseWithTime:time]; + [[XPSkillCardPlayerManager shareInstance] playerVoiceWithPath:url completionBlock:^{ + + }]; +} +-(void)stopPlayRecordAudio{ + + [[XPSkillCardPlayerManager shareInstance]recoverMicroAndVoiceWithBroadcast:[XPSkillCardPlayerManager shareInstance].isMineInMic]; + [self stopPlayAudioCompleted]; + +} +- (void)deleteRecordingAudio{ + + TTNewAlertView *alertView = [[TTNewAlertView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; + @kWeakify(self) + alertView.confirmHandle = ^(){ + @kStrongify(self) + [self.presenter deleteSound]; + }; + alertView.message = YMLocalizedString(@"XPMineUserInfoRecordedSoundVC6"); + + [TTPopup popupView:alertView style:TTPopupStyleAlert]; +} +-(void)saveRecordAudio{ + + if(self.filePath.length > 0){ + [XNDJTDDLoadingTool showOnlyView:self.view]; + [self.presenter uploadVoice:self.filePath]; + }else{ + [self showErrorToast:YMLocalizedString(@"XPMineUserInfoRecordedSoundVC3")]; + } + +} +///播放录音完成 +-(void)stopPlayAudioCompleted{ + [self.countDownAdmin stopClockwise]; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + [self.recordSoundView stopPlayRecord]; + self.isPlaying = NO; + self.currentTime = 0; + NSInteger getCurrentTime = ceil(self.totalTime); + [self.recordSoundView recordingWithTime:[NSString stringWithFormat:@"0s/%lds",getCurrentTime] progress:0 animated:NO]; + [[XPSkillCardPlayerManager shareInstance] stopMusic]; + }); + +} +#pragma mark - NIMMediaManagerDelegate +/** + * 开始录制音频的回调 + * + * @param filePath 录制的音频的文件路径 + * @param error 错误信息 + * @discussion 如果录音失败,filePath 有可能为 nil + */ +- (void)recordAudio:(nullable NSString *)filePath didBeganWithError:(nullable NSError *)error{ + +} +/** + * 录制音频完成后的回调 + * + * @param filePath 录制完成的音频文件路径 + * @param error 错误信息 + */ +- (void)recordAudio:(nullable NSString *)filePath didCompletedWithError:(nullable NSError *)error{ + if([XPSkillCardPlayerManager shareInstance].isMineInMic == YES){ + [[XPSkillCardPlayerManager shareInstance]recoverMicroAndVoiceWithBroadcast:NO]; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + [self recordAudioCompletedActionWiftFilePath:filePath]; + }); + return; + } + [self recordAudioCompletedActionWiftFilePath:filePath]; +} + +-(void)recordAudioCompletedActionWiftFilePath:(nullable NSString *)filePath{ + if(self.currentTime < 1){ + self.filePath = nil; + self.currentTime = 0; + [self showErrorToast:YMLocalizedString(@"XPMineUserInfoRecordedSoundVC1")]; + [self.recordSoundView recordingWithTime:[NSString stringWithFormat:@"%.0fs/%.0fs",0.0,self.totalTime] progress:0 animated:NO]; + [self.recordSoundView stopRecord]; + + return; + } + self.isNoSave = YES; + if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { + self.navigationController.interactivePopGestureRecognizer.enabled = NO; + } + self.filePath = filePath; + self.totalTime = self.currentTime; + self.currentTime = 0; + NSInteger getCurrentTime = ceil(self.totalTime); + [self.recordSoundView recordingWithTime:[NSString stringWithFormat:@"0s/%lds",getCurrentTime] progress:0 animated:NO]; + [self.recordSoundView recordCompleted]; + +} + + +/** + * 音频录制进度更新回调 + * + * @param currentTime 当前录制的时间 + */ +- (void)recordAudioProgress:(NSTimeInterval)currentTime{ + self.currentTime = currentTime; + if(self.currentTime > 60){ + self.currentTime = 60; + } + NSInteger getCurrentTime = ceil(self.currentTime); + [self.recordSoundView recordingWithTime:[NSString stringWithFormat:@"%lds/%.0fs",getCurrentTime,self.totalTime] progress:currentTime / self.totalTime animated:NO]; +} + + +#pragma mark -懒加载 +- (XPMineUserInfoRecordedSoundView *)recordSoundView{ + if (!_recordSoundView){ + _recordSoundView = [[XPMineUserInfoRecordedSoundView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; + _recordSoundView.delegate = self; + } + return _recordSoundView; +} +-(UILabel *)titleView{ + if (!_titleView){ + _titleView = [UILabel labelInitWithText:YMLocalizedString(@"XPMineUserInfoRecordedSoundVC2") font:kFontSemibold(17) textColor:[DJDKMIMOMColor inputTextColor]]; + + } + return _titleView; +} +-(UIButton *)backBtn{ + if (!_backBtn){ + _backBtn = [UIButton new]; + [_backBtn setImage:kImage(@"common_nav_back") forState:UIControlStateNormal]; + [_backBtn setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; + [_backBtn addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _backBtn; +} +-(CountDownHelper *)countDownAdmin{ + if (!_countDownAdmin){ + _countDownAdmin = [CountDownHelper new]; + } + return _countDownAdmin; +} +@end diff --git a/YuMi/Modules/YMMine/View/XPMineUserInfoTagVC.h b/YuMi/Modules/YMMine/View/XPMineUserInfoTagVC.h new file mode 100644 index 00000000..5b2efa21 --- /dev/null +++ b/YuMi/Modules/YMMine/View/XPMineUserInfoTagVC.h @@ -0,0 +1,25 @@ +// +// XPMineUserInfoTagVC.h +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import "MvpViewController.h" +#import "XPMineUserInfoTagModel.h" +NS_ASSUME_NONNULL_BEGIN +@class XPMineUserInfoTagVC; +@protocol XPMineUserInfoTagVCDelegate + +- (void)xPMineUserInfoTagVC:(XPMineUserInfoTagVC *)vc didClickComplete:(NSArray *)meLabels; + +@end + + +@interface XPMineUserInfoTagVC : MvpViewController +@property (nonatomic,strong) XPMineUserInfoTagModel *tagModel; +/// +@property (nonatomic,weak) id delegate; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/XPMineUserInfoTagVC.m b/YuMi/Modules/YMMine/View/XPMineUserInfoTagVC.m new file mode 100644 index 00000000..6775ca4f --- /dev/null +++ b/YuMi/Modules/YMMine/View/XPMineUserInfoTagVC.m @@ -0,0 +1,140 @@ +// +// XPMineUserInfoTagVC.m +// xplan-ios +// +// Created by duoban on 2023/2/15. +// + +#import "XPMineUserInfoTagVC.h" +///view +#import "XPMineUserInfoTagHeadView.h" +#import "XPMineUserInfoNavView.h" +#import "XPMineUserInfoTagView.h" +#import "XPMineUserInfoPresenter.h" +#import "XPMineUserInfoProtocol.h" +@interface XPMineUserInfoTagVC () +///头部 +@property (nonatomic,strong) XPMineUserInfoTagHeadView *headView; +///导航栏 +@property (nonatomic,strong) XPMineUserInfoNavView *navView; +/// +@property (nonatomic,strong) XPMineUserInfoTagView *tagVeiw; +/// +@property (nonatomic,copy) NSArray *meLabels; +@end + +@implementation XPMineUserInfoTagVC +- (BOOL)isHiddenNavBar { + return YES; +} +- (XPMineUserInfoPresenter *)createPresenter { + return [[XPMineUserInfoPresenter alloc] init]; +} +-(void)viewWillDisappear:(BOOL)animated{ + [super viewWillAppear:animated]; + self.tagModel.meLabels = self.meLabels; +} +- (void)viewDidLoad { + [super viewDidLoad]; + [self initSubViews]; + [self initSubViewConstraints]; + [self requestData]; + + + +} +-(void)requestData{ + + + [self.presenter getTagList]; +} +#pragma mark - XPMineUserInfoTagView +-(void)didingSelectTag{ + self.headView.tagModel = self.self.tagVeiw.tagModel; +} +-(void)setTagModel:(XPMineUserInfoTagModel *)tagModel{ + _tagModel = tagModel; + self.meLabels = self.tagModel.meLabels; + self.headView.tagModel = _tagModel; + self.tagVeiw.tagModel = _tagModel; +} +#pragma mark - XPMineUserInfoEditProtocol +-(void)saveTagListSuccess{ + self.meLabels = self.tagModel.meLabels; + [self showSuccessToast:YMLocalizedString(@"XPMineUserInfoTagVC2")]; + + if(self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoTagVC:didClickComplete:)]){ + [self.delegate xPMineUserInfoTagVC:self didClickComplete:self.meLabels]; + } + [self.navigationController popViewControllerAnimated:YES]; +} +-(void)getTagListSuccess:(XPMineUserInfoTagModel *)model{ + + self.tagModel = model; + + +} +#pragma mark - XPMineUserInfoNavViewDelegate +- (void)xPMineUserInfoNavView:(XPMineUserInfoNavView *)view didClickBack:(UIButton *)sender{ + [self.navigationController popViewControllerAnimated:YES]; +} +- (void)xPMineUserInfoNavView:(XPMineUserInfoNavView *)view didClickComplete:(UIButton *)sender{ + NSArray *meLabels = self.tagVeiw.tagModel.meLabels; + NSString *tagStr = @""; + for (int i = 0; i < meLabels.count; i++) { + NSString *text = meLabels[i]; + if(text.length > 0){ + if(i == 0){ + tagStr = meLabels[i]; + }else{ + tagStr = [NSString stringWithFormat:@"%@,%@",tagStr,meLabels[i]]; + } + } + + } + [self.presenter saveTagListWithLabels:tagStr]; +} +#pragma mark - Private Method +- (void)initSubViews { + [self.view addSubview:self.headView]; + [self.view addSubview:self.navView]; + [self.view addSubview:self.tagVeiw]; +} +- (void)initSubViewConstraints { + [self.headView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.equalTo(self.view); + make.height.mas_equalTo(kGetScaleWidth(304)); + }]; + [self.navView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.equalTo(self.view); + make.height.mas_equalTo(kNavigationHeight); + }]; + [self.tagVeiw mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.bottom.right.equalTo(self.view); + make.top.equalTo(self.headView.mas_bottom); + + }]; +} +#pragma mark -懒加载 +- (XPMineUserInfoNavView *)navView{ + if (!_navView){ + _navView = [[XPMineUserInfoNavView alloc]initWithFrame:CGRectZero]; + _navView.delegate = self; + } + return _navView; +} +- (XPMineUserInfoTagHeadView *)headView{ + if (!_headView){ + _headView = [[XPMineUserInfoTagHeadView alloc]initWithFrame:CGRectZero]; + + } + return _headView; +} +- (XPMineUserInfoTagView *)tagVeiw{ + if (!_tagVeiw){ + _tagVeiw = [[XPMineUserInfoTagView alloc]initWithFrame:CGRectZero]; + _tagVeiw.delegate = self; + } + return _tagVeiw; +} +@end diff --git a/YuMi/Modules/YMMonents/Presenter/XPMonentsLayoutConfig.h b/YuMi/Modules/YMMonents/Presenter/XPMonentsLayoutConfig.h index d5f3bfc6..46e3e471 100644 --- a/YuMi/Modules/YMMonents/Presenter/XPMonentsLayoutConfig.h +++ b/YuMi/Modules/YMMonents/Presenter/XPMonentsLayoutConfig.h @@ -1,23 +1,24 @@ // -// YMMonentsLayoutConfig.h -// YUMI +// XPMonentsLayoutConfig.h +// xplan-ios // -// Created by YUMI on 2022/5/12. +// Created by 冯硕 on 2022/5/12. // #import -#import "YUMIMacroUitls.h" NS_ASSUME_NONNULL_BEGIN -#define kMONENTS_CONTENT_LEFT_PADDING 67 -#define kMONENTS_CONTENT_RIGHT_PADDING 36 +#define kMONENTS_CONTENT_LEFT_PADDING 18 +#define kMONENTS_CONTENT_RIGHT_PADDING 18 #define kMONENTS_CONTENT_MAX_WIDTH (KScreenWidth - kMONENTS_CONTENT_LEFT_PADDING - kMONENTS_CONTENT_RIGHT_PADDING) -#define kMONENTS_PIC_ONE_WIDTH 200 ///只有一个动态图片的高度 +#define kMONENTS_PIC_ONE_WIDTH 109 ///只有一个动态图片的高度 #define kMONENTS_PIC_SPACE 4 ///图片之间的间隙的宽度或者高度 -#define kMONENTS_USER_INFO_HEIGHT 60 ///用户信息的高度 +#define kMONENTS_USER_INFO_HEIGHT 50 ///用户信息的高度 #define kMONENTS_TOOL_BAR_HEIGHT 58 ///底部操作栏的高度 #define kMONENTS_CONTENT_SPACAE_HEIGHT 12 /// 每个内容之间下面的间隙的高度 -#define kMONENTS_TEXT_TOPIC_HEIGHT 20 /// 话题的高度 +#define kMONENTS_TEXT_TOPIC_HEIGHT 15 /// 话题的高度 #define kMONENTS_FOLD_HEIGHT 20 /// 展开 关闭的高度 +#define kMONENTS_Time_HEIGHT 14 /// 时间 +#define kMONENTS_Content_Text_Space 5 /// 内容 展开按钮 时间的间隙 #pragma mark - 评论的配置 #define kMONENTS_COMMENT_LEFT_PADDING 15 ///评论左的间隙 #define kMONENTS_COMMENT_RIGHT_PADDING 25 ///评论右的间隙 @@ -29,21 +30,15 @@ NS_ASSUME_NONNULL_BEGIN #define kMONENTS_COMMENT_REPLY_LEFT_PADDING (kMONENTS_COMMENT_LEFT_PADDING + kMONENTS_COMMENT_RIGHT_PADDING + kMONENTS_COMMENT_AVATAR_NICK_PADDING) ///回复这左边的间隙 #define KMONENTS_COMMENT_REPLY_MAX_WIDTH (KMONENTS_COMMENT_MAX_WIDTH - KMONENTS_COMMENT_REPLY_AVATAR_WIDTH - kMONENTS_COMMENT_AVATAR_NICK_PADDING) ///评论回复内容的最大宽度 -#pragma mark - 审核UI配置 -#define kSIMPLE_MONENTS_CONTENT_LEFT_PADDING 16 ///动态内容左边间距 -#define kSIMPLE_MONENTS_CONTENT_RIGHT_PADDING 16 ///动态内容右边间距 -#define kSIMPLE_MONENTS_CONTENT_MAX_WIDTH (KScreenWidth - kSIMPLE_MONENTS_CONTENT_LEFT_PADDING - kSIMPLE_MONENTS_CONTENT_RIGHT_PADDING) ///动态内容最大宽度 - -#define KSIMPLE_MONENTS_COMMENT_AVATAR_WIDTH 40 ///评论的头像大小 - @class MonentsInfoModel, MonentsCommentModel; @interface XPMonentsLayoutConfig : NSObject -+ (void)layoutSimpleMonentsModel:(MonentsInfoModel *)monents; + (void)layoutMonentsModel:(MonentsInfoModel *)monents; + (CGFloat)monentsPicHeight:(MonentsInfoModel *)monents; + (CGFloat)monentsContentHeight:(MonentsInfoModel *)monents; ///计算评论的高度 + (CGFloat)commentCommentRowHeight:(MonentsCommentModel * )comment; ++ (void)layoutMonentsModelWithDynamic:(MonentsInfoModel *)monents; ++ (void)getNewlayoutMonentsModelWithDynamic:(MonentsInfoModel *)monents; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMonents/Presenter/XPMonentsLayoutConfig.m b/YuMi/Modules/YMMonents/Presenter/XPMonentsLayoutConfig.m index ee3d1cc3..b68838b6 100644 --- a/YuMi/Modules/YMMonents/Presenter/XPMonentsLayoutConfig.m +++ b/YuMi/Modules/YMMonents/Presenter/XPMonentsLayoutConfig.m @@ -1,78 +1,113 @@ // -// YMMonentsLayoutConfig.m -// YUMI +// XPMonentsLayoutConfig.m +// xplan-ios // -// Created by YUMI on 2022/5/12. +// Created by 冯硕 on 2022/5/12. // #import "XPMonentsLayoutConfig.h" #import -#import "DJDKMIMOMColor.h" + ///Model #import "MonentsInfoModel.h" #import "MonentsCommentModel.h" #import "QEmotionHelper.h" @implementation XPMonentsLayoutConfig - -#pragma mark - 审核的布局 - -+ (void)layoutSimpleMonentsModel:(MonentsInfoModel *)monents { - CGFloat rowHeight = kMONENTS_CONTENT_SPACAE_HEIGHT; ++ (void)getNewlayoutMonentsModelWithDynamic:(MonentsInfoModel *)monents { + CGFloat rowHeight = 10; + ///用户信息和文字之间的间隙 + rowHeight += kMONENTS_CONTENT_SPACAE_HEIGHT; ///文字内容的高度 - rowHeight += [self simpleMonentsContentHeight:monents]; + rowHeight += [self monentsContentHeight:monents]; + ///图片的高度 + rowHeight += [self getNewMonentsPicHeight:monents]; + ///如果没有图片的话 间隙就只有一个 + if (monents.type == MonentsContentType_Picture && monents.content.length > 0) { + rowHeight += (kMONENTS_CONTENT_SPACAE_HEIGHT); + } + ///话题的高度 + if (monents.worldId > 0) { + rowHeight += kMONENTS_TEXT_TOPIC_HEIGHT; + } + ///底部操作栏的高度 + rowHeight += kMONENTS_TOOL_BAR_HEIGHT; + monents.rowHeight = rowHeight; +} ++ (void)layoutMonentsModelWithDynamic:(MonentsInfoModel *)monents { + CGFloat rowHeight = 10; + ///用户信息和文字之间的间隙 + rowHeight += kMONENTS_CONTENT_SPACAE_HEIGHT; + ///文字内容的高度 + rowHeight += [self monentsContentHeight:monents]; ///图片的高度 rowHeight += [self monentsPicHeight:monents]; ///如果没有图片的话 间隙就只有一个 if (monents.type == MonentsContentType_Picture && monents.content.length > 0) { - rowHeight += (kMONENTS_CONTENT_SPACAE_HEIGHT * 2); - }else { - rowHeight += kMONENTS_CONTENT_SPACAE_HEIGHT; + rowHeight += (kMONENTS_CONTENT_SPACAE_HEIGHT); } ///话题的高度 - rowHeight += kMONENTS_TEXT_TOPIC_HEIGHT; + if (monents.worldId > 0) { + rowHeight += kMONENTS_TEXT_TOPIC_HEIGHT; + } + ///底部操作栏的高度 + rowHeight += kMONENTS_TOOL_BAR_HEIGHT; monents.rowHeight = rowHeight; } -+ (CGFloat)simpleMonentsContentHeight:(MonentsInfoModel *)monents { - if (monents.content.length <= 0) { - monents.contentHeight = 0; - return 0; ++ (void)layoutMonentsModel:(MonentsInfoModel *)monents { + CGFloat rowHeight = kMONENTS_USER_INFO_HEIGHT; + ///用户信息和文字之间的间隙 + rowHeight += kMONENTS_CONTENT_SPACAE_HEIGHT; + ///文字内容的高度 + rowHeight += [self monentsContentHeight:monents]; + ///图片的高度 + rowHeight += [self monentsPicHeight:monents]; + ///如果没有图片的话 间隙就只有一个 + if (monents.type == MonentsContentType_Picture) { + rowHeight += 8; //stackView设置的space=8 } - ///计算文本的高度 - if (!monents.contentAttribute) { - NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init]; - if (monents.squareTop ) {//动态/广场 - NSTextAttachment * attachment = [[NSTextAttachment alloc] init]; - attachment.bounds = CGRectMake(0, 0, 25 * 1.3 ,10 * 1.3); - attachment.image = [UIImage imageNamed:@"monents_info_top"]; - NSAttributedString * starAttribute = [NSMutableAttributedString attributedStringWithAttachment:(NSTextAttachment *)attachment]; - [attributedString insertAttributedString:starAttribute atIndex:0]; - } - [attributedString appendAttributedString:[self creatStrAttrByStr:monents.content attributed:@{NSFontAttributeName : [UIFont systemFontOfSize:15]}]]; - attributedString.yy_lineSpacing = 5; - attributedString.yy_lineBreakMode = NSLineBreakByWordWrapping; - monents.contentAttribute = attributedString; + ///话题的高度 + if (monents.worldId > 0) { + rowHeight += kMONENTS_TEXT_TOPIC_HEIGHT; + rowHeight += (kMONENTS_CONTENT_SPACAE_HEIGHT); } + ///底部操作栏的高度 + rowHeight += kMONENTS_TOOL_BAR_HEIGHT; - YYTextContainer *container = [YYTextContainer new]; - container.size = CGSizeMake(kSIMPLE_MONENTS_CONTENT_MAX_WIDTH, CGFLOAT_MAX); - container.maximumNumberOfRows = 0; - YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:monents.contentAttribute]; - monents.numberOfText = layout.rowCount; - CGFloat foldHeight = 0; - if (layout.rowCount > 6) { - foldHeight = kMONENTS_FOLD_HEIGHT; - NSInteger numberOfLines = monents.isFold ? 6 : 0; - container.maximumNumberOfRows = numberOfLines; - } - YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:monents.contentAttribute]; - CGFloat contentHeight = realLayout.textBoundingSize.height; - monents.contentHeight =contentHeight; - return contentHeight + foldHeight; + ///时间高度,cell在约束文本内容的stackView时,直接加了24,这里统一 + rowHeight += 24; + + monents.rowHeight = rowHeight; } - -+ (CGFloat)simpleMonentsPicHeight:(MonentsInfoModel *)monents { ++ (CGFloat)getNewMonentsPicHeight:(MonentsInfoModel *)monents { + ///计算图片的高度 + NSInteger picCount = monents.dynamicResList.count; + CGFloat picHeight = 0; + CGFloat width = KScreenWidth-27*2; + if (picCount == 0) { + picHeight = 0; + } else if(picCount == 1) { + picHeight = width; + } else if(picCount == 2) { + picHeight = (width - kMONENTS_PIC_SPACE) / 2; + } else { + if (picCount > 9) { + picCount = 9; + } + CGFloat itemWidth = (width - kMONENTS_PIC_SPACE * 2) / 3; + NSInteger page = picCount % 3; + NSInteger line = picCount / 3; + if (page == 0) { + picHeight = itemWidth * line + (line -1)* kMONENTS_PIC_SPACE; + } else { + picHeight = itemWidth * (line +1) + line * kMONENTS_PIC_SPACE; + } + } + monents.picHeight = picHeight; + return picHeight; +} ++ (CGFloat)monentsPicHeight:(MonentsInfoModel *)monents { ///计算图片的高度 NSInteger picCount = monents.dynamicResList.count; CGFloat picHeight = 0; @@ -81,12 +116,12 @@ } else if(picCount == 1) { picHeight = kMONENTS_PIC_ONE_WIDTH; } else if(picCount == 2) { - picHeight = (kSIMPLE_MONENTS_CONTENT_MAX_WIDTH - kMONENTS_PIC_SPACE) / 2; + picHeight = (kMONENTS_CONTENT_MAX_WIDTH - kMONENTS_PIC_SPACE) / 2; } else { if (picCount > 9) { picCount = 9; } - CGFloat itemWidth = (kSIMPLE_MONENTS_CONTENT_MAX_WIDTH - kMONENTS_PIC_SPACE * 2) / 3; + CGFloat itemWidth = (kMONENTS_CONTENT_MAX_WIDTH - kMONENTS_PIC_SPACE * 2) / 3; NSInteger page = picCount % 3; NSInteger line = picCount / 3; if (page == 0) { @@ -99,153 +134,105 @@ return picHeight; } -#pragma mark - 正常的布局 - -+ (void)layoutMonentsModel:(MonentsInfoModel *)monents { - CGFloat rowHeight = kMONENTS_USER_INFO_HEIGHT; - ///用户信息和文字之间的间隙 - rowHeight += kMONENTS_CONTENT_SPACAE_HEIGHT; - ///文字内容的高度 - rowHeight += [self monentsContentHeight:monents]; - ///图片的高度 - rowHeight += [self monentsPicHeight:monents]; - ///如果没有图片的话 间隙就只有一个 - if (monents.type == MonentsContentType_Picture && monents.content.length > 0) { - rowHeight += (kMONENTS_CONTENT_SPACAE_HEIGHT * 2); - }else { - rowHeight += kMONENTS_CONTENT_SPACAE_HEIGHT; - } - ///话题的高度 - rowHeight += kMONENTS_TEXT_TOPIC_HEIGHT; - ///底部操作栏的高度 - rowHeight += kMONENTS_TOOL_BAR_HEIGHT; - monents.rowHeight = rowHeight; -} - -+ (CGFloat)monentsPicHeight:(MonentsInfoModel *)monents { - ///计算图片的高度 - NSInteger picCount = monents.dynamicResList.count; - CGFloat picHeight = 0; - if (picCount == 0) { - picHeight = 0; - } else if(picCount == 1) { - picHeight = kMONENTS_PIC_ONE_WIDTH; - } else if(picCount == 2) { - picHeight = (kMONENTS_CONTENT_MAX_WIDTH - kMONENTS_PIC_SPACE) / 2; - } else { - if (picCount > 9) { - picCount = 9; - } - CGFloat itemWidth = (kMONENTS_CONTENT_MAX_WIDTH - kMONENTS_PIC_SPACE * 2) / 3; - NSInteger page = picCount % 3; - NSInteger line = picCount / 3; - if (page == 0) { - picHeight = itemWidth * line + (line -1)* kMONENTS_PIC_SPACE; - } else { - picHeight = itemWidth * (line +1) + line * kMONENTS_PIC_SPACE; - } - } - monents.picHeight = picHeight; - return picHeight; -} - + (CGFloat)monentsContentHeight:(MonentsInfoModel *)monents { - if (monents.content.length <= 0) { - monents.contentHeight = 0; - return 0; - } - ///计算文本的高度 - if (!monents.contentAttribute) { - NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init]; - if (monents.squareTop ) {//动态/广场 - NSTextAttachment * attachment = [[NSTextAttachment alloc] init]; - attachment.bounds = CGRectMake(0, 0, 25 * 1.3 ,10 * 1.3); - attachment.image = [UIImage imageNamed:@"monents_info_top"]; - NSAttributedString * starAttribute = [NSMutableAttributedString attributedStringWithAttachment:(NSTextAttachment *)attachment]; - [attributedString insertAttributedString:starAttribute atIndex:0]; - } - [attributedString appendAttributedString:[self creatStrAttrByStr:monents.content attributed:@{NSFontAttributeName : [UIFont systemFontOfSize:15]}]]; - attributedString.yy_lineSpacing = 5; - attributedString.yy_lineBreakMode = NSLineBreakByWordWrapping; - monents.contentAttribute = attributedString; - } - - YYTextContainer *container = [YYTextContainer new]; - container.size = CGSizeMake(kMONENTS_CONTENT_MAX_WIDTH, CGFLOAT_MAX); - container.maximumNumberOfRows = 0; - YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:monents.contentAttribute]; - monents.numberOfText = layout.rowCount; - CGFloat foldHeight = 0; - if (layout.rowCount > 6) { - foldHeight = kMONENTS_FOLD_HEIGHT; - NSInteger numberOfLines = monents.isFold ? 6 : 0; - container.maximumNumberOfRows = numberOfLines; - } - YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:monents.contentAttribute]; - CGFloat contentHeight = realLayout.textBoundingSize.height; - monents.contentHeight =contentHeight; - return contentHeight + foldHeight; + if (monents.content.length <= 0) { + monents.contentHeight = 0; + return 0; + } + ///计算文本的高度 + if (!monents.contentAttribute) { + NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init]; + if (monents.squareTop ) {//动态/广场 + NSTextAttachment * attachment = [[NSTextAttachment alloc] init]; + attachment.bounds = CGRectMake(0, 0, 10, 12); + attachment.image = [UIImage imageNamed:@"monents_info_top"]; + NSAttributedString * starAttribute = [NSMutableAttributedString attributedStringWithAttachment:(NSTextAttachment *)attachment]; + [attributedString insertAttributedString:starAttribute atIndex:0]; + //将图片插入到合适的位置 + [attributedString appendAttributedString:[self creatStrAttrByStr:YMLocalizedString(@"XPMonentsLayoutConfig0") attributed:@{NSFontAttributeName : [UIFont systemFontOfSize:15], NSForegroundColorAttributeName: UIColorFromRGB(0xE84C46)}]]; + } + [attributedString appendAttributedString:[self creatStrAttrByStr:monents.content attributed:@{NSFontAttributeName : [UIFont systemFontOfSize:15]}]]; + attributedString.yy_lineSpacing = 5; + attributedString.yy_lineBreakMode = NSLineBreakByWordWrapping; + monents.contentAttribute = attributedString; + } + + YYTextContainer *container = [YYTextContainer new]; + container.size = CGSizeMake(kMONENTS_CONTENT_MAX_WIDTH, CGFLOAT_MAX); + container.maximumNumberOfRows = 0; + YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:monents.contentAttribute]; + monents.numberOfText = layout.rowCount; + CGFloat foldHeight = 0; + if (layout.rowCount > 6) { + foldHeight = kMONENTS_FOLD_HEIGHT + kMONENTS_Content_Text_Space; + NSInteger numberOfLines = monents.isFold ? 6 : 0; + container.maximumNumberOfRows = numberOfLines; + } + YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:monents.contentAttribute]; + CGFloat contentHeight = realLayout.textBoundingSize.height ; + monents.contentHeight = contentHeight + kMONENTS_Time_HEIGHT + kMONENTS_Content_Text_Space; + return contentHeight + foldHeight; } + (NSMutableAttributedString *)creatStrAttrByStr:(NSString *)str attributed:(NSDictionary *)attribute{ - if (str.length == 0 || !str) { - str = @" "; - } - NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:str attributes:attribute]; - return attr; + if (str.length == 0 || !str) { + str = @" "; + } + NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:str attributes:attribute]; + return attr; } ///计算评论的高度 + (CGFloat)commentCommentRowHeight:(MonentsCommentModel * )comment { - if (comment.commentRowHeight > 0 && !comment.isReloadHeight) { - return comment.commentRowHeight; - } - __block CGFloat rowHeight = 0; - CGFloat commentTopHeight = 10 + 15 + 10;///10顶部的间隙 15 昵称的高度 - ///内容 - QEmotionHelper *faceManager = [QEmotionHelper sharedEmotionHelper]; - NSMutableAttributedString * attribute = [faceManager attributedStringByText:comment.content font:[UIFont systemFontOfSize:15]]; - YYTextContainer *container = [YYTextContainer new]; - container.size = CGSizeMake(KMONENTS_COMMENT_REPLY_MAX_WIDTH, CGFLOAT_MAX); - container.maximumNumberOfRows = 0; - YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:attribute]; - CGFloat commentHeight = realLayout.textBoundingSize.height; - commentHeight = MAX(commentHeight, 15); - rowHeight += commentTopHeight; - rowHeight += commentHeight; - - ///展开剩余的回复 - if (comment.replyInfo.leftCount > 0) { - rowHeight += 44; - } - - if (comment.replyInfo.replyList.count > 0) { - rowHeight += 10 * 2; - } else { - rowHeight += 10; - } - - ///评论的高度 - [comment.replyInfo.replyList enumerateObjectsUsingBlock:^(MonentsReplyModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - if (obj.content.length > 0) { - [obj createContentAttribute]; - CGFloat replayHeight = 0; - CGFloat commentTopHeight = 10 + 15 + 10;///10顶部的间隙 15 昵称的高度 - CGFloat commentBottomHeight = 10; - YYTextContainer *container = [YYTextContainer new]; - container.size = CGSizeMake(KMONENTS_COMMENT_REPLY_MAX_WIDTH, CGFLOAT_MAX); - container.maximumNumberOfRows = 0; - YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:obj.contentAttribute]; - CGFloat replyContentHeight = realLayout.textBoundingSize.height; - replayHeight += commentTopHeight; - replayHeight += replyContentHeight; - replayHeight += commentBottomHeight; - obj.replyRowHeight = replayHeight; - rowHeight += replayHeight; - } - }]; - comment.commentRowHeight = rowHeight; - return rowHeight; + if (comment.commentRowHeight > 0 && !comment.isReloadHeight) { + return comment.commentRowHeight; + } + __block CGFloat rowHeight = 0; + CGFloat commentTopHeight = 10 + 15 + 10;///10顶部的间隙 15 昵称的高度 + ///内容 + QEmotionHelper *faceManager = [QEmotionHelper sharedEmotionHelper]; + NSMutableAttributedString * attribute = [faceManager attributedStringByText:comment.content font:[UIFont systemFontOfSize:15]]; + YYTextContainer *container = [YYTextContainer new]; + container.size = CGSizeMake(KMONENTS_COMMENT_REPLY_MAX_WIDTH, CGFLOAT_MAX); + container.maximumNumberOfRows = 0; + YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:attribute]; + CGFloat commentHeight = realLayout.textBoundingSize.height; + commentHeight = MAX(commentHeight, 15); + rowHeight += commentTopHeight; + rowHeight += commentHeight; + + ///展开剩余的回复 + if (comment.replyInfo.leftCount > 0) { + rowHeight += 44; + } + + if (comment.replyInfo.replyList.count > 0) { + rowHeight += 10 * 2; + } else { + rowHeight += 10; + } + + ///评论的高度 + [comment.replyInfo.replyList enumerateObjectsUsingBlock:^(MonentsReplyModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (obj.content.length > 0) { + [obj createContentAttribute]; + CGFloat replayHeight = 0; + CGFloat commentTopHeight = 10 + 15 + 10;///10顶部的间隙 15 昵称的高度 + CGFloat commentBottomHeight = 10; + YYTextContainer *container = [YYTextContainer new]; + container.size = CGSizeMake(KMONENTS_COMMENT_REPLY_MAX_WIDTH, CGFLOAT_MAX); + container.maximumNumberOfRows = 0; + YYTextLayout *realLayout = [YYTextLayout layoutWithContainer:container text:obj.contentAttribute]; + CGFloat replyContentHeight = realLayout.textBoundingSize.height; + replayHeight += commentTopHeight; + replayHeight += replyContentHeight; + replayHeight += commentBottomHeight; + obj.replyRowHeight = replayHeight; + rowHeight += replayHeight; + } + }]; + comment.commentRowHeight = rowHeight; + return rowHeight; } @end diff --git a/YuMi/Modules/YMMonents/View/Cell/XPMonentsTableViewCell.m b/YuMi/Modules/YMMonents/View/Cell/XPMonentsTableViewCell.m index 2476ba87..2446a843 100644 --- a/YuMi/Modules/YMMonents/View/Cell/XPMonentsTableViewCell.m +++ b/YuMi/Modules/YMMonents/View/Cell/XPMonentsTableViewCell.m @@ -127,8 +127,8 @@ }]; [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.mas_equalTo(self.backView).offset(kSIMPLE_MONENTS_CONTENT_LEFT_PADDING); - make.right.mas_equalTo(self.backView).offset(-kSIMPLE_MONENTS_CONTENT_RIGHT_PADDING); + make.left.mas_equalTo(self.backView).offset(12); + make.right.mas_equalTo(self.backView).offset(-12); make.top.mas_equalTo(self.backView.mas_top).offset(kMONENTS_CONTENT_SPACAE_HEIGHT); }]; diff --git a/YuMi/Resources/pi_new_loading.svga b/YuMi/Resources/pi_new_loading.svga new file mode 100644 index 0000000000000000000000000000000000000000..cb9c62c008b85474c752b8fa3f537dd4556e3abe GIT binary patch literal 176422 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%0A@8H;_;O6Y?OI5s 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 u2Lpw!{bb40L)4@e3s|G=y *dynamicInfo; -@property (nonatomic,strong) NSMutableAttributedString *levelAtt; -@property (nonatomic,strong) NSMutableAttributedString *idAtt; - ///区号 @property (nonatomic,copy) NSString *phoneAreaCode; +///声音卡 +@property (nonatomic,strong) XPSoundCardModel *audioCard; + + +/// +/// +@property (nonatomic,strong) NSMutableAttributedString *levelAtt; +@property (nonatomic,strong) NSMutableAttributedString *idAtt; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Structure/MVP/Model/UserInfoModel.m b/YuMi/Structure/MVP/Model/UserInfoModel.m index 074c5e0b..4578c11c 100644 --- a/YuMi/Structure/MVP/Model/UserInfoModel.m +++ b/YuMi/Structure/MVP/Model/UserInfoModel.m @@ -1,6 +1,6 @@ // // UserInfoModel.m -// YUMI +// xplan-ios // // Created by zu on 2021/9/14. // @@ -10,24 +10,25 @@ @implementation UserInfoModel + (NSDictionary *)objectClassInArray { - return @{ - @"privatePhoto":UserPhoto.class, - @"userGiftWall":UserGiftWallInfoModel.class, - @"userLuckyBagGiftWall":UserGiftWallInfoModel.class, - @"dynamicInfo":MonentsInfoModel.class - }; + return @{ + @"privatePhoto":UserPhoto.class, + @"userGiftWall":UserGiftWallInfoModel.class, + @"userLuckyBagGiftWall":UserGiftWallInfoModel.class, + @"dynamicInfo":MonentsInfoModel.class, + @"audioCard":XPSoundCardModel.class + }; } ///如果一个模型中需要字段映射的话 比如id -> ID name -> other.name + (NSDictionary *)replacedKeyFromPropertyName { - return @{@"carEffect": @"carport.effect", + return @{@"carEffect": @"carport.effect", @"viewUrl": @"carport.viewUrl", @"otherViewType": @"carport.otherViewType", - @"headwearEffect" : @"userHeadwear.effect", - @"headwearPic" : @"userHeadwear.pic", - @"carName": @"carport.name", - @"reviewingAvatar" : @"newAvatar" - }; + @"headwearEffect" : @"userHeadwear.effect", + @"headwearPic" : @"userHeadwear.pic", + @"carName": @"carport.name", + @"reviewingAvatar" : @"newAvatar" + }; } @end diff --git a/YuMi/Structure/PrefixHeader.pch b/YuMi/Structure/PrefixHeader.pch index e69c16f8..b92d0d08 100644 --- a/YuMi/Structure/PrefixHeader.pch +++ b/YuMi/Structure/PrefixHeader.pch @@ -39,4 +39,5 @@ #import "YYUtility.h" #import #import "StatisticsServiceHelper.h" +#import "YUMIConstant.h" #endif /* PrefixHeader_pch */ diff --git a/YuMi/Tools/CountDown/CountDownHelper.h b/YuMi/Tools/CountDown/CountDownHelper.h index 5656528a..0dfda72d 100644 --- a/YuMi/Tools/CountDown/CountDownHelper.h +++ b/YuMi/Tools/CountDown/CountDownHelper.h @@ -1,8 +1,8 @@ // // CountDownHelper.h -// YUMI +// xplan-ios // -// Created by YUMI on 2021/9/15. +// Created by 冯硕 on 2021/9/15. // 倒计时 #import @@ -15,18 +15,34 @@ NS_ASSUME_NONNULL_BEGIN - (void)onCountdownFinish; ///倒计时进行 - (void)onCountdownOpen:(int)time; - +///顺计时结束 +- (void)onClockwiseFinish; +///顺计时进行 +- (void)onClockwiseOpen:(CGFloat)time; @end @interface CountDownHelper : NSObject +///倒计时是否完成 +@property (nonatomic,assign) BOOL isCountdownFinish; +///顺计时的秒数 +@property (nonatomic,assign) CGFloat seconds; +///代理 +@property (nonatomic,weak) id delegate; + +///单例 + (instancetype)shareHelper; // 停止倒计时 - (void)stopCountDown; ///开始倒计时 - (void)openCountdownWithTime:(int)totalTime; -///代理 -@property (nonatomic,assign) id delegate; + +// 停止顺计时 +- (void)stopClockwise; +///开始顺计时 +- (void)openClockwiseWithTime:(int)totalTime; + + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Tools/CountDown/CountDownHelper.m b/YuMi/Tools/CountDown/CountDownHelper.m index 7bce5763..aa921b7a 100644 --- a/YuMi/Tools/CountDown/CountDownHelper.m +++ b/YuMi/Tools/CountDown/CountDownHelper.m @@ -1,68 +1,129 @@ // // CountDownHelper.m -// YUMI +// xplan-ios // -// Created by YUMI on 2021/9/15. +// Created by 冯硕 on 2021/9/15. // #import "CountDownHelper.h" @interface CountDownHelper () @property (strong, nonatomic) dispatch_source_t timer; +@property (strong, nonatomic) dispatch_source_t clockwiseTimer; @end @implementation CountDownHelper - +-(instancetype)init{ + self = [super init]; + if(self){ + self.isCountdownFinish = YES; + self.seconds = 1.0; + } + return self; +} + (instancetype)shareHelper { - static dispatch_once_t onceToken; - static CountDownHelper * helper = nil; - dispatch_once(&onceToken, ^{ - helper = [[CountDownHelper alloc] init]; - }); - return helper; + static dispatch_once_t onceToken; + static CountDownHelper * helper = nil; + dispatch_once(&onceToken, ^{ + helper = [[CountDownHelper alloc] init]; + }); + return helper; } // 停止倒计时 - (void)stopCountDown { - if (self.timer != nil) { - dispatch_source_cancel(self.timer); - self.timer = nil; - } + if (self.timer != nil) { + dispatch_source_cancel(self.timer); + self.timer = nil; + } + self.isCountdownFinish = YES; +} +- (void)stopClockwise { + if (self.clockwiseTimer != nil) { + dispatch_source_cancel(self.clockwiseTimer); + self.clockwiseTimer = nil; + } + self.isCountdownFinish = YES; } - // 开始倒计时 - (void)openCountdownWithTime:(int)totalTime{ - if (time <= 0) { - return; - } - __block int time = totalTime; //倒计时时间 - if (self.timer != nil) { - dispatch_source_cancel(self.timer); - } - dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); - dispatch_source_set_timer(self.timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行 - __weak typeof(self) weakself = self; - dispatch_source_set_event_handler(self.timer, ^{ - __strong typeof(weakself) self = weakself; - if(time <= 0){ //倒计时结束,关闭 - dispatch_source_cancel(self.timer); - dispatch_async(dispatch_get_main_queue(), ^{ - if (self.delegate && [self.delegate respondsToSelector:@selector(onCountdownFinish)]) { - [self.delegate onCountdownFinish]; - } - }); - }else{ - time--; - dispatch_async(dispatch_get_main_queue(), ^{ - //设置按钮显示读秒效果 - if (self.delegate && [self.delegate respondsToSelector:@selector(onCountdownOpen:)]) { - [self.delegate onCountdownOpen:time]; - } - }); - - } - }); - dispatch_resume(self.timer); + if (time <= 0) { + return; + } + + __block CGFloat time = (CGFloat)totalTime; //倒计时时间 + + if (self.timer != nil) { + dispatch_source_cancel(self.timer); + } + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); + dispatch_source_set_timer(self.timer,dispatch_walltime(NULL, 0),1*NSEC_PER_SEC, 0); //每秒执行 + __weak typeof(self) weakself = self; + dispatch_source_set_event_handler(self.timer, ^{ + __strong typeof(weakself) self = weakself; + if(time <= 0){ //倒计时结束,关闭 + dispatch_source_cancel(self.timer); + dispatch_async(dispatch_get_main_queue(), ^{ + self.isCountdownFinish = YES; + if (self.delegate && [self.delegate respondsToSelector:@selector(onCountdownFinish)]) { + [self.delegate onCountdownFinish]; + + } + }); + }else{ + time--; + self.isCountdownFinish = NO; + dispatch_async(dispatch_get_main_queue(), ^{ + //设置按钮显示读秒效果 + if (self.delegate && [self.delegate respondsToSelector:@selector(onCountdownOpen:)]) { + [self.delegate onCountdownOpen:time]; + } + }); + + } + }); + dispatch_resume(self.timer); +} + +- (void)openClockwiseWithTime:(int)totalTime{ + if (totalTime <= 0) { + return; + } + __block CGFloat backTime = 0; //倒计时时间 + if (self.clockwiseTimer != nil) { + dispatch_source_cancel(self.clockwiseTimer); + } + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + self.clockwiseTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); + dispatch_source_set_timer(self.clockwiseTimer,dispatch_walltime(NULL, 0),self.seconds*NSEC_PER_SEC, 0); //每秒执行 + __weak typeof(self) weakself = self; + dispatch_source_set_event_handler(self.clockwiseTimer, ^{ + __strong typeof(weakself) self = weakself; + if(backTime > totalTime){ //倒计时结束,关闭 + dispatch_source_cancel(self.clockwiseTimer); + dispatch_async(dispatch_get_main_queue(), ^{ + self.isCountdownFinish = YES; + if (self.delegate && [self.delegate respondsToSelector:@selector(onClockwiseFinish)]) { + [self.delegate onClockwiseFinish]; + + } + }); + }else{ + backTime = backTime + self.seconds; + self.isCountdownFinish = NO; + dispatch_async(dispatch_get_main_queue(), ^{ + //设置按钮显示读秒效果 + + if(self.delegate && [self.delegate respondsToSelector:@selector(onClockwiseOpen:)]){ + [self.delegate onClockwiseOpen:backTime]; + } + + + }); + + } + }); + dispatch_resume(self.clockwiseTimer); } @end diff --git a/YuMi/Tools/File/UploadFile.h b/YuMi/Tools/File/UploadFile.h index e5f785b2..1a5754d4 100644 --- a/YuMi/Tools/File/UploadFile.h +++ b/YuMi/Tools/File/UploadFile.h @@ -22,7 +22,7 @@ NS_ASSUME_NONNULL_BEGIN token:(NSString *)token success:(void (^)(NSString *key, NSDictionary *resp))success failure:(void (^)(NSNumber *resCode, NSString *message))failure; - ++ (void)downloadAudioWithFileName:(NSString *)fileName musicUrl:(NSString *)musicUrl mainFileName:(NSString *)mainFileName completion:(void (^) (BOOL isSuccess, NSString *editAudioPath))completion; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Tools/File/UploadFile.m b/YuMi/Tools/File/UploadFile.m index da2aced9..82940608 100644 --- a/YuMi/Tools/File/UploadFile.m +++ b/YuMi/Tools/File/UploadFile.m @@ -7,7 +7,7 @@ #import "UploadFile.h" #import - +#import @implementation UploadFile /// 上传一个文件 @@ -33,5 +33,20 @@ } } option:nil]; } - ++(void)downloadAudioWithFileName:(NSString *)fileName musicUrl:(NSString *)musicUrl mainFileName:(NSString *)mainFileName completion:(void (^) (BOOL isSuccess, NSString *editAudioPath))completion { + AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:musicUrl]]; + NSURLSessionDownloadTask *download = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { + } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { + NSString *filePath = [[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) safeObjectAtIndex1:0] stringByAppendingPathComponent:mainFileName] stringByAppendingPathComponent:fileName]; + return [NSURL fileURLWithPath:filePath]; + } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { + if (!error) { + completion(YES, filePath.path); + } else { + completion(NO, nil); + } + }]; + [download resume]; +} @end diff --git a/YuMi/Tools/SDPhotoBrowser/SDPhotoBrowser.h b/YuMi/Tools/SDPhotoBrowser/SDPhotoBrowser.h index 504f44cf..301ecce0 100755 --- a/YuMi/Tools/SDPhotoBrowser/SDPhotoBrowser.h +++ b/YuMi/Tools/SDPhotoBrowser/SDPhotoBrowser.h @@ -30,6 +30,7 @@ @property (nonatomic, assign) NSInteger currentImageIndex; @property (nonatomic, assign) NSInteger imageCount; @property (nonatomic, assign) BOOL isMe; +@property (nonatomic, assign) BOOL isAvatar; @property (nonatomic, assign) CGRect sourceImagesFrame; @property (nonatomic, strong) id delegate; @property (nonatomic, assign) BOOL isHaveUserAdd; // 为了区分当前页面的cell是否第一个是添加图片的Icon diff --git a/YuMi/Tools/SGYProgressView/SGYProgressView.h b/YuMi/Tools/SGYProgressView/SGYProgressView.h new file mode 100644 index 00000000..36df036e --- /dev/null +++ b/YuMi/Tools/SGYProgressView/SGYProgressView.h @@ -0,0 +1,37 @@ +// +// SGYProgressView.h +// xplan-ios +// +// Created by duoban on 2022/12/29. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface SGYProgressView : UIView +/// 初始化方法 +/// @param frame 圆形环的绘制区域 +/// @param trackWidth 圆形环的宽度 +- (instancetype)initWithFrame:(CGRect)frame trackWidth:(CGFloat)trackWidth NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; +- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE; + +@property (nonatomic, strong) UIColor *progressColor; //进度条颜色 +@property (nonatomic, strong) UIColor *progressBgColor; //进度条背景颜色 + +@property (nonatomic,assign)CGFloat progress; // 0.0 .. 1.0, default is + +- (void)setProgress:(CGFloat)progress animated:(BOOL)animated; + +/// 设置进度条 +/// @param progress 进度条百分比 +/// @param animated 是否开启动画 +/// @param startAngle 起始角度 +/// @param clockwise 进度条方向(是否顺时针) +- (void)setProgress:(CGFloat)progress animated:(BOOL)animated startAngle:(CGFloat )startAngle clockwise:(BOOL)clockwise; +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Tools/SGYProgressView/SGYProgressView.m b/YuMi/Tools/SGYProgressView/SGYProgressView.m new file mode 100644 index 00000000..fea7561a --- /dev/null +++ b/YuMi/Tools/SGYProgressView/SGYProgressView.m @@ -0,0 +1,112 @@ +// +// SGYProgressView.m +// xplan-ios +// +// Created by duoban on 2022/12/29. +// + +#import "SGYProgressView.h" +@interface SGYProgressView () +@property (nonatomic, strong) CAShapeLayer *backgroundLayer; //背景图层 +@property (nonatomic, strong) CAShapeLayer *frontFillLayer; //用来填充的图层 + +@property (nonatomic, assign) CGFloat trackWidth; //导轨宽度 +@property (nonatomic, assign) CGFloat width; //圆环宽度 + +@end + + + + +@implementation SGYProgressView +#pragma mark -- initialization 初始化 +- (instancetype)initWithFrame:(CGRect)frame trackWidth:(CGFloat)trackWidth +{ + if (self = [super initWithFrame:frame]) + { + _trackWidth = trackWidth; + _width = frame.size.width; + + [self setupSubviews]; + } + return self; + +} + +#pragma mark -- setupSubviews 创建子视图 +- (void)setupSubviews +{ + //创建背景图层 + _backgroundLayer = [CAShapeLayer layer]; + _backgroundLayer.fillColor = nil; + + //创建填充图层 + _frontFillLayer = [CAShapeLayer layer]; + _frontFillLayer.fillColor = nil; + _frontFillLayer.lineCap = kCALineCapRound; + [self.layer addSublayer:_backgroundLayer]; + [self.layer addSublayer:_frontFillLayer]; + + //设置颜色 + _frontFillLayer.strokeColor = [UIColor colorWithRed:218/255.0 green:165/255.0 blue:32/255.0 alpha:1.0].CGColor; + _backgroundLayer.strokeColor = [UIColor lightGrayColor].CGColor; + +} + +-(void)layoutSubviews { + + [super layoutSubviews]; + + CGFloat width = self.width; + UIBezierPath *backgroundBezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(width/2.0f, width/2.0f) radius:(CGRectGetWidth(self.bounds)- self.trackWidth)/2.f startAngle:0 endAngle:M_PI*2 + clockwise:YES]; + _backgroundLayer.path = backgroundBezierPath.CGPath; + + //设置线宽 + _frontFillLayer.lineWidth = self.trackWidth; + _backgroundLayer.lineWidth = self.trackWidth; +} + +#pragma mark -- setter方法 +- (void)setProgressColor:(UIColor *)progressColor{ + + _progressColor = progressColor; + _frontFillLayer.strokeColor = progressColor.CGColor; +} + +- (void)setProgressBgColor:(UIColor *)progressBgColor{ + + _progressBgColor = progressBgColor; + _backgroundLayer.strokeColor = progressBgColor.CGColor; +} + +- (void)setProgress:(CGFloat)progress +{ + [self setProgress:progress animated:NO startAngle:-M_PI_2 clockwise:NO]; + +} + +- (void)setProgress:(CGFloat)progress animated:(BOOL)animated{ + + [self setProgress:progress animated:animated startAngle:-M_PI_2 clockwise:NO]; +} + +- (void)setProgress:(CGFloat)progress animated:(BOOL)animated startAngle:(CGFloat )startAngle clockwise:(BOOL)clockwise{ + progress = MAX( MIN(progress, 1.0), 0.0); + _progress = progress; + CGFloat width = self.width; + + CGFloat endAngle = startAngle + (clockwise?(2*M_PI)*progress:(-2*M_PI)*progress); + UIBezierPath *frontFillBezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(width/2.0f, width/2.0f) radius:(CGRectGetWidth(self.bounds)-self.trackWidth)/2.f startAngle:startAngle endAngle:endAngle clockwise:clockwise]; + _frontFillLayer.path = frontFillBezierPath.CGPath; + if (animated) { + CABasicAnimation *basicAnimation=[CABasicAnimation animationWithKeyPath:@"strokeEnd"]; + basicAnimation.duration = 0.75;//动画时间 + basicAnimation.fromValue=[NSNumber numberWithInteger:0]; + basicAnimation.toValue=[NSNumber numberWithInteger:1]; + [_frontFillLayer addAnimation:basicAnimation forKey:@"strokeKey"]; + } +} + + +@end diff --git a/YuMi/zh-Hans.lproj/Localizable.strings b/YuMi/zh-Hans.lproj/Localizable.strings index fb167190..23f3baf6 100644 --- a/YuMi/zh-Hans.lproj/Localizable.strings +++ b/YuMi/zh-Hans.lproj/Localizable.strings @@ -159,12 +159,18 @@ "XPMineSettingPresent25" = "注销账号"; "XPMineSettingPresent26" = "修改"; +///XPMineUserInfoEditPresenter.m "XPMineUserInfoEditPresenter0" = "上传失败"; -"XPMineUserInfoEditPresenter1" = "昵称:"; -"XPMineUserInfoEditPresenter2" = "头像:"; -"XPMineUserInfoEditPresenter3" = "生日:"; -"XPMineUserInfoEditPresenter4" = "相册:"; -"XPMineUserInfoEditPresenter5" = "个人介绍:"; +"XPMineUserInfoEditPresenter1" = "昵称"; +"XPMineUserInfoEditPresenter2" = "头像"; +"XPMineUserInfoEditPresenter3" = "生日"; +"XPMineUserInfoEditPresenter4" = "相册"; +"XPMineUserInfoEditPresenter5" = "个人介绍"; +"XPMineUserInfoEditPresenter6" = "声音签名"; +"XPMineUserInfoEditPresenter7" = "来录制你的专属声音吧~"; +"XPMineUserInfoEditPresenter8" = "标签"; +"XPMineUserInfoEditPresenter9" = "设置个人标签将更受欢迎~"; +"XPMineUserInfoEditPresenter10" = "地区"; "XPMineUserInfolbumPresenter0" = "上传失败"; @@ -337,7 +343,10 @@ "XPMineUserInfoHeaderView1" = "我是个默认签名"; "XPMineUserInfoHeaderView2" = "%ld粉丝"; "XPMineUserInfoHeaderView3" = "直播中"; +"XPMineUserInfoHeaderView4" = "录制声音卡"; +///XPMineUserInfoHeaderTagView +"XPMineUserInfoHeaderTagView0"="设置你的个人标签"; "XPMineUserInfoDateView0" = "取消"; "XPMineUserInfoDateView1" = "确定"; @@ -361,7 +370,7 @@ "XPMineFriendEmptyTableViewCell0" = "暂无数据"; -"XPMineDataGiftTableViewCell0" = "礼物牆"; +"XPMineDataGiftTableViewCell0" = "普通礼物"; "XPMineDataGiftTableViewCell2" = "幸运礼物"; "XPMineUserInfoEmptyCollectionViewCell0" = "还未收到过礼物"; @@ -445,12 +454,17 @@ "XPMineUserInfoDesViewController2" = "填写自我介绍,可以让别人更瞭解你哦~"; "XPMineUserInfoDesViewController3" = "完成"; +///XPMineUserInfoEditViewController.m "XPMineUserInfoEditViewController0" = "编辑个人资料"; "XPMineUserInfoEditViewController1" = "拍照上传"; +"XPMineUserInfoEditViewController2" = "相机不可用"; "XPMineUserInfoEditViewController3" = "相机权限受限,点击确定去系统设置"; +"XPMineUserInfoEditViewController4" = "相机不可用"; "XPMineUserInfoEditViewController5" = "相册权限受限,点击确定去系统设置"; "XPMineUserInfoEditViewController6" = "本地相册"; +"XPMineUserInfoEditViewController7" = "相册不可用"; "XPMineUserInfoEditViewController8" = "相册权限受限,点击确定去系统设置"; +"XPMineUserInfoEditViewController9" = "相册不可用"; "XPMineUserInfoEditViewController10" = "相册权限受限,点击确定去系统设置"; "XPMineUserInfoEditViewController11" = "头像正在审核中"; "XPMineUserInfoEditViewController12" = "头像已送审,审核成功后自动应用头像"; @@ -2290,7 +2304,10 @@ ///XPGuildSearchNavView.m "XPGuildSearchNavView0" = "搜索昵称/%@ID"; "XPGuildSearchNavView1" = "搜索"; - +///XPMineUserInfoIndividualTagView +"XPMineUserInfoIndividualTagView0"="TA的标签"; +"XPMineUserInfoIndividualTagView1"="我的标签"; +"XPMineUserInfoIndividualTagView2"="编辑标签"; ///XPGuildIncomeHeaderView.m "XPGuildIncomeHeaderView0" = "MM月dd日"; "XPGuildIncomeHeaderView1" = "MM月dd日"; @@ -2764,7 +2781,47 @@ "XPTreasureFairyGiftView6"="传说"; "XPTreasureFairyGiftView7"="召唤"; "XPTreasureFairyGiftView8"="钻"; - +///XPMonentsLayoutConfig.m +"XPMonentsLayoutConfig0" = "置顶 "; +///XPMineDataSkillCardTableViewCell.m +"XPMineDataSkillCardTableViewCell0" = "技能卡"; +"XPMineDataSkillCardTableViewCell1" = "还未添加技能卡喔"; +///XPMineUserInfoRecordedSoundView +"XPMineUserInfoRecordedSoundView0"="好的声音能带来更多关注哦~"; +"XPMineUserInfoRecordedSoundView1"="点击开始录制"; +"XPMineUserInfoRecordedSoundView2"="重新录制"; +"XPMineUserInfoRecordedSoundView3"="保存声音"; +"XPMineUserInfoRecordedSoundView4"="声音审核中,审核通过即可展示~"; +"XPMineUserInfoRecordedSoundView5"="点击停止"; +"XPMineUserInfoRecordedSoundView6"="点击试听"; +"XPMineUserInfoRecordedSoundView7"="点击停止播放"; +"XPMineUserInfoRecordedSoundView8"="删除声音"; +"XPMineUserInfoRecordedSoundView9"="声音签名审核通过,快叫小伙伴听听吧~"; +"XPMineUserInfoRecordedSoundView10"="正在上麦中,不能录音"; +///XPMineUserInfoRecordedSoundVC +"XPMineUserInfoRecordedSoundVC0"="请给予麦克风权限后再试"; +"XPMineUserInfoRecordedSoundVC1"="录制时间过短~"; +"XPMineUserInfoRecordedSoundVC2"="声音签名"; +"XPMineUserInfoRecordedSoundVC3"="保存声音失败"; +"XPMineUserInfoRecordedSoundVC4"="保存声音成功"; +"XPMineUserInfoRecordedSoundVC5"="删除声音成功"; +"XPMineUserInfoRecordedSoundVC6"="确定要删除这段声音吗?"; +"XPMineUserInfoRecordedSoundVC7"="声音还未录制完成,确认退出吗?"; +"XPMineUserInfoRecordedSoundVC8"="声音还未保存,确认退出吗?"; +///XPMineUserInfoNavView +"XPMineUserInfoTagVC0"="我的标签"; +"XPMineUserInfoTagVC1"="完成"; +"XPMineUserInfoTagVC2"="标签保存成功"; +///XPMineUserInfoTagEmptyViewCell +"XPMineUserInfoTagEmptyViewCell0"="编辑你的标签,可以大大提高你的人气~"; +///XPMineUserInfoTagItemView +"XPMineUserInfoTagItemView0"="最多只能添加20个标签哦~"; +///XPMineUserInfoIndividualTagView +"XPMineUserInfoIndividualTagView0"="TA的标签"; +"XPMineUserInfoIndividualTagView1"="我的标签"; +"XPMineUserInfoIndividualTagView2"="编辑标签"; +///XPMineUserInfoHeaderTagView +"XPMineUserInfoHeaderTagView0"="设置你的个人标签"; ///不能脚本生成的 "App_Common_And" = "和"; "App_Common_Male" = "男"; diff --git a/YuMi/zh-Hant.lproj/Localizable.strings b/YuMi/zh-Hant.lproj/Localizable.strings index 0e53603d..cc9a15e2 100644 --- a/YuMi/zh-Hant.lproj/Localizable.strings +++ b/YuMi/zh-Hant.lproj/Localizable.strings @@ -159,12 +159,18 @@ "XPMineSettingPresent25" = "註銷賬號"; "XPMineSettingPresent26" = "修改"; +///XPMineUserInfoEditPresenter.m "XPMineUserInfoEditPresenter0" = "上傳失敗"; -"XPMineUserInfoEditPresenter1" = "昵稱:"; -"XPMineUserInfoEditPresenter2" = "頭像:"; -"XPMineUserInfoEditPresenter3" = "生日:"; -"XPMineUserInfoEditPresenter4" = "相冊:"; -"XPMineUserInfoEditPresenter5" = "個人介紹:"; +"XPMineUserInfoEditPresenter1" = "昵稱"; +"XPMineUserInfoEditPresenter2" = "頭像"; +"XPMineUserInfoEditPresenter3" = "生日"; +"XPMineUserInfoEditPresenter4" = "相冊"; +"XPMineUserInfoEditPresenter5" = "個人介紹"; +"XPMineUserInfoEditPresenter6" = "聲音簽名"; +"XPMineUserInfoEditPresenter7" = "來錄制你的專屬聲音吧~"; +"XPMineUserInfoEditPresenter8" = "標簽"; +"XPMineUserInfoEditPresenter9" = "設置個人標簽將更受歡迎~"; +"XPMineUserInfoEditPresenter10" = "地區"; "XPMineUserInfolbumPresenter0" = "上傳失敗"; @@ -337,7 +343,18 @@ "XPMineUserInfoHeaderView1" = "我是個默認簽名"; "XPMineUserInfoHeaderView2" = "%ld粉絲"; "XPMineUserInfoHeaderView3" = "直播中"; - +"XPMineUserInfoHeaderView4" = "錄制聲音卡"; +///XPMineUserInfoIndividualTagView +"XPMineUserInfoIndividualTagView0"="TA的標簽"; +"XPMineUserInfoIndividualTagView1"="我的標簽"; +"XPMineUserInfoIndividualTagView2"="編輯標簽"; +///XPMineUserInfoHeaderTagView +"XPMineUserInfoHeaderTagView0"="設置你的個人標簽"; +///XPMineDataSkillCardTableViewCell.m +"XPMineDataSkillCardTableViewCell0" = "技能卡"; +"XPMineDataSkillCardTableViewCell1" = "還未添加技能卡喔"; +///XPMonentsLayoutConfig.m +"XPMonentsLayoutConfig0" = "置頂 "; "XPMineUserInfoDateView0" = "取消"; "XPMineUserInfoDateView1" = "確定"; @@ -361,7 +378,7 @@ "XPMineFriendEmptyTableViewCell0" = "暫無數據"; -"XPMineDataGiftTableViewCell0" = "禮物牆"; +"XPMineDataGiftTableViewCell0" = "普通禮物"; "XPMineDataGiftTableViewCell2" = "幸運禮物"; "XPMineUserInfoEmptyCollectionViewCell0" = "還未收到過禮物"; @@ -445,12 +462,17 @@ "XPMineUserInfoDesViewController2" = "填寫自我介紹,可以讓別人更瞭解你哦~"; "XPMineUserInfoDesViewController3" = "完成"; +///XPMineUserInfoEditViewController.m "XPMineUserInfoEditViewController0" = "編輯個人資料"; "XPMineUserInfoEditViewController1" = "拍照上傳"; +"XPMineUserInfoEditViewController2" = "相機不可用"; "XPMineUserInfoEditViewController3" = "相機權限受限,點擊確定去系統設置"; +"XPMineUserInfoEditViewController4" = "相機不可用"; "XPMineUserInfoEditViewController5" = "相冊權限受限,點擊確定去系統設置"; "XPMineUserInfoEditViewController6" = "本地相冊"; +"XPMineUserInfoEditViewController7" = "相冊不可用"; "XPMineUserInfoEditViewController8" = "相冊權限受限,點擊確定去系統設置"; +"XPMineUserInfoEditViewController9" = "相冊不可用"; "XPMineUserInfoEditViewController10" = "相冊權限受限,點擊確定去系統設置"; "XPMineUserInfoEditViewController11" = "頭像正在審核中"; "XPMineUserInfoEditViewController12" = "頭像已送審,審核成功後自動應用頭像"; @@ -2764,6 +2786,43 @@ "XPTreasureFairyGiftView6"="傳說"; "XPTreasureFairyGiftView7"="召喚"; "XPTreasureFairyGiftView8"="鉆"; +///XPMineUserInfoRecordedSoundView +"XPMineUserInfoRecordedSoundView0"="好的聲音能帶來更多關註哦~"; +"XPMineUserInfoRecordedSoundView1"="點擊開始錄製"; +"XPMineUserInfoRecordedSoundView2"="重新錄製"; +"XPMineUserInfoRecordedSoundView3"="保存聲音"; +"XPMineUserInfoRecordedSoundView4"="聲音審核中,審核通過即可展示~"; + +"XPMineUserInfoRecordedSoundView5"="點擊停止"; +"XPMineUserInfoRecordedSoundView6"="點擊試聽"; +"XPMineUserInfoRecordedSoundView7"="點擊停止播放"; +"XPMineUserInfoRecordedSoundView8"="删除聲音"; +"XPMineUserInfoRecordedSoundView9"="聲音簽名審核通過,快叫小夥伴聽聽吧~"; +"XPMineUserInfoRecordedSoundView10"="正在上麥中,不能錄音"; +///XPMineUserInfoRecordedSoundVC +"XPMineUserInfoRecordedSoundVC0"="請給予麥克風權限後再試"; +"XPMineUserInfoRecordedSoundVC1"="錄製時間過短~"; +"XPMineUserInfoRecordedSoundVC2"="聲音簽名"; +"XPMineUserInfoRecordedSoundVC3"="保存聲音失敗"; +"XPMineUserInfoRecordedSoundVC4"="保存聲音成功"; +"XPMineUserInfoRecordedSoundVC5"="刪除聲音成功"; +"XPMineUserInfoRecordedSoundVC6"="確定要刪除這段聲音嗎?"; +"XPMineUserInfoRecordedSoundVC7"="聲音還未錄製完成,確認退出嗎?"; +"XPMineUserInfoRecordedSoundVC8"="聲音還未保存,確認退出嗎?"; +//XPMineUserInfoTagVC +"XPMineUserInfoTagVC0"="我的標簽"; +"XPMineUserInfoTagVC1"="完成"; +"XPMineUserInfoTagVC2"="標簽保存成功"; +///XPMineUserInfoTagEmptyViewCell +"XPMineUserInfoTagEmptyViewCell0"="編輯你的標簽,可以大大提高你的人氣~"; +///XPMineUserInfoTagItemView +"XPMineUserInfoTagItemView0"="最多只能添加20個標簽哦~"; +///XPMineUserInfoIndividualTagView +"XPMineUserInfoIndividualTagView0"="TA的標簽"; +"XPMineUserInfoIndividualTagView1"="我的標簽"; +"XPMineUserInfoIndividualTagView2"="編輯標簽"; +///XPMineUserInfoHeaderTagView +"XPMineUserInfoHeaderTagView0"="設置你的個人標簽"; ///不能腳本生成的 "App_Common_And" = "和"; "App_Common_Male" = "男";