Commit 48859467566b2bf44a256186a1e33cdf05cb814d
1 parent
adcec47d
no message
Showing
92 changed files
with
4773 additions
and
0 deletions
Too many changes to show.
To preserve performance only 92 of 118 files are displayed.
CNLiveBMineModule.podspec
0 → 100644
| 1 | +# | |
| 2 | +# Be sure to run `pod lib lint CNLiveBMineModule.podspec' to ensure this is a | |
| 3 | +# valid spec before submitting. | |
| 4 | +# | |
| 5 | +# Any lines starting with a # are optional, but their use is encouraged | |
| 6 | +# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html | |
| 7 | +# | |
| 8 | + | |
| 9 | +Pod::Spec.new do |s| | |
| 10 | + s.name = 'CNLiveBMineModule' | |
| 11 | + s.version = '0.0.1' | |
| 12 | + s.summary = 'CNLiveBMineModule.' | |
| 13 | + | |
| 14 | +# This description is used to generate tags and improve search results. | |
| 15 | +# * Think: What does it do? Why did you write it? What is the focus? | |
| 16 | +# * Try to keep it short, snappy and to the point. | |
| 17 | +# * Write the description between the DESC delimiters below. | |
| 18 | +# * Finally, don't worry about the indent, CocoaPods strips it! | |
| 19 | + | |
| 20 | + s.description = <<-DESC | |
| 21 | +TODO: 网家家企业版-我的模块. | |
| 22 | + DESC | |
| 23 | + | |
| 24 | + s.homepage = 'http://bj.gitlab.cnlive.com/ios-team/CNLiveBMineModule' | |
| 25 | + # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' | |
| 26 | + s.license = { :type => 'MIT', :file => 'LICENSE' } | |
| 27 | + s.author = { 'iOS-Xiaowen' => '153993236@qq.com' } | |
| 28 | + s.source = { :git => 'http://bj.gitlab.cnlive.com/ios-team/CNLiveBMineModule.git', :tag => s.version.to_s } | |
| 29 | + # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' | |
| 30 | + | |
| 31 | + s.ios.deployment_target = '9.0' | |
| 32 | + | |
| 33 | + # s.source_files = 'CNLiveBMineModule/Classes/**/*' | |
| 34 | + | |
| 35 | + # Module | |
| 36 | + s.subspec 'Module' do |ss| | |
| 37 | + ss.source_files = 'CNLiveBMineModule/Classes/Module/*.{h,m}' | |
| 38 | + ss.dependency 'CNLiveBMineModule/Controller' | |
| 39 | + end | |
| 40 | + | |
| 41 | + # Controller | |
| 42 | + s.subspec 'Controller' do |ss| | |
| 43 | + ss.source_files = 'CNLiveBMineModule/Classes/Controller/*.{h,m}' | |
| 44 | + ss.dependency 'CNLiveBMineModule/UserInfo' | |
| 45 | + ss.dependency 'CNLiveBMineModule/View' | |
| 46 | + end | |
| 47 | + | |
| 48 | + # View | |
| 49 | + s.subspec 'View' do |ss| | |
| 50 | + ss.source_files = 'CNLiveBMineModule/Classes/View/*.{h,m}' | |
| 51 | + ss.dependency 'CNLiveBMineModule/Model' | |
| 52 | + ss.dependency 'CNLiveBMineModule/UserInfo' | |
| 53 | + end | |
| 54 | + | |
| 55 | + # Model | |
| 56 | + s.subspec 'Model' do |ss| | |
| 57 | + ss.source_files = 'CNLiveBMineModule/Classes/Model/*.{h,m}' | |
| 58 | + end | |
| 59 | + | |
| 60 | + # 用户信息/个人资料 | |
| 61 | + s.subspec 'UserInfo' do |ss| | |
| 62 | + ss.source_files = 'CNLiveBMineModule/Classes/UserInfo/*.{h,m}' | |
| 63 | + end | |
| 64 | + | |
| 65 | + # 设置 | |
| 66 | + s.subspec 'Setting' do |ss| | |
| 67 | + ss.source_files = 'CNLiveBMineModule/Classes/Setting/**/*.{h,m}' | |
| 68 | + end | |
| 69 | + s.resource_bundles = { | |
| 70 | + 'CNLiveBMineModule' => ['CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets'] | |
| 71 | + } | |
| 72 | + | |
| 73 | + # s.public_header_files = 'Pod/Classes/**/*.h' | |
| 74 | + # s.frameworks = 'UIKit', 'MapKit' | |
| 75 | + # s.dependency 'AFNetworking', '~> 2.3' | |
| 76 | + | |
| 77 | + # pod | |
| 78 | + s.dependency 'CNLiveSDKs/CNLiveUserSystemSDK', '~> 0.3.2.0' #GitHub所以指定版本号 | |
| 79 | + s.dependency 'CNLiveTripartiteManagement/QMUIKit' | |
| 80 | + s.dependency 'CNLiveTripartiteManagement/SDWebImage' | |
| 81 | + s.dependency 'CNLiveTripartiteManagement/Masonry' | |
| 82 | + s.dependency 'CNLiveTripartiteManagement/MJExtension' | |
| 83 | + s.dependency 'CNLiveTripartiteManagement/AFNetworking' | |
| 84 | + | |
| 85 | + # 服务层 | |
| 86 | + s.dependency 'CNLiveServices' | |
| 87 | + | |
| 88 | + # 环境 | |
| 89 | + s.dependency 'CNLiveEnvironment' | |
| 90 | + | |
| 91 | + # 基类 | |
| 92 | + s.dependency 'CNLiveCommonClass' | |
| 93 | + | |
| 94 | + # IM | |
| 95 | + s.dependency 'CNLiveIMBaseSDK' | |
| 96 | + | |
| 97 | + # 类别 | |
| 98 | + s.dependency 'CNLiveCategory' | |
| 99 | + | |
| 100 | + # 用户信息本地化 | |
| 101 | + s.dependency 'CNLiveUserManagement' | |
| 102 | + | |
| 103 | + s.dependency 'CNLiveCommonCategory' | |
| 104 | + s.dependency 'CNLiveCustomControl' | |
| 105 | + s.dependency 'CNLiveManager' | |
| 106 | + s.dependency 'CNLiveImagePickerController' | |
| 107 | + s.dependency 'CNLiveAVCamera' | |
| 108 | + s.dependency 'CNLiveUserAgreementManager' | |
| 109 | + s.dependency 'CNLiveChooseCountry' | |
| 110 | + | |
| 111 | + s.static_framework = true | |
| 112 | + | |
| 113 | +end | ... | ... |
CNLiveBMineModule/Assets/.gitkeep
0 → 100644
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/Contents.json
0 → 100644
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/default_avatar_f.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "filename" : "default_avatar_f.png", | |
| 6 | + "scale" : "1x" | |
| 7 | + }, | |
| 8 | + { | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "idiom" : "universal", | |
| 14 | + "scale" : "3x" | |
| 15 | + } | |
| 16 | + ], | |
| 17 | + "info" : { | |
| 18 | + "version" : 1, | |
| 19 | + "author" : "xcode" | |
| 20 | + } | |
| 21 | +} | |
| 0 | 22 | \ No newline at end of file | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/default_avatar_f.imageset/default_avatar_f.png
0 → 100644
11.1 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/default_avatar_y.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "filename" : "default_avatar_y.png", | |
| 6 | + "scale" : "1x" | |
| 7 | + }, | |
| 8 | + { | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "idiom" : "universal", | |
| 14 | + "scale" : "3x" | |
| 15 | + } | |
| 16 | + ], | |
| 17 | + "info" : { | |
| 18 | + "version" : 1, | |
| 19 | + "author" : "xcode" | |
| 20 | + } | |
| 21 | +} | |
| 0 | 22 | \ No newline at end of file | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/default_avatar_y.imageset/default_avatar_y.png
0 → 100644
10.7 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_bg.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_bg@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_bg@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_bg.imageset/mine_bg@2x.png
0 → 100644
168 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_bg.imageset/mine_bg@3x.png
0 → 100644
332 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_cancellation_agree.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_cancellation_agree@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_cancellation_agree@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_cancellation_agree.imageset/mine_cancellation_agree@2x.png
0 → 100644
331 Bytes
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_cancellation_agree.imageset/mine_cancellation_agree@3x.png
0 → 100644
650 Bytes
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_cancellation_agree_sel.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_cancellation_agree_sel@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_cancellation_agree_sel@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_cancellation_agree_sel.imageset/mine_cancellation_agree_sel@2x.png
0 → 100644
733 Bytes
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_cancellation_agree_sel.imageset/mine_cancellation_agree_sel@3x.png
0 → 100644
1.33 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_common.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "idiom" : "universal", | |
| 9 | + "filename" : "mine_common@2x.png", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "idiom" : "universal", | |
| 14 | + "filename" : "mine_common@3x.png", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "version" : 1, | |
| 20 | + "author" : "xcode" | |
| 21 | + } | |
| 22 | +} | |
| 0 | 23 | \ No newline at end of file | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_common.imageset/mine_common@2x.png
0 → 100644
2.14 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_common.imageset/mine_common@3x.png
0 → 100644
4.11 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_doyen.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "idiom" : "universal", | |
| 9 | + "filename" : "mine_doyen@2x.png", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "idiom" : "universal", | |
| 14 | + "filename" : "mine_doyen@3x.png", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "version" : 1, | |
| 20 | + "author" : "xcode" | |
| 21 | + } | |
| 22 | +} | |
| 0 | 23 | \ No newline at end of file | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_doyen.imageset/mine_doyen@2x.png
0 → 100644
1.79 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_doyen.imageset/mine_doyen@3x.png
0 → 100644
3.32 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_into.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_into@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_into@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_into.imageset/mine_into@2x.png
0 → 100644
573 Bytes
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_into.imageset/mine_into@3x.png
0 → 100644
653 Bytes
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_location.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "idiom" : "universal", | |
| 9 | + "filename" : "mine_location@2x.png", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "idiom" : "universal", | |
| 14 | + "filename" : "mine_location@3x.png", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "version" : 1, | |
| 20 | + "author" : "xcode" | |
| 21 | + } | |
| 22 | +} | |
| 0 | 23 | \ No newline at end of file | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_location.imageset/mine_location@2x.png
0 → 100644
767 Bytes
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_location.imageset/mine_location@3x.png
0 → 100644
1.47 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_logo.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_logo@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_logo@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_logo.imageset/mine_logo@2x.png
0 → 100644
24.8 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_logo.imageset/mine_logo@3x.png
0 → 100644
48.4 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_overbadge.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "idiom" : "universal", | |
| 9 | + "filename" : "mine_overbadge@2x.png", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "idiom" : "universal", | |
| 14 | + "filename" : "mine_overbadge@3x.png", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "version" : 1, | |
| 20 | + "author" : "xcode" | |
| 21 | + } | |
| 22 | +} | |
| 0 | 23 | \ No newline at end of file | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_overbadge.imageset/mine_overbadge@2x.png
0 → 100644
1.91 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_overbadge.imageset/mine_overbadge@3x.png
0 → 100644
3.61 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_qb.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_qb@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_qb@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_qb.imageset/mine_qb@2x.png
0 → 100644
2.75 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_qb.imageset/mine_qb@3x.png
0 → 100644
5.12 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_sz.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_sz@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_sz@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_sz.imageset/mine_sz@2x.png
0 → 100644
2.67 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_sz.imageset/mine_sz@3x.png
0 → 100644
4.59 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_update_select.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "idiom" : "universal", | |
| 9 | + "filename" : "mine_update_select@2x.png", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "idiom" : "universal", | |
| 14 | + "filename" : "mine_update_select@3x.png", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "version" : 1, | |
| 20 | + "author" : "xcode" | |
| 21 | + } | |
| 22 | +} | |
| 0 | 23 | \ No newline at end of file | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_update_select.imageset/mine_update_select@2x.png
0 → 100644
330 Bytes
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_update_select.imageset/mine_update_select@3x.png
0 → 100644
700 Bytes
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_wjj_certification.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "idiom" : "universal", | |
| 9 | + "filename" : "mine_wjj_certification@2x.png", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "idiom" : "universal", | |
| 14 | + "filename" : "mine_wjj_certification@3x.png", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "version" : 1, | |
| 20 | + "author" : "xcode" | |
| 21 | + } | |
| 22 | +} | |
| 0 | 23 | \ No newline at end of file | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_wjj_certification.imageset/mine_wjj_certification@2x.png
0 → 100644
6.92 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_wjj_certification.imageset/mine_wjj_certification@3x.png
0 → 100644
15.1 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_zbzx.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_zbzx@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_zbzx@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_zbzx.imageset/mine_zbzx@2x.png
0 → 100644
1.84 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_zbzx.imageset/mine_zbzx@3x.png
0 → 100644
3.44 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_zy.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_zy@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_zy@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_zy.imageset/mine_zy@2x.png
0 → 100644
41.8 KB
CNLiveBMineModule/Assets/CNLiveBMineModule.xcassets/mine_zy.imageset/mine_zy@3x.png
0 → 100644
148 KB
CNLiveBMineModule/Classes/.gitkeep
0 → 100644
CNLiveBMineModule/Classes/Controller/CNLiveBMineController.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineController.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * 我的 | |
| 11 | + */ | |
| 12 | + | |
| 13 | +#import "CNCommonViewController.h" | |
| 14 | + | |
| 15 | +NS_ASSUME_NONNULL_BEGIN | |
| 16 | + | |
| 17 | +@interface CNLiveBMineController : CNCommonViewController | |
| 18 | + | |
| 19 | +@end | |
| 20 | + | |
| 21 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Controller/CNLiveBMineController.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveBMineController.h" | |
| 10 | + | |
| 11 | +#import "MJExtension.h" | |
| 12 | +#import "QMUIKit.h" | |
| 13 | + | |
| 14 | +#import "CNLiveServices.h" | |
| 15 | +#import <CNLiveRequestBastKit/CNLiveNetworking.h> | |
| 16 | +#import "CNUserInfoManager.h" | |
| 17 | +//#import "CNLiveEnvironment.h" | |
| 18 | +#import "CNLiveCategory.h" | |
| 19 | + | |
| 20 | +#import "CNLiveBMineHeaderView.h" | |
| 21 | +#import "CNLiveBMineCell.h" | |
| 22 | +#import "CNLiveBMineModel.h" | |
| 23 | +#import "CNLiveBMineRequest.h" | |
| 24 | + | |
| 25 | +#import "CNLiveUserInfoController.h" | |
| 26 | +#import "CNLiveSettingController.h" | |
| 27 | + | |
| 28 | +@interface CNLiveBMineController()<UITableViewDelegate, UITableViewDataSource, CNLiveBMineHeaderViewDelegate, CNLiveBMineCellDelegate> | |
| 29 | +@property (nonatomic, strong) UITableView *tableView; | |
| 30 | +@property (nonatomic, weak) CNLiveBMineHeaderView *headerView; | |
| 31 | +@property (nonatomic, strong) NSMutableArray *data; | |
| 32 | + | |
| 33 | +@end | |
| 34 | + | |
| 35 | +@implementation CNLiveBMineController | |
| 36 | +static const NSInteger kHEIGHT = 253; | |
| 37 | +static const CGFloat timeValue = 1.5; | |
| 38 | + | |
| 39 | +#pragma mark - 加载数据 | |
| 40 | +- (void)loadData { | |
| 41 | + NSArray *data = @[ | |
| 42 | + @{ | |
| 43 | + @"name":@"直播中心", | |
| 44 | + @"image":@"mine_zbzx", | |
| 45 | + }, | |
| 46 | + @{ | |
| 47 | + @"name":@"钱包", | |
| 48 | + @"image":@"mine_qb", | |
| 49 | + }, | |
| 50 | + @{ | |
| 51 | + @"name":@"设置", | |
| 52 | + @"image":@"mine_sz", | |
| 53 | + } | |
| 54 | + ]; | |
| 55 | + for(NSDictionary *dic in data){ | |
| 56 | + CNLiveBMineModel *model = [CNLiveBMineModel mj_objectWithKeyValues:dic]; | |
| 57 | + [self.data addObject:model]; | |
| 58 | + } | |
| 59 | + [self.tableView reloadData]; | |
| 60 | + | |
| 61 | +} | |
| 62 | + | |
| 63 | +#pragma mark - 生命周期 | |
| 64 | +- (void)viewWillAppear:(BOOL)animated{ | |
| 65 | + [super viewWillAppear:animated]; | |
| 66 | + self.navigationController.navigationBarHidden = YES; | |
| 67 | + | |
| 68 | + [self requestCertification]; | |
| 69 | + if(self.headerView){ | |
| 70 | + self.headerView.frame = CGRectMake(0, -kHEIGHT, SCREEN_WIDTH, kHEIGHT); | |
| 71 | + } | |
| 72 | + self.headerView.isRefresh = YES; | |
| 73 | + [self.tableView reloadData]; | |
| 74 | +} | |
| 75 | + | |
| 76 | +- (void)viewDidLoad { | |
| 77 | + [super viewDidLoad]; | |
| 78 | + self.view.backgroundColor = [UIColor whiteColor]; | |
| 79 | + if (@available(iOS 11, *)) { | |
| 80 | + self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; | |
| 81 | + } | |
| 82 | + else { | |
| 83 | + self.automaticallyAdjustsScrollViewInsets = NO; | |
| 84 | + } | |
| 85 | + [self createSubViews]; | |
| 86 | + [self loadData]; | |
| 87 | +} | |
| 88 | + | |
| 89 | +- (void)createSubViews { | |
| 90 | + [self.view addSubview:self.tableView]; | |
| 91 | + CNLiveBMineHeaderView *headerView = [[CNLiveBMineHeaderView alloc]initWithFrame:CGRectMake(0, -kHEIGHT, SCREEN_WIDTH, kHEIGHT)]; | |
| 92 | + headerView.delegate = self; | |
| 93 | + headerView.tag = 666; | |
| 94 | + [self.tableView addSubview:headerView]; | |
| 95 | + self.headerView = headerView; | |
| 96 | +} | |
| 97 | + | |
| 98 | +#pragma mark - UITableViewDelegate | |
| 99 | +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ | |
| 100 | + return 45; | |
| 101 | +} | |
| 102 | + | |
| 103 | +#pragma mark - UITableViewDataSource | |
| 104 | +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | |
| 105 | + return self.data.count; | |
| 106 | +} | |
| 107 | + | |
| 108 | +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { | |
| 109 | + CNLiveBMineCell *cell = [tableView dequeueReusableCellWithIdentifier:kCNLiveBMineCell]; | |
| 110 | + cell.selectionStyle = UITableViewCellSelectionStyleNone; | |
| 111 | + cell.delegate = self; | |
| 112 | + cell.model = self.data[indexPath.row]; | |
| 113 | + return cell; | |
| 114 | +} | |
| 115 | + | |
| 116 | +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ | |
| 117 | + CNLiveSettingController *vc = [[CNLiveSettingController alloc]init]; | |
| 118 | + [self.navigationController pushViewController:vc animated:YES]; | |
| 119 | +} | |
| 120 | + | |
| 121 | +#pragma mark - CNLiveBMineHeaderViewDelegate | |
| 122 | +- (void)headerView:(CNLiveBMineHeaderView *)headerView pushToController:(CNLiveBMineHeaderViewType)type{ | |
| 123 | + switch (type) { | |
| 124 | + case CNLiveBMineHeaderViewTypeUerInfo: | |
| 125 | + { | |
| 126 | + CNLiveUserInfoController *vc = [[CNLiveUserInfoController alloc]init]; | |
| 127 | + [self.navigationController pushViewController:vc animated:YES]; | |
| 128 | + } | |
| 129 | + break; | |
| 130 | + case CNLiveBMineHeaderViewTypeWintess: | |
| 131 | + { | |
| 132 | + | |
| 133 | + } | |
| 134 | + break; | |
| 135 | + } | |
| 136 | +} | |
| 137 | + | |
| 138 | +#pragma mark - 请求方法 | |
| 139 | +// 请求签到赚积分 | |
| 140 | +- (void)requestSignIn{ | |
| 141 | + self.headerView.interactionEnabled = NO; | |
| 142 | + [CNLiveBMineRequest signIn:^(BOOL isSuccess, NSDictionary * _Nonnull data, NSError * _Nonnull error) { | |
| 143 | + if (error.code == -1001 || error.code == -1009) { | |
| 144 | + [QMUITips showError:@"网络连接已断开" inView:self.view hideAfterDelay:timeValue]; | |
| 145 | + return ; | |
| 146 | + } | |
| 147 | + if (isSuccess) { | |
| 148 | + id<CNLiveIntegralServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(CNLiveIntegralServiceProtocol)]; | |
| 149 | + NSInteger status = [data[@"status"] integerValue]; | |
| 150 | + if (status == 1) { | |
| 151 | + [service showGoldWhereaboutsViewWithDic:data]; | |
| 152 | + }else{ | |
| 153 | + [service showSignInViewWithDic:data]; | |
| 154 | + } | |
| 155 | + | |
| 156 | + }else{ | |
| 157 | + [QMUITips showError:@"签到失败" inView:self.view hideAfterDelay:timeValue]; | |
| 158 | + | |
| 159 | + } | |
| 160 | + self.headerView.interactionEnabled = YES; | |
| 161 | + }]; | |
| 162 | +} | |
| 163 | + | |
| 164 | +// 请求用户认证 | |
| 165 | +- (void)requestCertification{ | |
| 166 | + [CNLiveBMineRequest certification:^(BOOL isSuccess, NSDictionary * _Nonnull data, NSError * _Nonnull error) { | |
| 167 | + if (error.code == -1001 || error.code == -1009) { | |
| 168 | + [QMUITips showError:@"网络连接已断开" inView:self.view hideAfterDelay:timeValue]; | |
| 169 | + return ; | |
| 170 | + } | |
| 171 | + if (isSuccess) { | |
| 172 | + NSString *darenIdentity = [NSString stringWithFormat:@"%@",[data objectForKey:@"darenIdentity"]]; | |
| 173 | + if ([darenIdentity isEqualToString:@"1"]) { //普通用户 | |
| 174 | + CNUserShareModel.isDaren = 0; | |
| 175 | + self.headerView.certificationImages = @[@"mine_wjj_certification",@"mine_common",@"mine_overbadge"]; | |
| 176 | + | |
| 177 | + } else if ([darenIdentity isEqualToString:@"0"]) { //达人用户 | |
| 178 | + CNUserShareModel.isDaren = 1; | |
| 179 | + self.headerView.certificationImages = @[@"mine_wjj_certification",@"mine_doyen", @"mine_overbadge"]; | |
| 180 | + | |
| 181 | + } | |
| 182 | + } | |
| 183 | + }]; | |
| 184 | +} | |
| 185 | + | |
| 186 | +#pragma mark - CNLiveBMineCellDelegate | |
| 187 | +- (void)cell:(CNLiveBMineCell *)cell didSelectItemAtItem:(NSInteger)item{ | |
| 188 | +// switch (cell.model.type) { | |
| 189 | +// case CNLiveBMineCellTypeOrder: | |
| 190 | +// { | |
| 191 | +// if(item == 4){ | |
| 192 | +// //售后 | |
| 193 | +// id<CNLiveOrderServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(CNLiveOrderServiceProtocol)]; | |
| 194 | +// [service pushToRefundViewController:0]; | |
| 195 | +// | |
| 196 | +// }else{ | |
| 197 | +// id<CNLiveOrderServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(CNLiveOrderServiceProtocol)]; | |
| 198 | +// [service pushToOrderViewController:item]; | |
| 199 | +// } | |
| 200 | +// } | |
| 201 | +// break; | |
| 202 | +// case CNLiveBMineCellTypeTool: | |
| 203 | +// { | |
| 204 | +// if(item == 0){ | |
| 205 | +// // 收货地址 | |
| 206 | +// id<CNLiveOrderServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(CNLiveOrderServiceProtocol)]; | |
| 207 | +// [service pushToAddressViewController]; | |
| 208 | +// } | |
| 209 | +// else if(item == 1){ | |
| 210 | +// // 余额 | |
| 211 | +// id<CNLiveBalanceServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(CNLiveBalanceServiceProtocol)]; | |
| 212 | +// [service pushToBalanceViewControllerWithType:@"1" ID:CNUserShareModel.uid]; | |
| 213 | +// } | |
| 214 | +// else if(item == 2){ | |
| 215 | +// // 收藏 | |
| 216 | +// id<CNLiveCollectionServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(CNLiveCollectionServiceProtocol)]; | |
| 217 | +// [service pushToCollectionViewController]; | |
| 218 | +// } | |
| 219 | +// else if(item == 3){ | |
| 220 | +// // 发布记录 | |
| 221 | +//// XWOrdersController *vc = [[XWOrdersController alloc]init]; | |
| 222 | +//// [self.navigationController pushViewController:vc animated:YES]; | |
| 223 | +// } | |
| 224 | +// else if(item == 4){ | |
| 225 | +// // 邀请好友 | |
| 226 | +//// XWOrdersController *vc = [[XWOrdersController alloc]init]; | |
| 227 | +//// [self.navigationController pushViewController:vc animated:YES]; | |
| 228 | +// } | |
| 229 | +// else if(item == 5){ | |
| 230 | +// // 设置 | |
| 231 | +// id<CNLiveSettingServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(CNLiveSettingServiceProtocol)]; | |
| 232 | +// [service pushToSettingViewController]; | |
| 233 | +// } | |
| 234 | +// else if(item == 6){ | |
| 235 | +// // 小家音响 | |
| 236 | +// NSLog(@"小家音响"); | |
| 237 | +// } | |
| 238 | +// else if(item == 7){ | |
| 239 | +// // 我的礼盒 | |
| 240 | +// id<CNLiveOrderServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(CNLiveOrderServiceProtocol)]; | |
| 241 | +// [service pushToGiftBoxViewController]; | |
| 242 | +// } | |
| 243 | +// else if(item == 8){ | |
| 244 | +// // 我的话题 | |
| 245 | +// NSLog(@"我的话题"); | |
| 246 | +// } | |
| 247 | +// else if(item == 9){ | |
| 248 | +// // 路径工具 | |
| 249 | +// NSLog(@"路径工具"); | |
| 250 | +// } | |
| 251 | +// | |
| 252 | +// } | |
| 253 | +// break; | |
| 254 | +// case CNLiveBMineCellTypeGoods: | |
| 255 | +// { | |
| 256 | +// | |
| 257 | +// } | |
| 258 | +// break; | |
| 259 | +// case CNLiveBMineCellTypeSports: | |
| 260 | +// { | |
| 261 | +// if(item == 0){ | |
| 262 | +// // 我的活动 | |
| 263 | +// NSLog(@"我的活动"); | |
| 264 | +// } | |
| 265 | +// else if(item == 1){ | |
| 266 | +// // 我的记录 | |
| 267 | +// NSLog(@"我的记录"); | |
| 268 | +// } | |
| 269 | +// } | |
| 270 | +// break; | |
| 271 | +// | |
| 272 | +// default: | |
| 273 | +// break; | |
| 274 | +// } | |
| 275 | + | |
| 276 | +} | |
| 277 | + | |
| 278 | +#pragma mark - 状态栏 | |
| 279 | +- (UIStatusBarStyle)preferredStatusBarStyle{ | |
| 280 | + return UIStatusBarStyleLightContent; | |
| 281 | + | |
| 282 | +} | |
| 283 | + | |
| 284 | +#pragma mark - 响应方法 | |
| 285 | +- (void)soccerDidClicked:(UIButton *)btn{ | |
| 286 | + id<CNLiveIntegralServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(CNLiveIntegralServiceProtocol)]; | |
| 287 | + [service pushToTaskListViewController]; | |
| 288 | +} | |
| 289 | + | |
| 290 | +#pragma mark - 懒加载 | |
| 291 | +- (NSMutableArray *)data { | |
| 292 | + if (!_data) { | |
| 293 | + _data = [NSMutableArray array]; | |
| 294 | + } | |
| 295 | + return _data; | |
| 296 | +} | |
| 297 | + | |
| 298 | +- (UITableView *)tableView{ | |
| 299 | + if(!_tableView){ | |
| 300 | + _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-TabBarHeight) style:UITableViewStylePlain]; | |
| 301 | + _tableView.showsVerticalScrollIndicator = NO; | |
| 302 | + _tableView.delegate = self; | |
| 303 | + _tableView.dataSource = self; | |
| 304 | + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; | |
| 305 | + _tableView.backgroundColor = [UIColor whiteColor]; | |
| 306 | + _tableView.estimatedRowHeight = 0; | |
| 307 | + _tableView.estimatedSectionHeaderHeight = 0; | |
| 308 | + _tableView.estimatedSectionFooterHeight = 0; | |
| 309 | + [_tableView registerClass:[CNLiveBMineCell class] forCellReuseIdentifier:kCNLiveBMineCell]; | |
| 310 | + _tableView.contentInset = UIEdgeInsetsMake(kHEIGHT, 0, 0, 0); | |
| 311 | + } | |
| 312 | + return _tableView; | |
| 313 | +} | |
| 314 | + | |
| 315 | +@end | ... | ... |
CNLiveBMineModule/Classes/Model/CNLiveBMineModel.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineModel.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | + | |
| 13 | +@interface CNLiveBMineModel : NSObject | |
| 14 | +@property (nonatomic, copy) NSString *name; | |
| 15 | +@property (nonatomic, copy) NSString *image; | |
| 16 | + | |
| 17 | +@end | |
| 18 | + | |
| 19 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Model/CNLiveBMineModel.m
0 → 100644
CNLiveBMineModule/Classes/Model/CNLiveBMineRequest.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineRequest.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | +typedef void(^CertificationBlock)(BOOL isSuccess, NSDictionary *data, NSError *error); | |
| 13 | +typedef void(^SignInBlock)(BOOL isSuccess, NSDictionary *data, NSError *error); | |
| 14 | + | |
| 15 | +@interface CNLiveBMineRequest : NSObject | |
| 16 | + | |
| 17 | +// 请求用户认证 | |
| 18 | ++ (void)certification:(CertificationBlock)block; | |
| 19 | + | |
| 20 | + | |
| 21 | +// 签到 | |
| 22 | ++ (void)signIn:(SignInBlock)block; | |
| 23 | + | |
| 24 | +@end | |
| 25 | + | |
| 26 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Model/CNLiveBMineRequest.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineRequest.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveBMineRequest.h" | |
| 10 | +#import "CNLiveCategory.h" | |
| 11 | +#import "CNLiveNetworking.h" | |
| 12 | +#import "CNLiveEnvironment.h" | |
| 13 | +#import "CNUserInfoManager.h" | |
| 14 | + | |
| 15 | +@implementation CNLiveBMineRequest | |
| 16 | +// 请求用户认证 | |
| 17 | ++ (void)certification:(CertificationBlock)block { | |
| 18 | + NSDictionary *params = @{ | |
| 19 | + @"witSid":CNUserShareModel.uid ? CNUserShareModel.uid : @"" | |
| 20 | + }; | |
| 21 | + [CNLiveNetworking setAllowRequestDefaultArgument:YES]; | |
| 22 | + [CNLiveNetworking requestNetworkWithMethod:CNLiveRequestMethodPOST URLString:CNCheckWitnessUrl Param:params CacheType:CNLiveNetworkCacheTypeNetworkOnly CompletionBlock:^(NSURLSessionTask *requestTask, id responseObject, NSError *error) { | |
| 23 | + if (responseObject && [responseObject isKindOfClass:[NSDictionary class]] && responseObject[@"data"] && [responseObject[@"data"] isKindOfClass:[NSDictionary class]]) { | |
| 24 | + NSString *errorCode = [NSString stringWithFormat:@"%@", responseObject[@"errorCode"]]; | |
| 25 | + NSDictionary *data = responseObject[@"data"]; | |
| 26 | + block?block([errorCode isEqualToString:@"0"], data, error):@""; | |
| 27 | + }else{ | |
| 28 | + block?block(NO, @{}, error):@""; | |
| 29 | + | |
| 30 | + } | |
| 31 | + | |
| 32 | + }]; | |
| 33 | + | |
| 34 | +} | |
| 35 | + | |
| 36 | ++ (void)signIn:(SignInBlock)block { | |
| 37 | + NSDictionary *params = @{@"sid":CNUserShareModel.uid}; | |
| 38 | + [CNLiveNetworking setAllowRequestDefaultArgument:YES]; | |
| 39 | + [CNLiveNetworking requestNetworkWithMethod:CNLiveRequestMethodPOST URLString:CNIntegralSignInUrl Param:params CacheType:CNLiveNetworkCacheTypeNetworkOnly CompletionBlock:^(NSURLSessionTask *requestTask, id responseObject, NSError *error) { | |
| 40 | + if (responseObject && [responseObject isKindOfClass:[NSDictionary class]] && responseObject[@"data"] && [responseObject[@"data"] isKindOfClass:[NSDictionary class]]) { | |
| 41 | + NSString *errorCode = [NSString stringWithFormat:@"%@", responseObject[@"errorCode"]]; | |
| 42 | + NSDictionary *data = responseObject[@"data"]; | |
| 43 | + block?block([errorCode isEqualToString:@"0"], data, error):@""; | |
| 44 | + }else{ | |
| 45 | + block?block(NO, @{}, error):@""; | |
| 46 | + | |
| 47 | + } | |
| 48 | + | |
| 49 | + }]; | |
| 50 | +} | |
| 51 | + | |
| 52 | +@end | ... | ... |
CNLiveBMineModule/Classes/Module/CNLiveBMineModule.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineModule.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | + | |
| 13 | +@interface CNLiveBMineModule : NSObject | |
| 14 | + | |
| 15 | +@end | |
| 16 | + | |
| 17 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Module/CNLiveBMineModule.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineModule.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveBMineModule.h" | |
| 10 | +#import "CNLiveServices.h" | |
| 11 | + | |
| 12 | +@BeeHiveMod(CNLiveBMineModule) | |
| 13 | +@interface CNLiveBMineModule()<BHModuleProtocol> | |
| 14 | + | |
| 15 | +@end | |
| 16 | + | |
| 17 | +@implementation CNLiveBMineModule | |
| 18 | +- (id)init { | |
| 19 | + if (self = [super init]) { | |
| 20 | + | |
| 21 | + } | |
| 22 | + return self; | |
| 23 | + | |
| 24 | +} | |
| 25 | + | |
| 26 | +- (NSUInteger)moduleLevel { | |
| 27 | + return 0; | |
| 28 | + | |
| 29 | +} | |
| 30 | + | |
| 31 | +- (void)modSetUp:(BHContext *)context { | |
| 32 | + switch (context.env) { | |
| 33 | + case BHEnvironmentDev: | |
| 34 | + //....初始化开发环境 | |
| 35 | + break; | |
| 36 | + case BHEnvironmentProd: | |
| 37 | + //....初始化生产环境 | |
| 38 | + default: | |
| 39 | + break; | |
| 40 | + } | |
| 41 | + | |
| 42 | +} | |
| 43 | + | |
| 44 | +- (void)modInit:(BHContext *)context { | |
| 45 | + | |
| 46 | +} | |
| 47 | + | |
| 48 | +@end | ... | ... |
CNLiveBMineModule/Classes/Module/CNLiveBMineService.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineService.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | + | |
| 13 | +@interface CNLiveBMineService : NSObject | |
| 14 | + | |
| 15 | +@end | |
| 16 | + | |
| 17 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Module/CNLiveBMineService.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineService.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveBMineService.h" | |
| 10 | +#import "CNLiveServices.h" | |
| 11 | +#import "CNLivePageJumpManager.h" | |
| 12 | + | |
| 13 | +#import "CNLiveBMineController.h" | |
| 14 | +#import "CNLiveUserInfoController.h" | |
| 15 | + | |
| 16 | +//@BeeHiveService(CNLiveBMineServiceProtocol,CNLiveBMineService) | |
| 17 | +////@interface CNLiveBMineService ()<CNLiveBMineServiceProtocol> | |
| 18 | +//@interface CNLiveBMineService () | |
| 19 | +// | |
| 20 | +//@end | |
| 21 | + | |
| 22 | +@implementation CNLiveBMineService | |
| 23 | + | |
| 24 | +// 我的 | |
| 25 | +- (UIViewController *)getMineViewController { | |
| 26 | + return [CNLiveBMineController new]; | |
| 27 | +} | |
| 28 | + | |
| 29 | +- (void)pushToMineViewController { | |
| 30 | + CNLiveBMineController *vc = [[CNLiveBMineController alloc]init]; | |
| 31 | + [CNLivePageJumpManager pushViewController:vc]; | |
| 32 | +} | |
| 33 | + | |
| 34 | +// 个人资料 | |
| 35 | +- (UIViewController *)getUserInfoViewController { | |
| 36 | + return [CNLiveUserInfoController new]; | |
| 37 | +} | |
| 38 | + | |
| 39 | +- (void)pushToUserInfoViewController { | |
| 40 | + CNLiveUserInfoController *vc = [[CNLiveUserInfoController alloc]init]; | |
| 41 | + [CNLivePageJumpManager pushViewController:vc]; | |
| 42 | +} | |
| 43 | + | |
| 44 | +@end | ... | ... |
CNLiveBMineModule/Classes/Setting/AboutUs/CNLiveAboutUsController.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveAboutUsController.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * 关于我们 | |
| 11 | + */ | |
| 12 | + | |
| 13 | +#import <UIKit/UIKit.h> | |
| 14 | +#import "CNCommonViewController.h" | |
| 15 | + | |
| 16 | +NS_ASSUME_NONNULL_BEGIN | |
| 17 | + | |
| 18 | +@interface CNLiveAboutUsController : CNCommonViewController | |
| 19 | + | |
| 20 | +@end | |
| 21 | + | |
| 22 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Setting/AboutUs/CNLiveAboutUsController.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveAboutUsController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveAboutUsController.h" | |
| 10 | +#import "MJExtension.h" | |
| 11 | +#import "QMUIKit.h" | |
| 12 | + | |
| 13 | +#import "CNLiveServices.h" | |
| 14 | +#import "CNLiveUserAgreementManager.h" | |
| 15 | +#import "CNLiveEnvironment.h" | |
| 16 | +#import "CNLiveCategory.h" | |
| 17 | +#import "CNLiveBaseKit.h" | |
| 18 | +#import "CNLiveNavigationBar.h" | |
| 19 | + | |
| 20 | +#import "CNLiveSettingModel.h" | |
| 21 | +#import "CNLiveSettingCell.h" | |
| 22 | + | |
| 23 | +@interface CNLiveAboutUsController () | |
| 24 | +<UITableViewDelegate, UITableViewDataSource> | |
| 25 | +@property (nonatomic, strong) CNLiveNavigationBar *navigationBar; | |
| 26 | +@property (nonatomic, strong) UITableView *tableView; | |
| 27 | +@property (nonatomic, strong) UIView *headerView; | |
| 28 | +@property (nonatomic, strong) UIView *footerView; | |
| 29 | +@property (nonatomic, strong) NSMutableArray *data; | |
| 30 | + | |
| 31 | +@end | |
| 32 | + | |
| 33 | +@implementation CNLiveAboutUsController | |
| 34 | +static const NSInteger timeValue = 1.5; | |
| 35 | + | |
| 36 | +#pragma mark - 加载数据 | |
| 37 | +- (void)loadData { | |
| 38 | + // 版本 | |
| 39 | + NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; | |
| 40 | + NSString *shortVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"]; | |
| 41 | + NSString *appVersion = TestEnvironment?[NSString stringWithFormat:@"%@ beta",shortVersion]:shortVersion; | |
| 42 | + | |
| 43 | + NSArray *data = @[ | |
| 44 | + @{ | |
| 45 | + @"style":@"1", | |
| 46 | + @"title":@"给软件评分", | |
| 47 | + @"height":@"51", | |
| 48 | + @"lineHeight":@"1" | |
| 49 | + }, | |
| 50 | + @{ | |
| 51 | + @"style":@"1", | |
| 52 | + @"title":@"应用简介", | |
| 53 | + @"height":@"60", | |
| 54 | + @"lineHeight":@"10" | |
| 55 | + }, | |
| 56 | + @{ | |
| 57 | + @"style":@"1", | |
| 58 | + @"title":@"隐私政策协议", | |
| 59 | + @"height":@"51", | |
| 60 | + @"lineHeight":@"1" | |
| 61 | + }, | |
| 62 | + @{ | |
| 63 | + @"style":@"1", | |
| 64 | + @"title":@"软件许可及服务协议", | |
| 65 | + @"height":@"51", | |
| 66 | + @"lineHeight":@"1" | |
| 67 | + }, | |
| 68 | + @{ | |
| 69 | + @"style":@"1", | |
| 70 | + @"title":@"版权信息", | |
| 71 | + @"height":@"51", | |
| 72 | + @"lineHeight":@"1" | |
| 73 | + }, | |
| 74 | + @{ | |
| 75 | + @"style":@"1", | |
| 76 | + @"title":@"资质信息", | |
| 77 | + @"height":@"51", | |
| 78 | + @"lineHeight":@"1" | |
| 79 | + }, | |
| 80 | + @{ | |
| 81 | + @"style":@"4", | |
| 82 | + @"title":@"当前版本", | |
| 83 | + @"content":appVersion, | |
| 84 | + @"height":@"51", | |
| 85 | + @"lineHeight":@"1" | |
| 86 | + }, | |
| 87 | + @{ | |
| 88 | + @"style":@"1", | |
| 89 | + @"title":@"联系我们", | |
| 90 | + @"height":@"51", | |
| 91 | + @"lineHeight":@"1" | |
| 92 | + }, | |
| 93 | + @{ | |
| 94 | + @"style":@"1", | |
| 95 | + @"title":@"投诉", | |
| 96 | + @"height":@"51", | |
| 97 | + @"lineHeight":@"1" | |
| 98 | + } | |
| 99 | + | |
| 100 | + ]; | |
| 101 | + for(NSDictionary *dic in data){ | |
| 102 | + [self.data addObject:[CNLiveSettingModel mj_objectWithKeyValues:dic]]; | |
| 103 | + } | |
| 104 | + [self.tableView reloadData]; | |
| 105 | + | |
| 106 | +} | |
| 107 | + | |
| 108 | +#pragma mark - 生命周期 | |
| 109 | +- (void)viewWillAppear:(BOOL)animated{ | |
| 110 | + [super viewWillAppear:animated]; | |
| 111 | + self.navigationController.navigationBarHidden = YES; | |
| 112 | +} | |
| 113 | + | |
| 114 | +- (void)viewDidLoad { | |
| 115 | + [super viewDidLoad]; | |
| 116 | + self.view.backgroundColor = [UIColor whiteColor]; | |
| 117 | + if (@available(iOS 11, *)) { | |
| 118 | + self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; | |
| 119 | + } | |
| 120 | + else { | |
| 121 | + self.automaticallyAdjustsScrollViewInsets = NO; | |
| 122 | + } | |
| 123 | + | |
| 124 | + [self createSubViews]; | |
| 125 | + [self loadData]; | |
| 126 | + | |
| 127 | +} | |
| 128 | + | |
| 129 | +- (void)dealloc { | |
| 130 | + | |
| 131 | + | |
| 132 | +} | |
| 133 | + | |
| 134 | +- (void)createSubViews { | |
| 135 | + [self.view addSubview:self.navigationBar]; | |
| 136 | + [self.view addSubview:self.tableView]; | |
| 137 | +} | |
| 138 | + | |
| 139 | +#pragma mark - UITableViewDelegate | |
| 140 | +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ | |
| 141 | + CNLiveSettingModel *model = self.data[indexPath.row]; | |
| 142 | + return model.height; | |
| 143 | +} | |
| 144 | + | |
| 145 | +#pragma mark - UITableViewDataSource | |
| 146 | +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | |
| 147 | + return self.data.count; | |
| 148 | +} | |
| 149 | + | |
| 150 | +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { | |
| 151 | + CNLiveSettingCell *cell = [tableView dequeueReusableCellWithIdentifier:kCNLiveSettingCell]; | |
| 152 | + cell.selectionStyle = UITableViewCellSelectionStyleNone; | |
| 153 | + CNLiveSettingModel *model = self.data[indexPath.row]; | |
| 154 | + cell.model = model; | |
| 155 | + cell.lineColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 156 | + return cell; | |
| 157 | +} | |
| 158 | + | |
| 159 | +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ | |
| 160 | + if(indexPath.row == 0){ // 给软件评分 | |
| 161 | + NSString *app = [NSString stringWithFormat:@"https://itunes.apple.com/app/apple-store/id%@?ct=web&mt=8",@"1337575478"]; | |
| 162 | + if (@available(iOS 10.0, *)) { | |
| 163 | + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:app] options:@{} completionHandler:nil]; | |
| 164 | + } else { | |
| 165 | + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:app]]; | |
| 166 | + } | |
| 167 | + | |
| 168 | + } | |
| 169 | + else if(indexPath.row == 1){ // 应用简介 | |
| 170 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementIntroduction]; | |
| 171 | + | |
| 172 | + } | |
| 173 | + else if(indexPath.row == 2){ // 隐私政策协议 | |
| 174 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementPrivacy]; | |
| 175 | + | |
| 176 | + } | |
| 177 | + else if(indexPath.row == 3){ // 软件许可及服务协议 | |
| 178 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementPermission]; | |
| 179 | + } | |
| 180 | + else if(indexPath.row == 4){ // 版权信息 | |
| 181 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementCopyright]; | |
| 182 | + | |
| 183 | + } | |
| 184 | + else if(indexPath.row == 5){ // 资质信息 | |
| 185 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementEnterpriseQualification]; | |
| 186 | + } | |
| 187 | + else if(indexPath.row == 6){ // 当前版本 | |
| 188 | + | |
| 189 | + } | |
| 190 | + else if(indexPath.row == 7){ // 联系我们 | |
| 191 | + QMUIAlertAction *sure = [QMUIAlertAction actionWithTitle:@"确定" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 192 | + NSMutableString *tel = [[NSMutableString alloc] initWithFormat:@"telprompt://%@",@"010-88824192"]; | |
| 193 | + if (@available(iOS 10.0, *)) { | |
| 194 | + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tel] options:@{} completionHandler:nil]; | |
| 195 | + } else { | |
| 196 | + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tel]]; | |
| 197 | + } | |
| 198 | + | |
| 199 | + }]; | |
| 200 | + QMUIAlertAction *cancel = [QMUIAlertAction actionWithTitle:@"取消" style:QMUIAlertActionStyleCancel handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 201 | + }]; | |
| 202 | + | |
| 203 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"联系我们" message:@"您确定要拨打010-88824192吗?" preferredStyle:QMUIAlertControllerStyleAlert]; | |
| 204 | + [alertController addAction:sure]; | |
| 205 | + [alertController addAction:cancel]; | |
| 206 | + | |
| 207 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 208 | + | |
| 209 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 210 | + | |
| 211 | + NSMutableDictionary *cancelAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 212 | + cancelAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 213 | + | |
| 214 | + sure.buttonAttributes = titleAttributs; | |
| 215 | + cancel.buttonAttributes = cancelAttributs; | |
| 216 | + | |
| 217 | + [alertController showWithAnimated:YES]; | |
| 218 | + | |
| 219 | + }else if (indexPath.row == 8){ // 投诉 | |
| 220 | + | |
| 221 | + | |
| 222 | + } | |
| 223 | + | |
| 224 | +} | |
| 225 | + | |
| 226 | +#pragma mark - 懒加载 | |
| 227 | +- (NSMutableArray *)data { | |
| 228 | + if (!_data) { | |
| 229 | + _data = [NSMutableArray array]; | |
| 230 | + } | |
| 231 | + return _data; | |
| 232 | +} | |
| 233 | + | |
| 234 | +- (CNLiveNavigationBar *)navigationBar { | |
| 235 | + if (!_navigationBar) { | |
| 236 | + _navigationBar = [CNLiveNavigationBar navigationBar]; | |
| 237 | + _navigationBar.title.text = [NSString stringWithFormat:@"关于%@",DisplayName]; | |
| 238 | + __weak typeof(self) weakSelf = self; | |
| 239 | + _navigationBar.onClickLeftButton = ^{ | |
| 240 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 241 | + if(!strongSelf) return ; | |
| 242 | + [strongSelf goBack]; | |
| 243 | + }; | |
| 244 | + } | |
| 245 | + return _navigationBar; | |
| 246 | +} | |
| 247 | + | |
| 248 | +- (UITableView *)tableView{ | |
| 249 | + if(!_tableView){ | |
| 250 | + _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, NavigationContentTop, SCREEN_WIDTH, SCREEN_HEIGHT-NavigationContentTop) style:UITableViewStylePlain]; | |
| 251 | + _tableView.delegate = self; | |
| 252 | + _tableView.dataSource = self; | |
| 253 | + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; | |
| 254 | + _tableView.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 255 | + _tableView.estimatedRowHeight = 0; | |
| 256 | + _tableView.estimatedSectionHeaderHeight = 0; | |
| 257 | + _tableView.estimatedSectionFooterHeight = 0; | |
| 258 | + [_tableView registerClass:[CNLiveSettingCell class] forCellReuseIdentifier:kCNLiveSettingCell]; | |
| 259 | + _tableView.tableHeaderView = self.headerView; | |
| 260 | + _tableView.tableFooterView = self.footerView; | |
| 261 | + | |
| 262 | + } | |
| 263 | + return _tableView; | |
| 264 | +} | |
| 265 | + | |
| 266 | +- (UIView *)headerView { | |
| 267 | + if (!_headerView) { | |
| 268 | + _headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 160)]; | |
| 269 | + _headerView.clipsToBounds = YES; | |
| 270 | + _headerView.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 271 | + UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake((SCREEN_WIDTH-80)/2.0, 30, 80, 105)]; | |
| 272 | + UIImage *image = [self getImageWithImageName:@"mine_logo" bundleName:@"CNLiveBMineModule" targetClass:[self class]]; | |
| 273 | + imageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; | |
| 274 | + imageView.contentMode = UIViewContentModeCenter; | |
| 275 | + [_headerView addSubview:imageView]; | |
| 276 | + | |
| 277 | + } | |
| 278 | + return _headerView; | |
| 279 | +} | |
| 280 | + | |
| 281 | +- (UIView *)footerView { | |
| 282 | + if (!_footerView) { | |
| 283 | + _footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 100)]; | |
| 284 | + _footerView.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 285 | + UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0, 25, SCREEN_WIDTH, 25)]; | |
| 286 | + title.textColor = [UIColor colorWithRed:40/255.0 green:40/255.0 blue:40/255.0 alpha:1.0]; | |
| 287 | + title.font = UIFontCNMake(12.0); | |
| 288 | + title.text = @"版权信息"; | |
| 289 | + title.textAlignment = NSTextAlignmentCenter; | |
| 290 | + [_footerView addSubview:title]; | |
| 291 | + UILabel *subTitle = [[UILabel alloc] initWithFrame:CGRectMake(0, 50, SCREEN_WIDTH, 25)]; | |
| 292 | + subTitle.textColor = [UIColor colorWithRed:40/255.0 green:40/255.0 blue:40/255.0 alpha:1.0]; | |
| 293 | + subTitle.font = UIFontCNMake(12.0); | |
| 294 | + subTitle.text = @"北京中投视讯文化传媒股份有限公司版权所有"; | |
| 295 | + subTitle.textAlignment = NSTextAlignmentCenter; | |
| 296 | + [_footerView addSubview:subTitle]; | |
| 297 | + } | |
| 298 | + return _footerView; | |
| 299 | +} | |
| 300 | + | |
| 301 | +#pragma mark - 响应方法 | |
| 302 | +- (void)goBack { | |
| 303 | + if (self.presentingViewController != nil) { | |
| 304 | + [self dismissViewControllerAnimated:YES completion:nil]; | |
| 305 | + } | |
| 306 | + else { | |
| 307 | + [self.navigationController popViewControllerAnimated:YES]; | |
| 308 | + } | |
| 309 | +} | |
| 310 | + | |
| 311 | +@end | ... | ... |
CNLiveBMineModule/Classes/Setting/Cancellation/CNLiveCancellationController.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveCancellationController.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by CNLive-zxw on 2019/3/21. | |
| 6 | +// Copyright © 2019年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +// 注销账号 | |
| 10 | + | |
| 11 | +#import "CNCommonViewController.h" | |
| 12 | + | |
| 13 | +NS_ASSUME_NONNULL_BEGIN | |
| 14 | + | |
| 15 | +@interface CNLiveCancellationController : CNCommonViewController | |
| 16 | + | |
| 17 | +@end | |
| 18 | + | |
| 19 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Setting/Cancellation/CNLiveCancellationController.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveCancellationController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by CNLive-zxw on 2019/3/21. | |
| 6 | +// Copyright © 2019年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveCancellationController.h" | |
| 10 | +#import <WebKit/WebKit.h> | |
| 11 | +#import <Masonry/Masonry.h> | |
| 12 | +#import "QMUIKit.h" | |
| 13 | + | |
| 14 | +#import "CNLiveNetworking.h" | |
| 15 | +#import "CNLiveEnvironment.h" | |
| 16 | +#import "CNUserInfoManager.h" | |
| 17 | + | |
| 18 | +#import "CNLiveNavigationBar.h" | |
| 19 | +#import "CNLiveCancellationView.h" | |
| 20 | + | |
| 21 | +#import "CNLiveUserAgreementManager.h" | |
| 22 | + | |
| 23 | +@interface CNLiveCancellationController ()<WKNavigationDelegate,WKUIDelegate,CNLiveCancellationViewDelegate> | |
| 24 | +@property (nonatomic, strong) CNLiveNavigationBar *navigationBar; | |
| 25 | +@property (nonatomic, weak) WKWebView *webView; | |
| 26 | +@property (nonatomic, weak) CNLiveCancellationView *cancellationView; | |
| 27 | + | |
| 28 | +@end | |
| 29 | + | |
| 30 | +@implementation CNLiveCancellationController | |
| 31 | +static const NSInteger timeValue = 1.5; | |
| 32 | + | |
| 33 | +#pragma mark - Data | |
| 34 | +- (void)setData { | |
| 35 | + [[CNLiveUserAgreementManager manager] getAgreementH5WithType:CNLiveUserAgreementReviewApply success:^(NSString * _Nonnull h5, NSString * _Nonnull title, BOOL isShow) { | |
| 36 | + [QMUITips showLoadingInView:self.view]; | |
| 37 | + [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:h5]]]; | |
| 38 | + | |
| 39 | + } failure:^(NSError * _Nonnull error) { | |
| 40 | + [self loadHTMLString]; | |
| 41 | + | |
| 42 | + }]; | |
| 43 | +} | |
| 44 | + | |
| 45 | +#pragma mark - 生命周期 | |
| 46 | +- (void)viewWillAppear:(BOOL)animated{ | |
| 47 | + [super viewWillAppear:animated]; | |
| 48 | + self.navigationController.navigationBarHidden = YES; | |
| 49 | +} | |
| 50 | + | |
| 51 | +- (void)viewDidLoad { | |
| 52 | + [super viewDidLoad]; | |
| 53 | + // Do any additional setup after loading the view. | |
| 54 | + self.view.backgroundColor = [UIColor whiteColor]; | |
| 55 | + self.edgesForExtendedLayout = UIRectEdgeNone;//双击webview不上移 | |
| 56 | + | |
| 57 | + [self createUI]; | |
| 58 | + [self layoutUI]; | |
| 59 | + [self setData]; | |
| 60 | + | |
| 61 | +} | |
| 62 | +- (void)dealloc{ | |
| 63 | + | |
| 64 | +} | |
| 65 | +#pragma mark - UI | |
| 66 | +- (void)createUI { | |
| 67 | + [self.view addSubview:self.navigationBar]; | |
| 68 | + | |
| 69 | + WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc]init]; | |
| 70 | + config.preferences = [WKPreferences new]; | |
| 71 | + config.preferences.javaScriptEnabled = YES; | |
| 72 | + config.preferences.javaScriptCanOpenWindowsAutomatically = NO; | |
| 73 | + config.userContentController = [[WKUserContentController alloc]init]; | |
| 74 | + | |
| 75 | + //下方代码,禁止缩放 | |
| 76 | + WKUserContentController *userController = [WKUserContentController new]; | |
| 77 | + NSString *js = @"var script = document.createElement('meta');" | |
| 78 | + "script.name = 'viewport';" | |
| 79 | + "script.content=\"width=device-width, initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0, user-scalable=no\";" | |
| 80 | + "document.getElementsByTagName('div')[0].appendChild(script);"; | |
| 81 | + WKUserScript *script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO]; | |
| 82 | + | |
| 83 | + NSMutableString *javascript = [NSMutableString string]; | |
| 84 | + [javascript appendString:@"document.documentElement.style.webkitTouchCallout='none';"];//禁止长按 | |
| 85 | + [javascript appendString:@"document.documentElement.style.webkitUserSelect='none';"];//禁止选择 | |
| 86 | + WKUserScript *noneSelectScript = [[WKUserScript alloc] initWithSource:javascript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES]; | |
| 87 | + [userController addUserScript:script]; | |
| 88 | + [userController addUserScript:noneSelectScript]; | |
| 89 | + config.userContentController = userController; | |
| 90 | + | |
| 91 | + WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config]; | |
| 92 | + webView.navigationDelegate = self; | |
| 93 | + webView.UIDelegate = self; | |
| 94 | + webView.scrollView.bounces = NO; | |
| 95 | + webView.scrollView.showsVerticalScrollIndicator = NO; | |
| 96 | + webView.scrollView.showsHorizontalScrollIndicator = NO; | |
| 97 | + [self.view addSubview:webView]; | |
| 98 | + _webView = webView; | |
| 99 | + | |
| 100 | + CNLiveCancellationView *cancellationView = [[CNLiveCancellationView alloc]init]; | |
| 101 | + cancellationView.delegate = self; | |
| 102 | + [self.view addSubview:cancellationView]; | |
| 103 | + _cancellationView = cancellationView; | |
| 104 | + | |
| 105 | +} | |
| 106 | +- (void)layoutUI{ | |
| 107 | + [_cancellationView mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 108 | + make.left.equalTo(self.view.mas_left).with.offset(0); | |
| 109 | + make.right.equalTo(self.view.mas_right).with.offset(-0); | |
| 110 | + make.bottom.equalTo(self.view.mas_bottom).with.offset(-SafeAreaInsetsConstantForDeviceWithNotch.bottom); | |
| 111 | + make.height.offset(120); | |
| 112 | + }]; | |
| 113 | + [_webView mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 114 | + make.top.equalTo(self.view.mas_top).with.offset(NavigationContentTop); | |
| 115 | + make.left.equalTo(self.view.mas_left).with.offset(0); | |
| 116 | + make.right.equalTo(self.view.mas_right).with.offset(-0); | |
| 117 | + make.bottom.equalTo(_cancellationView.mas_top).with.offset(-0); | |
| 118 | + | |
| 119 | + }]; | |
| 120 | + | |
| 121 | +} | |
| 122 | +#pragma mark - WKNavigationDelegate | |
| 123 | +// 页面加载完成之后调用 | |
| 124 | +- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ | |
| 125 | + [QMUITips hideAllTipsInView:self.view]; | |
| 126 | + | |
| 127 | +} | |
| 128 | +// 页面加载失败时调用 | |
| 129 | +- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation{ | |
| 130 | + [self loadHTMLString]; | |
| 131 | + [QMUITips hideAllTipsInView:self.view]; | |
| 132 | + | |
| 133 | +} | |
| 134 | + | |
| 135 | +#pragma mark - CNLiveCancellationViewDelegate | |
| 136 | +- (void)clickedProtocol:(CNLiveCancellationView *)view{ | |
| 137 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementCancellation]; | |
| 138 | +} | |
| 139 | + | |
| 140 | +- (void)clickedCancellation:(CNLiveCancellationView *)view{ | |
| 141 | + __weak typeof(self) weakSelf = self; | |
| 142 | + QMUIAlertAction *sure = [QMUIAlertAction actionWithTitle:@"是" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 143 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 144 | + if(!strongSelf) return ; | |
| 145 | + [strongSelf sendCancellationRequest]; | |
| 146 | + | |
| 147 | + }]; | |
| 148 | + QMUIAlertAction *cancel = [QMUIAlertAction actionWithTitle:@"否" style:QMUIAlertActionStyleCancel handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 149 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 150 | + if(!strongSelf) return ; | |
| 151 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 152 | + | |
| 153 | + }]; | |
| 154 | + | |
| 155 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"您确定要注销此账户吗,工作人员将在5个工作日内完成审核" message:@"" preferredStyle:QMUIAlertControllerStyleAlert]; | |
| 156 | + [alertController addAction:sure]; | |
| 157 | + [alertController addAction:cancel]; | |
| 158 | + | |
| 159 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 160 | + | |
| 161 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 162 | + | |
| 163 | + NSMutableDictionary *cancelAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 164 | + cancelAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 165 | + | |
| 166 | + sure.buttonAttributes = titleAttributs; | |
| 167 | + cancel.buttonAttributes = cancelAttributs; | |
| 168 | + | |
| 169 | + [alertController showWithAnimated:YES]; | |
| 170 | + | |
| 171 | +} | |
| 172 | + | |
| 173 | +#pragma mark - Private Methods | |
| 174 | +- (void)loadHTMLString{ | |
| 175 | + NSString *htmlContent = [NSString stringWithFormat:@"<div style=\"padding:0 5px;\"><p style=\"font-size:1.0625em;\"><strong>%@</strong></p><hr style=\"background-color:#EEEEEE;height:1px;border:none;\"/><p style=\"font-size:1em;\">%@</p><hr style=\"background-color:#EEEEEE;height:1px;border:none;\"/><p style=\"font-size:1em;\">%@</p><hr style=\"background-color:#EEEEEE;height:1px;border:none;\"/><p style=\"font-size:1em;\">%@</p><hr style=\"background-color:#EEEEEE;height:1px;border:none;\"/><p style=\"font-size:1em;\">%@</p></div>",@"我们对你注销网家家账号的决定深表遗憾。如果你仍执意注销账号,你的账号需同时满足以下条件:",@"1.账号处于安全状态: 最近1个月内无绑定手机/修改手机号、无找回密码/修改密码等操作,账号为正常使用中且在1年内无任何账号被限制的记录。",@"2.账号财产已结清,没有未完成和/或存在争议的服务: 账号中没有资产、欠款、未结清的资金和虚拟权益;本账号及通过本账号接入的第三方中没有未完成和/或存在争议的服务。",@"3.账号权限解除: 账号已解除与其他产品、网站授权登录或绑定关系。",@"4.账号无任何纠纷,包括投诉举报或被投诉举报。"]; | |
| 176 | + [_webView loadHTMLString:htmlContent baseURL:nil]; | |
| 177 | + | |
| 178 | +} | |
| 179 | +//请求注销接口 | |
| 180 | +- (void)sendCancellationRequest{ | |
| 181 | + NSDictionary *params = @{@"loginSid":CNUserShareModel.uid}; | |
| 182 | + [CNLiveNetworking setAllowRequestDefaultArgument:YES]; | |
| 183 | + [CNLiveNetworking setupShowDataResult:NO]; | |
| 184 | + | |
| 185 | + [QMUITips showLoadingInView:self.view]; | |
| 186 | + | |
| 187 | + [CNLiveNetworking requestNetworkWithMethod:CNLiveRequestMethodPOST URLString:CNCancellationUrl Param:params CacheType:CNLiveNetworkCacheTypeNetworkOnly CompletionBlock:^(NSURLSessionTask *requestTask, id responseObject, NSError *error) { | |
| 188 | + [QMUITips hideAllTipsInView:self.view]; | |
| 189 | + if ([responseObject isKindOfClass:[NSDictionary class]] && [responseObject[@"errorCode"] isEqualToString:@"0"]) { | |
| 190 | + //我知道了 | |
| 191 | + [self showIKnow]; | |
| 192 | + | |
| 193 | + }else if([responseObject[@"errorCode"] isEqualToString:@"455"]){ | |
| 194 | + [QMUITips showError:@"账号已经在注销中,请等待" inView:self.view hideAfterDelay:timeValue]; | |
| 195 | + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | |
| 196 | + [self.navigationController popViewControllerAnimated:YES]; | |
| 197 | + | |
| 198 | + }); | |
| 199 | + | |
| 200 | + }else{ | |
| 201 | + [QMUITips showError:@"注销失败" inView:self.view hideAfterDelay:timeValue]; | |
| 202 | + | |
| 203 | + } | |
| 204 | + | |
| 205 | + }]; | |
| 206 | + | |
| 207 | +} | |
| 208 | + | |
| 209 | +//我知道了 | |
| 210 | +- (void)showIKnow{ | |
| 211 | + __weak typeof(self) weakSelf = self; | |
| 212 | + QMUIAlertAction *sure = [QMUIAlertAction actionWithTitle:@"我知道了" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 213 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 214 | + if(!strongSelf) return ; | |
| 215 | + [strongSelf.navigationController popViewControllerAnimated:YES]; | |
| 216 | + | |
| 217 | + }]; | |
| 218 | + | |
| 219 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"您的注销申请已提交,我们将在5个工作日内完成审核" message:@"" preferredStyle:QMUIAlertControllerStyleAlert]; | |
| 220 | + [alertController addAction:sure]; | |
| 221 | + | |
| 222 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 223 | + | |
| 224 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 225 | + | |
| 226 | + NSMutableDictionary *cancelAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 227 | + cancelAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 228 | + sure.buttonAttributes = titleAttributs; | |
| 229 | + [alertController showWithAnimated:YES]; | |
| 230 | + | |
| 231 | +} | |
| 232 | + | |
| 233 | +/* | |
| 234 | +#pragma mark - Navigation | |
| 235 | + | |
| 236 | +// In a storyboard-based application, you will often want to do a little preparation before navigation | |
| 237 | +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | |
| 238 | + // Get the new view controller using [segue destinationViewController]. | |
| 239 | + // Pass the selected object to the new view controller. | |
| 240 | +} | |
| 241 | +*/ | |
| 242 | + | |
| 243 | +#pragma mark - 懒加载 | |
| 244 | +- (CNLiveNavigationBar *)navigationBar { | |
| 245 | + if (!_navigationBar) { | |
| 246 | + _navigationBar = [CNLiveNavigationBar navigationBar]; | |
| 247 | + _navigationBar.title.text = @"审核申请"; | |
| 248 | + __weak typeof(self) weakSelf = self; | |
| 249 | + _navigationBar.onClickLeftButton = ^{ | |
| 250 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 251 | + if(!strongSelf) return ; | |
| 252 | + [strongSelf goBack]; | |
| 253 | + }; | |
| 254 | + } | |
| 255 | + return _navigationBar; | |
| 256 | +} | |
| 257 | + | |
| 258 | +#pragma mark - 响应方法 | |
| 259 | +- (void)goBack { | |
| 260 | + if (self.presentingViewController != nil) { | |
| 261 | + [self dismissViewControllerAnimated:YES completion:nil]; | |
| 262 | + } | |
| 263 | + else { | |
| 264 | + [self.navigationController popViewControllerAnimated:YES]; | |
| 265 | + } | |
| 266 | +} | |
| 267 | + | |
| 268 | +@end | ... | ... |
CNLiveBMineModule/Classes/Setting/Cancellation/CNLiveCancellationView.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveCancellationView.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by CNLive-zxw on 2019/3/21. | |
| 6 | +// Copyright © 2019年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <UIKit/UIKit.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | +@class CNLiveCancellationView; | |
| 13 | +@protocol CNLiveCancellationViewDelegate <NSObject> | |
| 14 | +- (void)clickedCancellation:(CNLiveCancellationView *)view; | |
| 15 | +- (void)clickedProtocol:(CNLiveCancellationView *)view; | |
| 16 | + | |
| 17 | +@end | |
| 18 | +@interface CNLiveCancellationView : UIView | |
| 19 | +@property (nonatomic, weak) id<CNLiveCancellationViewDelegate> delegate; | |
| 20 | + | |
| 21 | +@end | |
| 22 | + | |
| 23 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Setting/Cancellation/CNLiveCancellationView.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveCancellationView.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by CNLive-zxw on 2019/3/21. | |
| 6 | +// Copyright © 2019年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveCancellationView.h" | |
| 10 | +#import "YYKit.h" | |
| 11 | +#import <Masonry/Masonry.h> | |
| 12 | +#import "CNLiveCategory.h" | |
| 13 | + | |
| 14 | +@interface CNLiveCancellationView()<UITextViewDelegate> | |
| 15 | +@property (nonatomic, strong) UIButton *agreeBtn; | |
| 16 | +@property (nonatomic, strong) YYLabel *protocol; | |
| 17 | +@property (nonatomic, strong) UIButton *cancellationBtn; | |
| 18 | + | |
| 19 | +@end | |
| 20 | + | |
| 21 | +@implementation CNLiveCancellationView | |
| 22 | +static const NSInteger margin = 15; | |
| 23 | +#pragma mark - Init | |
| 24 | +- (instancetype)initWithFrame:(CGRect)frame { | |
| 25 | + self = [super initWithFrame:frame]; | |
| 26 | + if (self) { | |
| 27 | + self.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 28 | + [self setup]; | |
| 29 | + } | |
| 30 | + return self; | |
| 31 | +} | |
| 32 | +- (void)dealloc{ | |
| 33 | + | |
| 34 | +} | |
| 35 | + | |
| 36 | +#pragma mark - UI | |
| 37 | +- (void)setup { | |
| 38 | + [self addSubview:self.agreeBtn]; | |
| 39 | + [self addSubview:self.protocol]; | |
| 40 | + [self addSubview:self.cancellationBtn]; | |
| 41 | + | |
| 42 | +} | |
| 43 | +- (void)layoutSubviews{ | |
| 44 | + [super layoutSubviews]; | |
| 45 | + [_agreeBtn mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 46 | + make.left.equalTo(self.mas_left).with.offset(0); | |
| 47 | + make.top.equalTo(self.mas_top).with.offset(margin); | |
| 48 | + make.width.height.offset(30); | |
| 49 | + | |
| 50 | + }]; | |
| 51 | + [_protocol mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 52 | + make.left.equalTo(self->_agreeBtn.mas_right).with.offset(8); | |
| 53 | + make.right.equalTo(self.mas_right).with.offset(-margin); | |
| 54 | + make.top.equalTo(self->_agreeBtn.mas_top).with.offset(0); | |
| 55 | + make.height.offset(30); | |
| 56 | + | |
| 57 | + }]; | |
| 58 | + [_cancellationBtn mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 59 | + make.left.equalTo(self.mas_left).with.offset(margin); | |
| 60 | + make.right.equalTo(self.mas_right).with.offset(-margin); | |
| 61 | + make.bottom.equalTo(self.mas_bottom).with.offset(-margin); | |
| 62 | + make.height.offset(40); | |
| 63 | + | |
| 64 | + }]; | |
| 65 | + | |
| 66 | +} | |
| 67 | + | |
| 68 | +#pragma mark - Data | |
| 69 | +/* | |
| 70 | + // Only override drawRect: if you perform custom drawing. | |
| 71 | + // An empty implementation adversely affects performance during animation. | |
| 72 | + - (void)drawRect:(CGRect)rect { | |
| 73 | + // Drawing code | |
| 74 | + } | |
| 75 | + */ | |
| 76 | +#pragma mark - Action | |
| 77 | +- (void)clickedAgreeButton:(UIButton *)btn{ | |
| 78 | + btn.selected = !btn.selected; | |
| 79 | + if(btn.selected){ | |
| 80 | + _cancellationBtn.backgroundColor = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 81 | + | |
| 82 | + }else{ | |
| 83 | + _cancellationBtn.backgroundColor = [UIColor colorWithRed:146/255.0 green:227/255.0 blue:154/255.0 alpha:1.0]; | |
| 84 | + } | |
| 85 | +} | |
| 86 | +- (void)cancellationDidClicked:(UIButton *)btn{ | |
| 87 | + if (self.delegate && [self.delegate respondsToSelector:@selector(clickedCancellation:)] && _agreeBtn.selected) { | |
| 88 | + [self.delegate clickedCancellation:self]; | |
| 89 | + | |
| 90 | + } | |
| 91 | +} | |
| 92 | + | |
| 93 | +#pragma mark - UITextViewDelegate | |
| 94 | +- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange { | |
| 95 | + if ([[URL scheme] isEqualToString:@"cancellation"]) { | |
| 96 | + if (self.delegate && [self.delegate respondsToSelector:@selector(clickedProtocol:)]) { | |
| 97 | + [self.delegate clickedProtocol:self]; | |
| 98 | + | |
| 99 | + } | |
| 100 | + return NO; | |
| 101 | + } | |
| 102 | + return YES; | |
| 103 | +} | |
| 104 | + | |
| 105 | +#pragma mark - Lazy loading | |
| 106 | +- (UIButton *)agreeBtn{ | |
| 107 | + if (!_agreeBtn) { | |
| 108 | + _agreeBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | |
| 109 | + UIImage *xw_image1 = [self getImageWithImageName:@"mine_cancellation_agree" bundleName:@"CNLiveBMineModule" targetClass:[CNLiveCancellationView class]]; | |
| 110 | + | |
| 111 | + UIImage *xw_image2 = [self getImageWithImageName:@"mine_cancellation_agree_sel" bundleName:@"CNLiveBMineModule" targetClass:[CNLiveCancellationView class]]; | |
| 112 | + | |
| 113 | + [_agreeBtn setImage:xw_image1 forState:UIControlStateNormal]; | |
| 114 | + [_agreeBtn setImage:xw_image2 forState:UIControlStateSelected]; | |
| 115 | + [_agreeBtn addTarget:self action:@selector(clickedAgreeButton:) forControlEvents:UIControlEventTouchUpInside]; | |
| 116 | + _agreeBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;//居左显示 | |
| 117 | + | |
| 118 | + } | |
| 119 | + return _agreeBtn; | |
| 120 | +} | |
| 121 | + | |
| 122 | +- (YYLabel *)protocol{ | |
| 123 | + if (!_protocol) { | |
| 124 | + _protocol = [[YYLabel alloc] init]; | |
| 125 | + NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"我已阅读并同意《注销协议》"]; | |
| 126 | + text.font = [UIFont fontWithName:@"PingFangSC-Regular" size:16]; | |
| 127 | + text.color = [UIColor colorWithRed:40/255.0 green:40/255.0 blue:40/255.0 alpha:1.0]; | |
| 128 | + | |
| 129 | + __weak typeof(self) weakSelf = self; | |
| 130 | + [text setTextHighlightRange:NSMakeRange(7, 6) color:[UIColor colorWithRed:72/255.0 green:167/255.0 blue:249/255.0 alpha:1.0] backgroundColor:[UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0] tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) { | |
| 131 | + if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(clickedProtocol:)]) { | |
| 132 | + [weakSelf.delegate clickedProtocol:weakSelf]; | |
| 133 | + | |
| 134 | + } | |
| 135 | + | |
| 136 | + }]; | |
| 137 | + | |
| 138 | + _protocol.attributedText = text; | |
| 139 | + | |
| 140 | + } | |
| 141 | + return _protocol; | |
| 142 | +} | |
| 143 | + | |
| 144 | +- (UIButton *)cancellationBtn{ | |
| 145 | + if (!_cancellationBtn) { | |
| 146 | + _cancellationBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | |
| 147 | + [_cancellationBtn setTitle:@"确认注销" forState:UIControlStateNormal]; | |
| 148 | + _cancellationBtn.backgroundColor = [UIColor colorWithRed:72/255.0 green:167/255.0 blue:249/255.0 alpha:1.0]; | |
| 149 | + _cancellationBtn.titleLabel.font = [UIFont fontWithName:@"PingFangSC-Regular" size:17]; | |
| 150 | + _cancellationBtn.layer.cornerRadius = 20; | |
| 151 | + _cancellationBtn.layer.masksToBounds = YES; | |
| 152 | + [_cancellationBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | |
| 153 | + [_cancellationBtn addTarget:self action:@selector(cancellationDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | |
| 154 | + } | |
| 155 | + return _cancellationBtn; | |
| 156 | +} | |
| 157 | + | |
| 158 | +@end | |
| 159 | + | ... | ... |
CNLiveBMineModule/Classes/Setting/Controller/CNLiveSettingController.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveSettingController.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * 设置 | |
| 11 | + */ | |
| 12 | + | |
| 13 | +#import <UIKit/UIKit.h> | |
| 14 | +#import "CNCommonViewController.h" | |
| 15 | + | |
| 16 | +NS_ASSUME_NONNULL_BEGIN | |
| 17 | + | |
| 18 | +@interface CNLiveSettingController : CNCommonViewController | |
| 19 | + | |
| 20 | +@end | |
| 21 | + | |
| 22 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Setting/Controller/CNLiveSettingController.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveSettingController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveSettingController.h" | |
| 10 | +#import "MJExtension.h" | |
| 11 | +#import <SDWebImage/SDWebImage.h> | |
| 12 | +#import "QMUIKit.h" | |
| 13 | + | |
| 14 | +#import "CNLiveUserAgreementManager.h" | |
| 15 | +#import "CNUserInfoManager.h" | |
| 16 | + | |
| 17 | +#import "CNLiveSettingModel.h" | |
| 18 | +#import "CNLiveSettingCell.h" | |
| 19 | +#import "CNLiveServices.h" | |
| 20 | +#import "CNLiveNavigationBar.h" | |
| 21 | + | |
| 22 | +#import "CNLiveUpdateTelController.h"//修改手机号 | |
| 23 | +#import "CNLiveCancellationController.h"//注销 | |
| 24 | +#import "CNLiveAboutUsController.h"//关于我们 | |
| 25 | +#import "CNLiveBaseKit.h" | |
| 26 | + | |
| 27 | +@interface CNLiveSettingController () | |
| 28 | +<UITableViewDelegate, UITableViewDataSource> | |
| 29 | +@property (nonatomic, strong) CNLiveNavigationBar *navigationBar; | |
| 30 | +@property (nonatomic, strong) UITableView *tableView; | |
| 31 | +@property (nonatomic, strong) UIButton *logout; | |
| 32 | +@property (nonatomic, strong) NSMutableArray *data; | |
| 33 | + | |
| 34 | +@end | |
| 35 | + | |
| 36 | +@implementation CNLiveSettingController | |
| 37 | +static const NSInteger timeValue = 1.5; | |
| 38 | +#pragma mark - 加载数据 | |
| 39 | +- (void)loadData { | |
| 40 | + NSArray *data = @[ | |
| 41 | + @{ | |
| 42 | + @"style":@"2", | |
| 43 | + @"title":@"更换手机号", | |
| 44 | + @"content":CNUserShareModel.mobile, | |
| 45 | + @"height":@"60", | |
| 46 | + @"lineHeight":@"10" | |
| 47 | + }, | |
| 48 | + @{ | |
| 49 | + @"style":@"2", | |
| 50 | + @"title":@"绑定管理", | |
| 51 | + @"content":@"", | |
| 52 | + @"height":@"60", | |
| 53 | + @"lineHeight":@"10" | |
| 54 | + }, | |
| 55 | + @{ | |
| 56 | + @"style":@"2", | |
| 57 | + @"title":@"帮助与反馈", | |
| 58 | + @"content":@"", | |
| 59 | + @"height":@"60", | |
| 60 | + @"lineHeight":@"10" | |
| 61 | + }, | |
| 62 | + @{ | |
| 63 | + @"style":@"2", | |
| 64 | + @"title":@"清除缓存", | |
| 65 | + @"content":@"30k", | |
| 66 | + @"height":@"51", | |
| 67 | + @"lineHeight":@"1" | |
| 68 | + }, | |
| 69 | + @{ | |
| 70 | + @"style":@"1", | |
| 71 | + @"title":@"关于我们", | |
| 72 | + @"height":@"51", | |
| 73 | + @"lineHeight":@"1" | |
| 74 | + }, | |
| 75 | + @{ | |
| 76 | + @"style":@"1", | |
| 77 | + @"title":@"注销账号", | |
| 78 | + @"height":@"51", | |
| 79 | + @"lineHeight":@"1" | |
| 80 | + } | |
| 81 | + | |
| 82 | + ]; | |
| 83 | + for(NSDictionary *dic in data){ | |
| 84 | + [self.data addObject:[CNLiveSettingModel mj_objectWithKeyValues:dic]]; | |
| 85 | + } | |
| 86 | + [self getSDCacheSize]; | |
| 87 | + [self.tableView reloadData]; | |
| 88 | + | |
| 89 | +} | |
| 90 | +- (void)getSDCacheSize { | |
| 91 | + __weak typeof(self) weakSelf = self; | |
| 92 | + [[SDImageCache sharedImageCache] calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) { | |
| 93 | + NSString *cacheString = @""; | |
| 94 | + if (totalSize/(1024.0*1024.0) >= 1.0) { | |
| 95 | + cacheString = [NSString stringWithFormat:@"%.1fMB",totalSize/(1024.0*1024)]; | |
| 96 | + } else { | |
| 97 | + cacheString = [NSString stringWithFormat:@"%.1fKB",totalSize/1024.0]; | |
| 98 | + } | |
| 99 | + for (CNLiveSettingModel *model in self.data) { | |
| 100 | + if([model.title isEqualToString:@"清除缓存"]){ | |
| 101 | + model.content = cacheString; | |
| 102 | + } | |
| 103 | + } | |
| 104 | + [weakSelf.tableView reloadData]; | |
| 105 | + | |
| 106 | + }]; | |
| 107 | +} | |
| 108 | + | |
| 109 | +#pragma mark - 生命周期 | |
| 110 | +- (void)viewWillAppear:(BOOL)animated{ | |
| 111 | + [super viewWillAppear:animated]; | |
| 112 | + self.navigationController.navigationBarHidden = YES; | |
| 113 | + [self.tableView reloadData]; | |
| 114 | + self.logout.titleLabel.font = UIFontBoldCNMake(17.0); | |
| 115 | + | |
| 116 | +} | |
| 117 | + | |
| 118 | +- (void)viewDidLoad { | |
| 119 | + [super viewDidLoad]; | |
| 120 | + self.view.backgroundColor = [UIColor whiteColor]; | |
| 121 | + if (@available(iOS 11, *)) { | |
| 122 | + self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; | |
| 123 | + } | |
| 124 | + else { | |
| 125 | + self.automaticallyAdjustsScrollViewInsets = NO; | |
| 126 | + } | |
| 127 | + | |
| 128 | + [self createSubViews]; | |
| 129 | + [self loadData]; | |
| 130 | + | |
| 131 | +} | |
| 132 | + | |
| 133 | +- (void)dealloc { | |
| 134 | + | |
| 135 | + | |
| 136 | +} | |
| 137 | + | |
| 138 | +- (void)createSubViews { | |
| 139 | + [self.view addSubview:self.navigationBar]; | |
| 140 | + [self.view addSubview:self.tableView]; | |
| 141 | + [self.view addSubview:self.logout]; | |
| 142 | + | |
| 143 | +} | |
| 144 | +#pragma mark - UITableViewDelegate | |
| 145 | +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ | |
| 146 | + CNLiveSettingModel *model = self.data[indexPath.row]; | |
| 147 | + return model.height; | |
| 148 | +} | |
| 149 | + | |
| 150 | +#pragma mark - UITableViewDataSource | |
| 151 | +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | |
| 152 | + return self.data.count; | |
| 153 | +} | |
| 154 | + | |
| 155 | +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { | |
| 156 | + CNLiveSettingCell *cell = [tableView dequeueReusableCellWithIdentifier:kCNLiveSettingCell]; | |
| 157 | + cell.selectionStyle = UITableViewCellSelectionStyleNone; | |
| 158 | + CNLiveSettingModel *model = self.data[indexPath.row]; | |
| 159 | + cell.model = model; | |
| 160 | + return cell; | |
| 161 | +} | |
| 162 | + | |
| 163 | +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ | |
| 164 | + if(indexPath.row == 0){ // 更换手机号 | |
| 165 | + CNLiveUpdateTelController *vc = [[CNLiveUpdateTelController alloc]init]; | |
| 166 | + [self.navigationController pushViewController:vc animated:YES]; | |
| 167 | + | |
| 168 | + } | |
| 169 | + else if(indexPath.row == 1){ //绑定管理 | |
| 170 | + | |
| 171 | + } | |
| 172 | + else if(indexPath.row == 2){ //帮助手册 | |
| 173 | + [CNLiveUserAgreementManager jumpToAgreementH5WithType:CNLiveUserAgreementHelp]; | |
| 174 | + | |
| 175 | + } | |
| 176 | + else if(indexPath.row == 3){ // 清除缓存 | |
| 177 | + __weak typeof(self) weakSelf = self; | |
| 178 | + QMUIAlertAction *sure = [QMUIAlertAction actionWithTitle:@"确定" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 179 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 180 | + if(!strongSelf) return ; | |
| 181 | + [strongSelf cleanLocalCache]; | |
| 182 | + | |
| 183 | + }]; | |
| 184 | + QMUIAlertAction *cancel = [QMUIAlertAction actionWithTitle:@"取消" style:QMUIAlertActionStyleCancel handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 185 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 186 | + if(!strongSelf) return ; | |
| 187 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 188 | + | |
| 189 | + }]; | |
| 190 | + | |
| 191 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"确定清除本地缓存吗?" message:@"" preferredStyle:QMUIAlertControllerStyleAlert]; | |
| 192 | + [alertController addAction:sure]; | |
| 193 | + [alertController addAction:cancel]; | |
| 194 | + | |
| 195 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 196 | + | |
| 197 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 198 | + | |
| 199 | + NSMutableDictionary *cancelAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 200 | + cancelAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 201 | + | |
| 202 | + sure.buttonAttributes = titleAttributs; | |
| 203 | + cancel.buttonAttributes = cancelAttributs; | |
| 204 | + | |
| 205 | + [alertController showWithAnimated:YES]; | |
| 206 | + | |
| 207 | + }else if (indexPath.row == 4){ | |
| 208 | + CNLiveAboutUsController *vc = [[CNLiveAboutUsController alloc]init]; | |
| 209 | + [self.navigationController pushViewController:vc animated:YES]; | |
| 210 | + } | |
| 211 | + else if (indexPath.row == 5) { | |
| 212 | + CNLiveCancellationController *vc = [[CNLiveCancellationController alloc]init]; | |
| 213 | + [self.navigationController pushViewController:vc animated:YES]; | |
| 214 | + } | |
| 215 | +} | |
| 216 | + | |
| 217 | +#pragma mark - 懒加载 | |
| 218 | +- (NSMutableArray *)data { | |
| 219 | + if (!_data) { | |
| 220 | + _data = [NSMutableArray array]; | |
| 221 | + } | |
| 222 | + return _data; | |
| 223 | +} | |
| 224 | + | |
| 225 | +- (CNLiveNavigationBar *)navigationBar { | |
| 226 | + if (!_navigationBar) { | |
| 227 | + _navigationBar = [CNLiveNavigationBar navigationBar]; | |
| 228 | + _navigationBar.title.text = @"设置"; | |
| 229 | + __weak typeof(self) weakSelf = self; | |
| 230 | + _navigationBar.onClickLeftButton = ^{ | |
| 231 | + [weakSelf goBack]; | |
| 232 | + }; | |
| 233 | + } | |
| 234 | + return _navigationBar; | |
| 235 | +} | |
| 236 | + | |
| 237 | +- (UITableView *)tableView{ | |
| 238 | + if(!_tableView){ | |
| 239 | + _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, NavigationContentTop, SCREEN_WIDTH, SCREEN_HEIGHT-NavigationContentTop-50) style:UITableViewStylePlain]; | |
| 240 | + _tableView.delegate = self; | |
| 241 | + _tableView.dataSource = self; | |
| 242 | + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; | |
| 243 | + _tableView.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 244 | + _tableView.estimatedRowHeight = 0; | |
| 245 | + _tableView.estimatedSectionHeaderHeight = 0; | |
| 246 | + _tableView.estimatedSectionFooterHeight = 0; | |
| 247 | + [_tableView registerClass:[CNLiveSettingCell class] forCellReuseIdentifier:kCNLiveSettingCell]; | |
| 248 | + } | |
| 249 | + return _tableView; | |
| 250 | +} | |
| 251 | + | |
| 252 | +- (UIButton *)logout{ | |
| 253 | + if(!_logout){ | |
| 254 | + _logout = [UIButton buttonWithType:UIButtonTypeCustom]; | |
| 255 | + _logout.frame = CGRectMake(0, SCREEN_HEIGHT-SafeAreaInsetsConstantForDeviceWithNotch.bottom-50, SCREEN_WIDTH, 50); | |
| 256 | + _logout.backgroundColor = [UIColor whiteColor]; | |
| 257 | + _logout.titleLabel.font = UIFontBoldCNMake(17.0); | |
| 258 | + [_logout setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; | |
| 259 | + [_logout setTitle:@"退出登录" forState:UIControlStateNormal]; | |
| 260 | + _logout.adjustsImageWhenHighlighted = NO; | |
| 261 | + [_logout addTarget:self action:@selector(logoutDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | |
| 262 | + } | |
| 263 | + return _logout; | |
| 264 | +} | |
| 265 | + | |
| 266 | +#pragma mark - 响应方法 | |
| 267 | +- (void)goBack { | |
| 268 | + if (self.presentingViewController != nil) { | |
| 269 | + [self dismissViewControllerAnimated:YES completion:nil]; | |
| 270 | + } | |
| 271 | + else { | |
| 272 | + [self.navigationController popViewControllerAnimated:YES]; | |
| 273 | + } | |
| 274 | +} | |
| 275 | + | |
| 276 | +- (void)logoutDidClicked:(UIButton *)btn{ | |
| 277 | + QMUIAlertAction *sure = [QMUIAlertAction actionWithTitle:@"退出登录" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 278 | + [UIApplication sharedApplication].delegate.window.rootViewController = nil; | |
| 279 | + [self cleanLocalCache]; | |
| 280 | + id<CNLiveLoginServiceProtocol> login = [[BeeHive shareInstance] createService:@protocol(CNLiveLoginServiceProtocol)]; | |
| 281 | + UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[login getLoginViewController]]; | |
| 282 | + [UIApplication sharedApplication].delegate.window.rootViewController = nav; | |
| 283 | + }]; | |
| 284 | + | |
| 285 | + QMUIAlertAction *cancel = [QMUIAlertAction actionWithTitle:@"取消" style:QMUIAlertActionStyleCancel handler:nil]; | |
| 286 | + | |
| 287 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:QMUIAlertControllerStyleActionSheet]; | |
| 288 | + [alertController addAction:sure]; | |
| 289 | + [alertController addAction:cancel]; | |
| 290 | + | |
| 291 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 292 | + | |
| 293 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 294 | + | |
| 295 | + NSMutableDictionary *cancelAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 296 | + cancelAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 297 | + | |
| 298 | + sure.buttonAttributes = titleAttributs; | |
| 299 | + cancel.buttonAttributes = cancelAttributs; | |
| 300 | + | |
| 301 | + [alertController showWithAnimated:YES]; | |
| 302 | + | |
| 303 | +} | |
| 304 | + | |
| 305 | +#pragma mark - 私有方法 | |
| 306 | +// 清除本地缓存 | |
| 307 | +- (void)cleanLocalCache{ | |
| 308 | +// [XWUserManager removeUserInfo]; | |
| 309 | + [[SDImageCache sharedImageCache] clearMemory]; | |
| 310 | + [[SDImageCache sharedImageCache] clearDiskOnCompletion:^{ | |
| 311 | + [QMUITips showSucceed:@"清除成功" inView:self.view hideAfterDelay:timeValue]; | |
| 312 | + [self getSDCacheSize]; | |
| 313 | + | |
| 314 | + }]; | |
| 315 | +} | |
| 316 | + | |
| 317 | +#pragma mark - 公共方法 | |
| 318 | +// 清除本地缓存 | |
| 319 | ++ (void)cleanLocalCache{ | |
| 320 | +// [XWUserManager removeUserInfo]; | |
| 321 | + [[SDImageCache sharedImageCache] clearMemory]; | |
| 322 | + [[SDImageCache sharedImageCache] clearDiskOnCompletion:^{ | |
| 323 | + | |
| 324 | + }]; | |
| 325 | +} | |
| 326 | + | |
| 327 | +@end | ... | ... |
CNLiveBMineModule/Classes/Setting/Model/CNLiveSettingModel.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveSettingModel.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | +typedef NS_ENUM(NSInteger, CNLiveSettingModelType) { | |
| 13 | + CNLiveSettingModelTypeDefault = 0, | |
| 14 | + CNLiveSettingModelTypeText = 1, | |
| 15 | + CNLiveSettingModelTypeTextFront = 2 | |
| 16 | +}; | |
| 17 | + | |
| 18 | +@interface CNLiveSettingModel : NSObject | |
| 19 | +@property (nonatomic, copy) NSString *title; | |
| 20 | +@property (nonatomic, copy) NSString *content; | |
| 21 | +@property (nonatomic, copy) NSString *style; | |
| 22 | + | |
| 23 | +@property (nonatomic, assign) CNLiveSettingModelType type; | |
| 24 | +@property (nonatomic, assign) CGFloat height; | |
| 25 | +@property (nonatomic, assign) CGFloat lineHeight; | |
| 26 | + | |
| 27 | +@end | |
| 28 | + | |
| 29 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Setting/Model/CNLiveSettingModel.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveSettingModel.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveSettingModel.h" | |
| 10 | + | |
| 11 | +@implementation CNLiveSettingModel | |
| 12 | + | |
| 13 | +- (CNLiveSettingModelType)type{ | |
| 14 | + if([self.style isEqualToString:@"1"]){ | |
| 15 | + return CNLiveSettingModelTypeDefault; | |
| 16 | + } | |
| 17 | + else if([self.style isEqualToString:@"2"]){ | |
| 18 | + return CNLiveSettingModelTypeTextFront; | |
| 19 | + | |
| 20 | + } | |
| 21 | + else if([self.style isEqualToString:@"4"]){ | |
| 22 | + return CNLiveSettingModelTypeText; | |
| 23 | + | |
| 24 | + } | |
| 25 | + return CNLiveSettingModelTypeDefault; | |
| 26 | +} | |
| 27 | + | |
| 28 | +@end | ... | ... |
CNLiveBMineModule/Classes/Setting/Model/CNLiveSettingRequest.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveSettingRequest.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | + | |
| 13 | +@interface CNLiveSettingRequest : NSObject | |
| 14 | + | |
| 15 | + | |
| 16 | +@end | |
| 17 | + | |
| 18 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Setting/Model/CNLiveSettingRequest.m
0 → 100644
CNLiveBMineModule/Classes/Setting/UpdateTel/CNLiveUpdateTelController.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveUpdateTelController.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNCommonViewController.h" | |
| 10 | + | |
| 11 | +@interface CNLiveUpdateTelController : CNCommonViewController | |
| 12 | + | |
| 13 | +@end | ... | ... |
CNLiveBMineModule/Classes/Setting/UpdateTel/CNLiveUpdateTelController.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveUpdateTelController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveUpdateTelController.h" | |
| 10 | +#import "CNLiveChooseCountryController.h" | |
| 11 | +#import "YYKit.h" | |
| 12 | +#import <Masonry/Masonry.h> | |
| 13 | +#import "QMUIKit.h" | |
| 14 | + | |
| 15 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemCenter.h> | |
| 16 | +#import "CNUserInfoManager.h" | |
| 17 | +#import "NSString+CNLiveExtension.h" | |
| 18 | +#import "CNLiveCategory.h" | |
| 19 | +#import "CNLiveBaseKit.h" | |
| 20 | + | |
| 21 | +#import "CNLiveNavigationBar.h" | |
| 22 | +#import "CNLiveUpdateTelView.h" | |
| 23 | + | |
| 24 | +@interface CNLiveUpdateTelController()<UITextFieldDelegate, CNLiveUpdateTelViewDelegate, ChooseCountriesDelegate> | |
| 25 | + | |
| 26 | +@property (nonatomic, strong) CNLiveNavigationBar *navigationBar; | |
| 27 | +@property (nonatomic, strong) CNLiveUpdateTelView *updateTel;//背景 | |
| 28 | +@property (nonatomic, strong) YYLabel *connection; | |
| 29 | + | |
| 30 | +@end | |
| 31 | + | |
| 32 | +@implementation CNLiveUpdateTelController | |
| 33 | +static const NSInteger timeValue = 1.5; | |
| 34 | + | |
| 35 | +- (void)viewWillAppear:(BOOL)animated { | |
| 36 | + [super viewWillAppear:animated]; | |
| 37 | + self.navigationController.navigationBarHidden = YES; | |
| 38 | + | |
| 39 | +} | |
| 40 | + | |
| 41 | +- (void)viewDidLoad { | |
| 42 | + [super viewDidLoad]; | |
| 43 | + // Do any additional setup after loading the view. | |
| 44 | + | |
| 45 | + self.view.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 46 | + | |
| 47 | + [self createSubViews]; | |
| 48 | + [self xw_layoutSubviews]; | |
| 49 | + | |
| 50 | + __weak typeof(self) weakSelf = self; | |
| 51 | + QMUIAlertAction *sure = [QMUIAlertAction actionWithTitle:@"确定" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 52 | + | |
| 53 | + }]; | |
| 54 | + QMUIAlertAction *cancel = [QMUIAlertAction actionWithTitle:@"取消" style:QMUIAlertActionStyleCancel handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 55 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 56 | + if(!strongSelf) return ; | |
| 57 | + [strongSelf.navigationController popViewControllerAnimated:YES]; | |
| 58 | + }]; | |
| 59 | + | |
| 60 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"更换手机号将只能使用新绑定的手机号登录app,是否继续修改?" message:@"" preferredStyle:QMUIAlertControllerStyleAlert]; | |
| 61 | + [alertController addAction:sure]; | |
| 62 | + [alertController addAction:cancel]; | |
| 63 | + | |
| 64 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 65 | + | |
| 66 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 67 | + | |
| 68 | + NSMutableDictionary *cancelAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 69 | + cancelAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 70 | + | |
| 71 | + sure.buttonAttributes = titleAttributs; | |
| 72 | + cancel.buttonAttributes = cancelAttributs; | |
| 73 | + | |
| 74 | + [alertController showWithAnimated:YES]; | |
| 75 | + | |
| 76 | +} | |
| 77 | + | |
| 78 | +#pragma mark - UI | |
| 79 | +- (void)createSubViews{ | |
| 80 | + [self.view addSubview:self.navigationBar]; | |
| 81 | + [self.view addSubview:self.updateTel]; | |
| 82 | + [self.view addSubview:self.connection]; | |
| 83 | +} | |
| 84 | + | |
| 85 | +- (void)xw_layoutSubviews{ | |
| 86 | + [self.updateTel mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 87 | + make.left.right.equalTo(self.view); | |
| 88 | + make.top.equalTo(self.view).offset(NavigationContentTop); | |
| 89 | + make.height.mas_equalTo(220); | |
| 90 | + }]; | |
| 91 | + [self.connection mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 92 | + make.left.right.equalTo(self.view); | |
| 93 | + make.bottom.equalTo(self.view.mas_bottom).offset(-30); | |
| 94 | + }]; | |
| 95 | + | |
| 96 | +} | |
| 97 | + | |
| 98 | +- (void)didReceiveMemoryWarning { | |
| 99 | + [super didReceiveMemoryWarning]; | |
| 100 | + // Dispose of any resources that can be recreated. | |
| 101 | +} | |
| 102 | + | |
| 103 | +#pragma mark - ChooseCountriesDelegate | |
| 104 | +- (void)chooseViewController:(CNLiveChooseCountryController *)controller countryName:(NSString *)name countryCode:(NSString *)code{ | |
| 105 | + _updateTel.countryName.text = name; | |
| 106 | + _updateTel.countryCode.text = [NSString stringWithFormat:@"+%@",code]; | |
| 107 | + _updateTel.codeNum = code; | |
| 108 | + | |
| 109 | +} | |
| 110 | + | |
| 111 | +#pragma mark - CNLiveUpdateTelViewDelegate | |
| 112 | +- (void)selectCountry:(CNLiveUpdateTelView *)view{ | |
| 113 | + CNLiveChooseCountryController *vc = [[CNLiveChooseCountryController alloc]init]; | |
| 114 | + vc.modalPresentationStyle = UIModalPresentationFullScreen; | |
| 115 | + vc.delegate = self; | |
| 116 | + vc.hidesBottomBarWhenPushed = YES; | |
| 117 | + [self presentViewController:vc animated:YES completion:nil]; | |
| 118 | +} | |
| 119 | + | |
| 120 | +- (void)bindingSuccess:(CNLiveUpdateTelView *)view{ | |
| 121 | + [self.navigationController popViewControllerAnimated:YES]; | |
| 122 | +} | |
| 123 | + | |
| 124 | +- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | |
| 125 | + [self.updateTel.telTF resignFirstResponder]; | |
| 126 | +} | |
| 127 | + | |
| 128 | +#pragma mark - Lazy Loading | |
| 129 | +- (CNLiveNavigationBar *)navigationBar { | |
| 130 | + if (!_navigationBar) { | |
| 131 | + _navigationBar = [CNLiveNavigationBar navigationBar]; | |
| 132 | + _navigationBar.title.text = @"更换手机号"; | |
| 133 | + __weak typeof(self) weakSelf = self; | |
| 134 | + _navigationBar.onClickLeftButton = ^{ | |
| 135 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 136 | + if(!strongSelf) return ; | |
| 137 | + [strongSelf.navigationController popViewControllerAnimated:YES]; | |
| 138 | + }; | |
| 139 | + | |
| 140 | + } | |
| 141 | + return _navigationBar; | |
| 142 | +} | |
| 143 | + | |
| 144 | +- (CNLiveUpdateTelView *)updateTel{ | |
| 145 | + if (!_updateTel) { | |
| 146 | + _updateTel = [[CNLiveUpdateTelView alloc] init]; | |
| 147 | + _updateTel.delegate = self; | |
| 148 | + _updateTel.codeNum = @"86"; | |
| 149 | + } | |
| 150 | + return _updateTel; | |
| 151 | +} | |
| 152 | + | |
| 153 | +- (YYLabel *)connection { | |
| 154 | + if (!_connection) { | |
| 155 | + _connection = [[YYLabel alloc] init]; | |
| 156 | + _connection.numberOfLines = 0; | |
| 157 | + NSString *str = @"若当前号码已不用或丢失,请点击联系客服"; | |
| 158 | + NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:str]; | |
| 159 | + text.color = [UIColor colorWithRed:34/255.0 green:34/255.0 blue:34/255.0 alpha:1.0]; | |
| 160 | + text.font = UIFontCNMake(12.0); | |
| 161 | + [text setTextHighlightRange:NSMakeRange(text.length-4, 4) color:[UIColor colorWithRed:44/255.0 green:209/255.0 blue:201/255.0 alpha:1.0] backgroundColor:[UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0] tapAction:^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) { | |
| 162 | + | |
| 163 | + NSString *phoneStr = @"010-65832485"; | |
| 164 | + | |
| 165 | + QMUIAlertAction *sure = [QMUIAlertAction actionWithTitle:@"好" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 166 | + if (@available(iOS 10.0, *)) { | |
| 167 | + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",phoneStr]] options:@{} completionHandler:nil]; | |
| 168 | + } else { | |
| 169 | + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",phoneStr]]]; | |
| 170 | + } | |
| 171 | + | |
| 172 | + }]; | |
| 173 | + QMUIAlertAction *cancel = [QMUIAlertAction actionWithTitle:@"取消" style:QMUIAlertActionStyleCancel handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 174 | + }]; | |
| 175 | + | |
| 176 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"联系客服" message:[NSString stringWithFormat:@"将给%@拨打电话",phoneStr] preferredStyle:QMUIAlertControllerStyleAlert]; | |
| 177 | + [alertController addAction:sure]; | |
| 178 | + [alertController addAction:cancel]; | |
| 179 | + | |
| 180 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 181 | + | |
| 182 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 183 | + | |
| 184 | + NSMutableDictionary *cancelAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 185 | + cancelAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 186 | + | |
| 187 | + sure.buttonAttributes = titleAttributs; | |
| 188 | + cancel.buttonAttributes = cancelAttributs; | |
| 189 | + | |
| 190 | + [alertController showWithAnimated:YES]; | |
| 191 | + | |
| 192 | + } ]; | |
| 193 | + _connection.attributedText = text; | |
| 194 | + _connection.textAlignment = NSTextAlignmentCenter; | |
| 195 | + | |
| 196 | + } | |
| 197 | + return _connection; | |
| 198 | +} | |
| 199 | + | |
| 200 | +/* | |
| 201 | +#pragma mark - Navigation | |
| 202 | + | |
| 203 | +// In a storyboard-based application, you will often want to do a little preparation before navigation | |
| 204 | +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | |
| 205 | + // Get the new view controller using [segue destinationViewController]. | |
| 206 | + // Pass the selected object to the new view controller. | |
| 207 | +} | |
| 208 | +*/ | |
| 209 | + | |
| 210 | +@end | ... | ... |
CNLiveBMineModule/Classes/Setting/UpdateTel/CNLiveUpdateTelView.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveUpdateTelView.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by CNLive-zxw on 2019/3/21. | |
| 6 | +// Copyright © 2019年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <UIKit/UIKit.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | +@class CNLiveUpdateTelView; | |
| 13 | +@protocol CNLiveUpdateTelViewDelegate <NSObject> | |
| 14 | +- (void)selectCountry:(CNLiveUpdateTelView *)view; | |
| 15 | +- (void)bindingSuccess:(CNLiveUpdateTelView *)view; | |
| 16 | + | |
| 17 | +@end | |
| 18 | +@interface CNLiveUpdateTelView : UIView | |
| 19 | +@property (nonatomic, weak) id<CNLiveUpdateTelViewDelegate> delegate; | |
| 20 | + | |
| 21 | +@property (nonatomic, strong) UILabel *countryName; | |
| 22 | +@property (nonatomic, strong) UILabel *countryCode; | |
| 23 | + | |
| 24 | +@property (nonatomic, strong) UITextField *telTF; | |
| 25 | +@property (nonatomic, strong) UITextField *codeTF; | |
| 26 | + | |
| 27 | +@property (nonatomic, assign) BOOL gotVerificationCode; | |
| 28 | +@property (nonatomic, assign) BOOL gotVerificationCodeIng; | |
| 29 | + | |
| 30 | +@property (nonatomic, copy) NSString *codeNum; | |
| 31 | + | |
| 32 | +@end | |
| 33 | + | |
| 34 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Setting/UpdateTel/CNLiveUpdateTelView.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveUpdateTelView.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by CNLive-zxw on 2019/3/21. | |
| 6 | +// Copyright © 2019年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveUpdateTelView.h" | |
| 10 | +#import "YYKit.h" | |
| 11 | +#import <Masonry/Masonry.h> | |
| 12 | +#import "QMUIKit.h" | |
| 13 | + | |
| 14 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemCenter.h> | |
| 15 | +#import "NSString+CNLiveExtension.h" | |
| 16 | +#import "CNUserInfoManager.h" | |
| 17 | +#import "CNLiveCategory.h" | |
| 18 | +#import "CNLiveBaseKit.h" | |
| 19 | + | |
| 20 | +#define TIMECOUNT 60; | |
| 21 | + | |
| 22 | +@interface CNLiveUpdateTelView()<UITextFieldDelegate> | |
| 23 | + | |
| 24 | +@property (nonatomic, strong) UIView *lineView; | |
| 25 | +@property (nonatomic, strong) UIImageView *countryImg; | |
| 26 | +@property (nonatomic, strong) UILabel *numberLabel;//手机号 | |
| 27 | +@property (nonatomic, strong) UILabel *codeLabel;//验证码 | |
| 28 | +@property (nonatomic, strong) UIButton *verification;//验证码按钮 | |
| 29 | + | |
| 30 | +@property (nonatomic, strong) UIView *bindingView;//改变按钮 | |
| 31 | +@property (nonatomic, strong) UIButton *binding;//改变按钮 | |
| 32 | + | |
| 33 | +@end | |
| 34 | + | |
| 35 | +@implementation CNLiveUpdateTelView | |
| 36 | +static const NSInteger margin = 15; | |
| 37 | +static const NSInteger timeValue = 1.5; | |
| 38 | + | |
| 39 | +#pragma mark - Init | |
| 40 | +- (instancetype)initWithFrame:(CGRect)frame { | |
| 41 | + self = [super initWithFrame:frame]; | |
| 42 | + if (self) { | |
| 43 | + self.backgroundColor = [UIColor whiteColor]; | |
| 44 | + [self createSubViews]; | |
| 45 | + } | |
| 46 | + return self; | |
| 47 | +} | |
| 48 | + | |
| 49 | +#pragma mark - Data | |
| 50 | +- (void)setCodeNum:(NSString *)codeNum{ | |
| 51 | + _codeNum = codeNum; | |
| 52 | +} | |
| 53 | + | |
| 54 | +#pragma mark - UI | |
| 55 | +- (void)createSubViews { | |
| 56 | + [self addSubview:self.countryName]; | |
| 57 | + [self addSubview:self.lineView]; | |
| 58 | + [self addSubview:self.countryImg]; | |
| 59 | + [self addSubview:self.countryCode]; | |
| 60 | + | |
| 61 | + [self addSubview:self.numberLabel]; | |
| 62 | + [self addSubview:self.telTF]; | |
| 63 | + | |
| 64 | + [self addSubview:self.codeLabel]; | |
| 65 | + [self addSubview:self.codeTF]; | |
| 66 | + | |
| 67 | + [self addSubview:self.verification]; | |
| 68 | + | |
| 69 | + [self addSubview:self.bindingView]; | |
| 70 | + [self addSubview:self.binding]; | |
| 71 | + | |
| 72 | +} | |
| 73 | +- (void)layoutSubviews{ | |
| 74 | + [super layoutSubviews]; | |
| 75 | + | |
| 76 | + [self.countryName mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 77 | + make.top.equalTo(self).offset(0); | |
| 78 | + make.left.equalTo(self).offset(margin); | |
| 79 | + make.height.mas_equalTo(50); | |
| 80 | + }]; | |
| 81 | + [self.lineView mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 82 | + make.top.equalTo(self.countryName.mas_bottom).offset(0); | |
| 83 | + make.left.right.equalTo(self).offset(0); | |
| 84 | + make.height.mas_equalTo(10); | |
| 85 | + }]; | |
| 86 | + [self.countryImg mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 87 | + make.top.equalTo(self).offset(0); | |
| 88 | + make.right.equalTo(self).offset(-margin); | |
| 89 | + make.height.mas_equalTo(50); | |
| 90 | + make.width.mas_equalTo(10); | |
| 91 | + }]; | |
| 92 | + [self.countryCode mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 93 | + make.top.equalTo(self).offset(0); | |
| 94 | + make.right.equalTo(self.countryImg.mas_left).offset(-5); | |
| 95 | + make.height.mas_equalTo(50); | |
| 96 | + }]; | |
| 97 | + [self.numberLabel mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 98 | + make.top.equalTo(self.lineView.mas_bottom).offset(0); | |
| 99 | + make.left.equalTo(self).offset(margin); | |
| 100 | + make.height.mas_equalTo(50); | |
| 101 | + }]; | |
| 102 | + [self.verification mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 103 | + make.centerY.equalTo(self.numberLabel); | |
| 104 | + make.right.equalTo(self).offset(-margin); | |
| 105 | + make.width.mas_equalTo(100); | |
| 106 | + make.height.mas_equalTo(30); | |
| 107 | + }]; | |
| 108 | + [self.telTF mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 109 | + make.centerY.equalTo(self.numberLabel); | |
| 110 | + make.left.equalTo(self.numberLabel.mas_right).offset(20); | |
| 111 | +// make.right.equalTo(self.verification.mas_left).offset(-10); | |
| 112 | + }]; | |
| 113 | + [self.codeLabel mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 114 | + make.top.equalTo(self.numberLabel.mas_bottom).offset(0); | |
| 115 | + make.left.equalTo(self.numberLabel); | |
| 116 | +// make.width.mas_equalTo(50); | |
| 117 | + make.height.mas_equalTo(50); | |
| 118 | + | |
| 119 | + }]; | |
| 120 | + [self.codeTF mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 121 | + make.centerY.equalTo(self.codeLabel); | |
| 122 | + make.left.equalTo(self.codeLabel.mas_right).offset(20); | |
| 123 | + make.width.equalTo(self.telTF); | |
| 124 | + }]; | |
| 125 | + | |
| 126 | + [self.bindingView mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 127 | + make.top.equalTo(self.codeTF.mas_bottom).offset(15); | |
| 128 | + make.left.equalTo(self).offset(0); | |
| 129 | + make.right.equalTo(self).offset(-0); | |
| 130 | + make.bottom.equalTo(self.mas_bottom).offset(-0); | |
| 131 | + }]; | |
| 132 | + | |
| 133 | + [self.binding mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 134 | + make.top.equalTo(self.codeTF.mas_bottom).offset(30); | |
| 135 | + make.left.equalTo(self).offset(60); | |
| 136 | + make.right.equalTo(self).offset(-60); | |
| 137 | + make.height.mas_equalTo(45); | |
| 138 | + }]; | |
| 139 | +} | |
| 140 | + | |
| 141 | +/* | |
| 142 | + // Only override drawRect: if you perform custom drawing. | |
| 143 | + // An empty implementation adversely affects performance during animation. | |
| 144 | + - (void)drawRect:(CGRect)rect { | |
| 145 | + // Drawing code | |
| 146 | + } | |
| 147 | + */ | |
| 148 | + | |
| 149 | +#pragma mark - UITextFieldDelegate | |
| 150 | +- (void)textFieldDidChange:(UITextField *)textField { | |
| 151 | + if (textField.tag == 10001) { //手机号 | |
| 152 | + if (!self.gotVerificationCodeIng) { | |
| 153 | + [self setupTextFieldUI:textField]; | |
| 154 | + } | |
| 155 | + } | |
| 156 | + else if (textField.tag == 10002) { //验证码 | |
| 157 | + | |
| 158 | + } | |
| 159 | + | |
| 160 | +} | |
| 161 | + | |
| 162 | +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { | |
| 163 | + if([string length] != 0){ | |
| 164 | + NSLog(@"增"); | |
| 165 | + if (textField.tag == 10002) { | |
| 166 | + if (textField.text.length>=6) { | |
| 167 | + return NO; | |
| 168 | + } | |
| 169 | + } | |
| 170 | + if (textField.tag == 10001) { | |
| 171 | + if (textField.text.length>=11) { | |
| 172 | + return NO; | |
| 173 | + } | |
| 174 | + } | |
| 175 | + } | |
| 176 | + else { | |
| 177 | + NSLog(@"删"); | |
| 178 | + return YES; | |
| 179 | + } | |
| 180 | + return YES; | |
| 181 | +} | |
| 182 | + | |
| 183 | +#pragma mark - 懒加载 | |
| 184 | +- (UILabel *)countryName { | |
| 185 | + if (!_countryName) { | |
| 186 | + _countryName = [[UILabel alloc] init]; | |
| 187 | + _countryName.textColor = [UIColor colorWithRed:26/255.0 green:26/255.0 blue:26/255.0 alpha:1.0]; | |
| 188 | + _countryName.font = UIFontCNMake(14.0); | |
| 189 | + _countryName.text = @"中国大陆"; | |
| 190 | + _countryName.textAlignment = NSTextAlignmentLeft; | |
| 191 | + } | |
| 192 | + return _countryName; | |
| 193 | +} | |
| 194 | + | |
| 195 | +- (UIView *)lineView { | |
| 196 | + if (!_lineView) { | |
| 197 | + _lineView = [[UIView alloc] init]; | |
| 198 | + _lineView.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 199 | + } | |
| 200 | + return _lineView; | |
| 201 | +} | |
| 202 | + | |
| 203 | +- (UIImageView *)countryImg{ | |
| 204 | + if (!_countryImg) { | |
| 205 | + _countryImg = [[UIImageView alloc] init]; | |
| 206 | + _countryImg.userInteractionEnabled = YES; | |
| 207 | + UIImage *image = [self getImageWithImageName:@"mine_info_front" bundleName:@"CNLiveBMineModule" targetClass:[self class]]; | |
| 208 | + _countryImg.image = image; | |
| 209 | + _countryImg.contentMode = UIViewContentModeCenter; | |
| 210 | + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(countryTap:)]; | |
| 211 | + [_countryImg addGestureRecognizer:tap]; | |
| 212 | + } | |
| 213 | + return _countryImg; | |
| 214 | +} | |
| 215 | + | |
| 216 | +- (UILabel *)countryCode { | |
| 217 | + if (!_countryCode) { | |
| 218 | + _countryCode = [[UILabel alloc] init]; | |
| 219 | + _countryCode.textColor = [UIColor colorWithRed:26/255.0 green:26/255.0 blue:26/255.0 alpha:1.0]; | |
| 220 | + _countryCode.font = UIFontCNMake(14.0); | |
| 221 | + _countryCode.text = @"+86"; | |
| 222 | + _countryCode.textAlignment = NSTextAlignmentLeft; | |
| 223 | + _countryCode.userInteractionEnabled = YES; | |
| 224 | + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(countryTap:)]; | |
| 225 | + [_countryCode addGestureRecognizer:tap]; | |
| 226 | + } | |
| 227 | + return _countryCode; | |
| 228 | +} | |
| 229 | + | |
| 230 | +- (UILabel *)numberLabel { | |
| 231 | + if (!_numberLabel) { | |
| 232 | + _numberLabel = [[UILabel alloc] init]; | |
| 233 | + _numberLabel.textColor = [UIColor colorWithRed:26/255.0 green:26/255.0 blue:26/255.0 alpha:1.0]; | |
| 234 | + _numberLabel.font = UIFontCNMake(14.0); | |
| 235 | + _numberLabel.text = @"手机号"; | |
| 236 | + _numberLabel.textAlignment = NSTextAlignmentLeft; | |
| 237 | + } | |
| 238 | + return _numberLabel; | |
| 239 | +} | |
| 240 | + | |
| 241 | +- (UILabel *)codeLabel { | |
| 242 | + if (!_codeLabel) { | |
| 243 | + _codeLabel = [[UILabel alloc] init]; | |
| 244 | + _codeLabel.textColor = [UIColor colorWithRed:26/255.0 green:26/255.0 blue:26/255.0 alpha:1.0]; | |
| 245 | + _codeLabel.font = UIFontCNMake(14.0); | |
| 246 | + _codeLabel.text = @"验证码"; | |
| 247 | + _codeLabel.textAlignment = NSTextAlignmentLeft; | |
| 248 | + } | |
| 249 | + return _codeLabel; | |
| 250 | +} | |
| 251 | + | |
| 252 | +- (UITextField *)telTF { | |
| 253 | + if (!_telTF) { | |
| 254 | + _telTF = [[UITextField alloc] init]; | |
| 255 | + _telTF.textColor = [UIColor colorWithRed:34/255.0 green:34/255.0 blue:34/255.0 alpha:1.0]; | |
| 256 | + _telTF.font = UIFontCNMake(14.0); | |
| 257 | + _telTF.placeholder = @"请输入新手机号"; | |
| 258 | + _telTF.delegate = self; | |
| 259 | + _telTF.keyboardType = UIKeyboardTypeNumberPad; | |
| 260 | + [_telTF addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; | |
| 261 | + _telTF.tag = 10001; | |
| 262 | + } | |
| 263 | + return _telTF; | |
| 264 | +} | |
| 265 | + | |
| 266 | +- (UITextField *)codeTF { | |
| 267 | + if (!_codeTF) { | |
| 268 | + _codeTF = [[UITextField alloc] init]; | |
| 269 | + _codeTF.textColor = [UIColor colorWithRed:34/255.0 green:34/255.0 blue:34/255.0 alpha:1.0]; | |
| 270 | + _codeTF.font = UIFontCNMake(14.0); | |
| 271 | + _codeTF.placeholder = @"请输入验证码"; | |
| 272 | + _codeTF.delegate = self; | |
| 273 | + _codeTF.keyboardType = UIKeyboardTypeNumberPad; | |
| 274 | + [_codeTF addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; | |
| 275 | + _codeTF.tag = 10002; | |
| 276 | + } | |
| 277 | + return _codeTF; | |
| 278 | +} | |
| 279 | + | |
| 280 | +- (UIButton *)verification{ | |
| 281 | + if (!_verification) { | |
| 282 | + _verification = [UIButton buttonWithType:UIButtonTypeCustom]; | |
| 283 | + [_verification setTitle:@"获取验证码" forState:UIControlStateNormal]; | |
| 284 | + [_verification setTitleColor:[UIColor colorWithRed:195/255.0 green:195/255.0 blue:195/255.0 alpha:1.0] forState:UIControlStateNormal]; | |
| 285 | + _verification.titleLabel.font = [UIFont systemFontOfSize:14.0]; | |
| 286 | + _verification.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 287 | + _verification.layer.cornerRadius = 15; | |
| 288 | + _verification.layer.masksToBounds = YES; | |
| 289 | + [_verification addTarget:self action:@selector(verificationDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | |
| 290 | + } | |
| 291 | + return _verification; | |
| 292 | +} | |
| 293 | + | |
| 294 | +- (UIView *)bindingView{ | |
| 295 | + if (!_bindingView) { | |
| 296 | + _bindingView = [[UIView alloc]init]; | |
| 297 | + _bindingView.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 298 | + } | |
| 299 | + return _bindingView; | |
| 300 | +} | |
| 301 | + | |
| 302 | +- (UIButton *)binding{ | |
| 303 | + if (!_binding) { | |
| 304 | + _binding = [UIButton buttonWithType:UIButtonTypeCustom]; | |
| 305 | + [_binding setTitle:@"验证后绑定新手机号" forState:UIControlStateNormal]; | |
| 306 | + [_binding setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | |
| 307 | + _binding.titleLabel.font = UIFontCNMake(15.0); | |
| 308 | + _binding.backgroundColor = [UIColor colorWithRed:0/255.0 green:194/255.0 blue:0/255.0 alpha:1.0]; | |
| 309 | + _binding.layer.cornerRadius = 45/2.0; | |
| 310 | + _binding.layer.masksToBounds = YES; | |
| 311 | + [_binding addTarget:self action:@selector(bindingDidClicked:) forControlEvents:UIControlEventTouchUpInside]; | |
| 312 | + } | |
| 313 | + return _binding; | |
| 314 | + | |
| 315 | +} | |
| 316 | + | |
| 317 | +#pragma mark - 私有方法 | |
| 318 | + | |
| 319 | +#pragma mark - Action | |
| 320 | +- (void)countryTap:(UITapGestureRecognizer *)tap{ | |
| 321 | + if (self.delegate && [self.delegate respondsToSelector:@selector(selectCountry:)]) { | |
| 322 | + [self.delegate selectCountry:self]; | |
| 323 | + } | |
| 324 | +} | |
| 325 | + | |
| 326 | +- (void)verificationDidClicked:(UIButton *)sender { | |
| 327 | + if ([NSString isEmpty:self.telTF.text] || [self.telTF.text isWhitespaceAndNewlines]) { | |
| 328 | + QMUIAlertAction *sure = [QMUIAlertAction actionWithTitle:@"我知道了" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 329 | + }]; | |
| 330 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"请输入正确的手机号码" message:@"" preferredStyle:QMUIAlertControllerStyleAlert]; | |
| 331 | + [alertController addAction:sure]; | |
| 332 | + | |
| 333 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 334 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 335 | + sure.buttonAttributes = titleAttributs; | |
| 336 | + | |
| 337 | + [alertController showWithAnimated:YES]; | |
| 338 | + } | |
| 339 | + else if ([self.telTF.text isEqualToString:CNUserShareModel.mobile]) { | |
| 340 | + [QMUITips showWithText:@"您更新的手机号与旧手机号一致,请重新输入确认" inView:[UIApplication sharedApplication].delegate.window hideAfterDelay:timeValue]; | |
| 341 | + } | |
| 342 | + else { | |
| 343 | + // 发送验证码 | |
| 344 | + [self.telTF resignFirstResponder]; | |
| 345 | + [self.codeTF becomeFirstResponder]; | |
| 346 | + | |
| 347 | + self.verification.userInteractionEnabled = NO; | |
| 348 | + self.verification.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 349 | + [self.verification setTitleColor:[UIColor colorWithRed:195/255.0 green:195/255.0 blue:195/255.0 alpha:1.0] forState:UIControlStateNormal]; | |
| 350 | + self.gotVerificationCodeIng = YES; | |
| 351 | + | |
| 352 | + [CNLiveUserSystemCenter verificationCodeType:VerificationCodeTypeRegister mobile:self.telTF.text countryCode:_codeNum success:^(id result) { | |
| 353 | + | |
| 354 | + [QMUITips showSucceed:@"短信发送成功" inView:[UIApplication sharedApplication].delegate.window hideAfterDelay:timeValue]; | |
| 355 | + self.gotVerificationCode = YES; | |
| 356 | + [self countDown]; | |
| 357 | + | |
| 358 | + } failure:^(NSDictionary *errorDic) { | |
| 359 | + NSString *errMsg; | |
| 360 | + if ([[NSString stringWithFormat:@"%@",errorDic[@"errorCode"]] isEqualToString:@"408"]) { | |
| 361 | + errMsg = @"请填写正确的手机号"; | |
| 362 | + } else { | |
| 363 | + errMsg = errorDic[@"errorMessage"]; | |
| 364 | + } | |
| 365 | + [QMUITips showError:errMsg inView:[UIApplication sharedApplication].delegate.window hideAfterDelay:timeValue]; | |
| 366 | + | |
| 367 | + self.gotVerificationCode = NO; | |
| 368 | + self.verification.userInteractionEnabled = YES; | |
| 369 | + self.verification.backgroundColor = [UIColor colorWithRed:0/255.0 green:194/255.0 blue:0/255.0 alpha:1.0]; | |
| 370 | + [self.verification setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | |
| 371 | + self.gotVerificationCodeIng = NO; | |
| 372 | + | |
| 373 | + }]; | |
| 374 | + } | |
| 375 | + | |
| 376 | +} | |
| 377 | + | |
| 378 | +- (void)bindingDidClicked:(UIButton *)sender { | |
| 379 | + if (self.gotVerificationCode) { | |
| 380 | + if (self.codeTF.text.length == 6) { | |
| 381 | + [QMUITips showLoadingInView:self]; | |
| 382 | + [CNLiveUserSystemCenter updateMobileWithUid:CNUserShareModel.uid mobile:self.telTF.text countryCode:_codeNum verificationCode:self.codeTF.text success:^(id result) { | |
| 383 | + CNUserShareModel.mobile = self.telTF.text; | |
| 384 | + [CNUserInfoModel setLocalUserInfo:self.countryName.text withKey:@"countryname"]; | |
| 385 | + [CNUserInfoModel setLocalUserInfo:self.countryCode.text withKey:@"countrycode"]; | |
| 386 | + [QMUITips hideAllToastInView:self animated:YES]; | |
| 387 | + if (self.delegate && [self.delegate respondsToSelector:@selector(bindingSuccess:)]) { | |
| 388 | + [self.delegate bindingSuccess:self]; | |
| 389 | + } | |
| 390 | + | |
| 391 | + } failure:^(NSDictionary *errorDic) { | |
| 392 | + [QMUITips hideAllToastInView:self animated:YES]; | |
| 393 | + [QMUITips showError:errorDic[@"errorMessage"] inView:[UIApplication sharedApplication].delegate.window hideAfterDelay:timeValue]; | |
| 394 | + | |
| 395 | + }]; | |
| 396 | + | |
| 397 | + } else { | |
| 398 | + QMUIAlertAction *sure = [QMUIAlertAction actionWithTitle:@"我知道了" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 399 | + }]; | |
| 400 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"请输入正确的验证码" message:@"" preferredStyle:QMUIAlertControllerStyleAlert]; | |
| 401 | + [alertController addAction:sure]; | |
| 402 | + | |
| 403 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 404 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 405 | + sure.buttonAttributes = titleAttributs; | |
| 406 | + | |
| 407 | + [alertController showWithAnimated:YES]; | |
| 408 | + } | |
| 409 | + | |
| 410 | + } else { | |
| 411 | + NSString *alertText = @"请先获取验证码"; | |
| 412 | + if (self.telTF.text.length != 11) { | |
| 413 | + alertText = @"请先输入正确的手机号码"; | |
| 414 | + } else { | |
| 415 | + alertText = @"请先获取验证码"; | |
| 416 | + } | |
| 417 | + | |
| 418 | + QMUIAlertAction *sure = [QMUIAlertAction actionWithTitle:@"我知道了" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 419 | + }]; | |
| 420 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:alertText message:@"" preferredStyle:QMUIAlertControllerStyleAlert]; | |
| 421 | + [alertController addAction:sure]; | |
| 422 | + | |
| 423 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 424 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 425 | + sure.buttonAttributes = titleAttributs; | |
| 426 | + | |
| 427 | + [alertController showWithAnimated:YES]; | |
| 428 | + | |
| 429 | + } | |
| 430 | + | |
| 431 | +} | |
| 432 | + | |
| 433 | +- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | |
| 434 | + [self.telTF resignFirstResponder]; | |
| 435 | +} | |
| 436 | + | |
| 437 | +#pragma mark - 倒计时 | |
| 438 | +- (void)countDown { | |
| 439 | + __block NSInteger second = TIMECOUNT; | |
| 440 | + //(1) | |
| 441 | + dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); | |
| 442 | + //(2) | |
| 443 | + dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, quene); | |
| 444 | + //(3) | |
| 445 | + dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC); | |
| 446 | + //(4) | |
| 447 | + dispatch_source_set_event_handler(timer, ^{ | |
| 448 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
| 449 | + if (second == 0) { | |
| 450 | + [self setupTextFieldUI:self.telTF]; | |
| 451 | + self.gotVerificationCodeIng = NO; | |
| 452 | + [self.verification setTitle:[NSString stringWithFormat:@"获取验证码"] forState:UIControlStateNormal]; | |
| 453 | + second = TIMECOUNT; | |
| 454 | + dispatch_cancel(timer); | |
| 455 | + } else { | |
| 456 | + [self.verification setTitle:[NSString stringWithFormat:@"%lds",second] forState:UIControlStateNormal]; | |
| 457 | + second--; | |
| 458 | + } | |
| 459 | + }); | |
| 460 | + }); | |
| 461 | + //(5) | |
| 462 | + dispatch_resume(timer); | |
| 463 | +} | |
| 464 | + | |
| 465 | +- (void)setupTextFieldUI:(UITextField *)textField{ | |
| 466 | + if (textField.text.length > 0) { | |
| 467 | + _verification.userInteractionEnabled = YES; | |
| 468 | + _verification.backgroundColor = [UIColor colorWithRed:0/255.0 green:194/255.0 blue:0/255.0 alpha:1.0]; | |
| 469 | + [_verification setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | |
| 470 | + } | |
| 471 | + else { | |
| 472 | + _verification.userInteractionEnabled = NO; | |
| 473 | + _verification.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 474 | + [_verification setTitleColor:[UIColor colorWithRed:195/255.0 green:195/255.0 blue:195/255.0 alpha:1.0] forState:UIControlStateNormal]; | |
| 475 | + } | |
| 476 | +} | |
| 477 | + | |
| 478 | +@end | |
| 479 | + | ... | ... |
CNLiveBMineModule/Classes/Setting/View/CNLiveSettingCell.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveSettingCell.h | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <UIKit/UIKit.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | +@class CNLiveSettingModel; | |
| 13 | +static NSString * const kCNLiveSettingCell = @"CNLiveSettingCell"; | |
| 14 | + | |
| 15 | +@interface CNLiveSettingCell : UITableViewCell | |
| 16 | + | |
| 17 | +@property (nonatomic, strong) CNLiveSettingModel *model; | |
| 18 | +@property (nonatomic, strong) UIColor *lineColor; | |
| 19 | + | |
| 20 | +@end | |
| 21 | + | |
| 22 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/Setting/View/CNLiveSettingCell.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveSettingCell.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by CNLive-zxw on 2019/9/6. | |
| 6 | +// Copyright © 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveSettingCell.h" | |
| 10 | +#import <Masonry/Masonry.h> | |
| 11 | +#import "CNLiveCategory.h" | |
| 12 | +#import "CNLiveBaseKit.h" | |
| 13 | + | |
| 14 | +#import "CNLiveSettingModel.h" | |
| 15 | + | |
| 16 | +@interface CNLiveSettingCell() | |
| 17 | +@property (nonatomic, strong) UIView *line; | |
| 18 | +@property (nonatomic, strong) UILabel *title; | |
| 19 | +@property (nonatomic, strong) UILabel *content; | |
| 20 | +@property (nonatomic, strong) UIImageView *front; | |
| 21 | + | |
| 22 | +@end | |
| 23 | + | |
| 24 | +@implementation CNLiveSettingCell | |
| 25 | +static const NSInteger margin = 12; | |
| 26 | + | |
| 27 | +- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { | |
| 28 | + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; | |
| 29 | + if (self) { | |
| 30 | + self.contentView.backgroundColor = [UIColor whiteColor]; | |
| 31 | + | |
| 32 | + [self.contentView addSubview:self.line]; | |
| 33 | + [self.contentView addSubview:self.title]; | |
| 34 | + [self.contentView addSubview:self.content]; | |
| 35 | + [self.contentView addSubview:self.front]; | |
| 36 | + | |
| 37 | + } | |
| 38 | + return self; | |
| 39 | +} | |
| 40 | +- (void)setModel:(CNLiveSettingModel *)model{ | |
| 41 | + _model = model; | |
| 42 | + _title.text = model.title; | |
| 43 | + _content.text = model.content; | |
| 44 | + [self xw_layoutSubviews]; | |
| 45 | +} | |
| 46 | + | |
| 47 | +- (void)xw_layoutSubviews{ | |
| 48 | + _title.font = UIFontCNMake(16.0); | |
| 49 | + _content.font = UIFontCNMake(14.0); | |
| 50 | + | |
| 51 | + [_line mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 52 | + make.left.equalTo(self.contentView.mas_left).with.offset(0); | |
| 53 | + make.right.equalTo(self.contentView.mas_right).with.offset(0); | |
| 54 | + make.top.equalTo(self.contentView.mas_top).with.offset(0); | |
| 55 | + make.height.offset(self.model.lineHeight); | |
| 56 | + | |
| 57 | + }]; | |
| 58 | + | |
| 59 | + [_title mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 60 | + make.left.equalTo(self.line.mas_left).with.offset(margin); | |
| 61 | + make.top.equalTo(self.line.mas_bottom).with.offset(0); | |
| 62 | + make.height.offset(self.model.height-self.model.lineHeight); | |
| 63 | + | |
| 64 | + }]; | |
| 65 | + | |
| 66 | + [_front mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 67 | + make.right.equalTo(self.line.mas_right).with.offset(-margin); | |
| 68 | + make.top.equalTo(self.title.mas_top).with.offset(0); | |
| 69 | + make.width.with.offset(margin); | |
| 70 | + make.height.equalTo(self.title.mas_height); | |
| 71 | + | |
| 72 | + }]; | |
| 73 | + | |
| 74 | + switch (self.model.type) { | |
| 75 | + case CNLiveSettingModelTypeTextFront: | |
| 76 | + { | |
| 77 | + _front.hidden = NO; | |
| 78 | + _content.hidden = NO; | |
| 79 | + [_content mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 80 | + make.top.equalTo(self.title.mas_top).with.offset(0); | |
| 81 | + make.left.equalTo(self.title.mas_right).with.offset(0); | |
| 82 | + make.right.equalTo(self.front.mas_left).with.offset(-margin); | |
| 83 | + make.height.equalTo(self.title.mas_height); | |
| 84 | + | |
| 85 | + }]; | |
| 86 | + } | |
| 87 | + break; | |
| 88 | + case CNLiveSettingModelTypeText: | |
| 89 | + { | |
| 90 | + _front.hidden = YES; | |
| 91 | + _content.hidden = NO; | |
| 92 | + [_content mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 93 | + make.top.equalTo(self.title.mas_top).with.offset(0); | |
| 94 | + make.left.equalTo(self.title.mas_right).with.offset(0); | |
| 95 | + make.right.equalTo(self.mas_right).with.offset(-margin); | |
| 96 | + make.height.equalTo(self.title.mas_height); | |
| 97 | + | |
| 98 | + }]; | |
| 99 | + } | |
| 100 | + break; | |
| 101 | + | |
| 102 | + default: | |
| 103 | + { | |
| 104 | + _front.hidden = NO; | |
| 105 | + _content.hidden = YES; | |
| 106 | + | |
| 107 | + } | |
| 108 | + break; | |
| 109 | + } | |
| 110 | + | |
| 111 | +} | |
| 112 | +- (void)setLineColor:(UIColor *)lineColor{ | |
| 113 | + _lineColor = lineColor; | |
| 114 | + _line.backgroundColor = lineColor; | |
| 115 | +} | |
| 116 | +- (void)awakeFromNib { | |
| 117 | + [super awakeFromNib]; | |
| 118 | + // Initialization code | |
| 119 | +} | |
| 120 | + | |
| 121 | +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { | |
| 122 | + [super setSelected:selected animated:animated]; | |
| 123 | + | |
| 124 | + // Configure the view for the selected state | |
| 125 | +} | |
| 126 | + | |
| 127 | +#pragma mark - 响应方法 | |
| 128 | + | |
| 129 | +#pragma mark - 懒加载 | |
| 130 | +- (UIView *)line { | |
| 131 | + if (!_line) { | |
| 132 | + _line = [[UIView alloc] init]; | |
| 133 | + _line.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 134 | + } | |
| 135 | + return _line; | |
| 136 | +} | |
| 137 | + | |
| 138 | +- (UILabel *)title { | |
| 139 | + if (!_title) { | |
| 140 | + _title = [[UILabel alloc] init]; | |
| 141 | + _title.numberOfLines = 1; | |
| 142 | + _title.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 143 | + _title.font = UIFontCNMake(16.0); | |
| 144 | + } | |
| 145 | + return _title; | |
| 146 | +} | |
| 147 | + | |
| 148 | +- (UILabel *)content { | |
| 149 | + if (!_content) { | |
| 150 | + _content = [[UILabel alloc] init]; | |
| 151 | + _content.numberOfLines = 1; | |
| 152 | + _content.lineBreakMode = NSLineBreakByTruncatingTail; | |
| 153 | + _content.textColor = [UIColor colorWithRed:102/255.0 green:102/255.0 blue:102/255.0 alpha:1.0]; | |
| 154 | + _content.font = UIFontCNMake(14.0); | |
| 155 | + } | |
| 156 | + return _content; | |
| 157 | +} | |
| 158 | + | |
| 159 | +- (UIImageView *)front { | |
| 160 | + if (!_front) { | |
| 161 | + _front = [[UIImageView alloc] init]; | |
| 162 | + UIImage *xw_image = [self getImageWithImageName:@"mine_into" bundleName:@"CNLiveBMineModule" targetClass:[CNLiveSettingCell class]]; | |
| 163 | + _front.image = xw_image; | |
| 164 | + _front.contentMode = UIViewContentModeCenter; | |
| 165 | + } | |
| 166 | + return _front; | |
| 167 | +} | |
| 168 | + | |
| 169 | +@end | |
| 170 | + | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveInfoUpdateCell.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveInfoUpdateCell.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <UIKit/UIKit.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | +static NSString * const kCNLiveInfoUpdateCell = @"CNLiveInfoUpdateCell"; | |
| 13 | + | |
| 14 | +@interface CNLiveInfoUpdateCell : UITableViewCell | |
| 15 | +@property (nonatomic, copy) NSString *text; | |
| 16 | +@property (nonatomic, assign) BOOL isShow; | |
| 17 | + | |
| 18 | +@end | |
| 19 | + | |
| 20 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveInfoUpdateCell.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveInfoUpdateCell.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveInfoUpdateCell.h" | |
| 10 | +#import <Masonry/Masonry.h> | |
| 11 | +#import <SDWebImage/SDWebImage.h> | |
| 12 | +#import "CNLiveUserInfoModel.h" | |
| 13 | +#import "CNLiveCategory.h" | |
| 14 | + | |
| 15 | +@interface CNLiveInfoUpdateCell() | |
| 16 | +@property (nonatomic, strong) UIView *line; | |
| 17 | +@property (nonatomic, strong) UILabel *title; | |
| 18 | + | |
| 19 | +@property (nonatomic, strong) UIImageView *pic; | |
| 20 | + | |
| 21 | +@end | |
| 22 | + | |
| 23 | +@implementation CNLiveInfoUpdateCell | |
| 24 | +static const NSInteger margin = 12; | |
| 25 | + | |
| 26 | +- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { | |
| 27 | + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; | |
| 28 | + if (self) { | |
| 29 | + self.contentView.backgroundColor = [UIColor whiteColor]; | |
| 30 | + | |
| 31 | + [self.contentView addSubview:self.title]; | |
| 32 | + [self.contentView addSubview:self.pic]; | |
| 33 | + [self.contentView addSubview:self.line]; | |
| 34 | + | |
| 35 | + [self xw_layoutSubviews]; | |
| 36 | + | |
| 37 | + } | |
| 38 | + return self; | |
| 39 | +} | |
| 40 | + | |
| 41 | +- (void)xw_layoutSubviews{ | |
| 42 | + | |
| 43 | + [_title mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 44 | + make.left.equalTo(self.contentView.mas_left).with.offset(margin); | |
| 45 | + make.top.equalTo(self.contentView.mas_top).with.offset(0); | |
| 46 | + make.bottom.equalTo(self.contentView.mas_bottom).with.offset(0); | |
| 47 | + | |
| 48 | + }]; | |
| 49 | + | |
| 50 | + [_pic mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 51 | + make.right.equalTo(self.contentView.mas_right).with.offset(-margin); | |
| 52 | + make.top.equalTo(self.contentView.mas_top).with.offset(0); | |
| 53 | + make.bottom.equalTo(self.contentView.mas_bottom).with.offset(0); | |
| 54 | + | |
| 55 | + }]; | |
| 56 | + | |
| 57 | + [_line mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 58 | + make.left.equalTo(self.contentView.mas_left).with.offset(0); | |
| 59 | + make.right.equalTo(self.contentView.mas_right).with.offset(-0); | |
| 60 | + make.bottom.equalTo(self.contentView.mas_bottom).with.offset(0); | |
| 61 | + make.height.offset(0.5); | |
| 62 | + | |
| 63 | + }]; | |
| 64 | + | |
| 65 | + | |
| 66 | +} | |
| 67 | + | |
| 68 | +- (void)setText:(NSString *)text{ | |
| 69 | + _text = text; | |
| 70 | + _title.text = text; | |
| 71 | +} | |
| 72 | + | |
| 73 | +- (void)setIsShow:(BOOL)isShow{ | |
| 74 | + _isShow = isShow; | |
| 75 | + _pic.hidden = !isShow; | |
| 76 | +} | |
| 77 | + | |
| 78 | +- (void)awakeFromNib { | |
| 79 | + [super awakeFromNib]; | |
| 80 | + // Initialization code | |
| 81 | +} | |
| 82 | + | |
| 83 | +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { | |
| 84 | + [super setSelected:selected animated:animated]; | |
| 85 | + | |
| 86 | + // Configure the view for the selected state | |
| 87 | +} | |
| 88 | +#pragma mark - 懒加载 | |
| 89 | +- (UIView *)line { | |
| 90 | + if (!_line) { | |
| 91 | + _line = [[UIView alloc] init]; | |
| 92 | + _line.backgroundColor = [UIColor colorWithRed:235/255.0 green:235/255.0 blue:235/255.0 alpha:1.0]; | |
| 93 | + } | |
| 94 | + return _line; | |
| 95 | +} | |
| 96 | + | |
| 97 | +- (UILabel *)title { | |
| 98 | + if (!_title) { | |
| 99 | + _title = [[UILabel alloc] init]; | |
| 100 | + _title.numberOfLines = 1; | |
| 101 | + _title.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 102 | + _title.font = [UIFont systemFontOfSize:16]; | |
| 103 | + } | |
| 104 | + return _title; | |
| 105 | +} | |
| 106 | + | |
| 107 | + | |
| 108 | +- (UIImageView *)pic { | |
| 109 | + if (!_pic) { | |
| 110 | + _pic = [[UIImageView alloc] init]; | |
| 111 | + UIImage *xw_image = [self getImageWithImageName:@"mine_update_select" bundleName:@"CNLiveBMineModule" targetClass:[self class]]; | |
| 112 | + _pic.image = xw_image; | |
| 113 | + _pic.hidden = YES; | |
| 114 | + _pic.contentMode = UIViewContentModeCenter; | |
| 115 | + | |
| 116 | + } | |
| 117 | + return _pic; | |
| 118 | +} | |
| 119 | + | |
| 120 | +@end | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveInfoUpdateController.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNCommonViewController.h" | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | +@class CNLiveUserInfoModel; | |
| 13 | + | |
| 14 | +@interface CNLiveInfoUpdateController : CNCommonViewController | |
| 15 | + | |
| 16 | +/** | |
| 17 | + * @abstract 对象方法 初始化方法 | |
| 18 | + * | |
| 19 | + * @param model 模型 | |
| 20 | + */ | |
| 21 | +- (instancetype)initWithModel:(CNLiveUserInfoModel *)model; | |
| 22 | + | |
| 23 | +@end | |
| 24 | + | |
| 25 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveInfoUpdateController.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveInfoUpdateController.h" | |
| 10 | +#import "QMUIKit.h" | |
| 11 | +#import <SDWebImage/SDWebImage.h> | |
| 12 | +#import <Masonry/Masonry.h> | |
| 13 | + | |
| 14 | +#import <AVFoundation/AVCaptureDevice.h> | |
| 15 | +#import <AVFoundation/AVMediaFormat.h> | |
| 16 | +#import "XFCameraController.h" | |
| 17 | +#import "TZImagePickerController.h" | |
| 18 | +#import "CNUserInfoManager.h" | |
| 19 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemCenter.h> | |
| 20 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemTypeDef.h> | |
| 21 | +#import "NSString+CNLiveExtension.h" | |
| 22 | +#import "NSDictionary+Safety.h" | |
| 23 | +#import "UIImage+Common.h" | |
| 24 | +#import "CNLiveManager.h" | |
| 25 | +#import "TIMAdapter.h" | |
| 26 | +#import "CommonLibrary.h" | |
| 27 | + | |
| 28 | +#import "CNLiveCategory.h" | |
| 29 | +#import "CNLiveNavigationBar.h" | |
| 30 | + | |
| 31 | +//#import "CNLiveUserInfoModel.h" | |
| 32 | +#import "CNLiveUserInfoNotification.h" | |
| 33 | +#import "CNLiveInfoUpdateCell.h" | |
| 34 | + | |
| 35 | +@interface CNLiveInfoUpdateController ()<UITextFieldDelegate,UITextViewDelegate,QMUIAlertControllerDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate,TZImagePickerControllerDelegate,UITableViewDelegate,UITableViewDataSource>{ | |
| 36 | + UIImage *_image; | |
| 37 | +} | |
| 38 | +@property (nonatomic, strong) CNLiveNavigationBar *navigationBar; | |
| 39 | +@property (nonatomic, strong) CNLiveUserInfoModel *model; | |
| 40 | + | |
| 41 | +@property (nonatomic, strong) UIView *contentView; | |
| 42 | + | |
| 43 | +// 头像 | |
| 44 | +@property (nonatomic, strong) UIImageView *imageView; | |
| 45 | + | |
| 46 | +// 昵称/地址 | |
| 47 | +@property (nonatomic, strong) UITextField *textField; | |
| 48 | + | |
| 49 | +// 个性签名 | |
| 50 | +@property (nonatomic, strong) UITextView *textView; | |
| 51 | +@property (nonatomic, strong) UILabel *textNum; | |
| 52 | + | |
| 53 | +// 性别 | |
| 54 | +@property (nonatomic, strong) UITableView *tableView; | |
| 55 | +@property (nonatomic, strong) NSString *gender; | |
| 56 | + | |
| 57 | +@end | |
| 58 | + | |
| 59 | +@implementation CNLiveInfoUpdateController | |
| 60 | + | |
| 61 | +#define _locMaxLength 12 | |
| 62 | +#define _nickMaxLength 20 | |
| 63 | +#define MAX_LIMIT_NUMS 30 | |
| 64 | + | |
| 65 | +static const NSInteger margin = 15; | |
| 66 | +static const CGFloat timeValue = 1.5; | |
| 67 | + | |
| 68 | +#pragma mark - 初始化方法 | |
| 69 | +- (instancetype)initWithModel:(CNLiveUserInfoModel *)model{ | |
| 70 | + self = [super init]; | |
| 71 | + if (self) { | |
| 72 | + self.model = model; | |
| 73 | + self.gender = CNUserShareModel.gender; | |
| 74 | + } | |
| 75 | + return self; | |
| 76 | +} | |
| 77 | + | |
| 78 | +#pragma mark - 生命周期 | |
| 79 | +- (void)viewWillAppear:(BOOL)animated{ | |
| 80 | + [super viewWillAppear:animated]; | |
| 81 | + self.navigationController.navigationBarHidden = YES; | |
| 82 | +} | |
| 83 | + | |
| 84 | +- (void)viewDidLoad { | |
| 85 | + [super viewDidLoad]; | |
| 86 | + self.view.backgroundColor = [UIColor colorWithRed:244.0/255.0 green:244.0/255.0 blue:244.0/255.0 alpha:1.0]; | |
| 87 | + if (@available(iOS 11, *)) { | |
| 88 | + } | |
| 89 | + else { | |
| 90 | + self.automaticallyAdjustsScrollViewInsets = NO; | |
| 91 | + } | |
| 92 | + [self.view addSubview:self.navigationBar]; | |
| 93 | + [self.view addSubview:self.contentView]; | |
| 94 | +} | |
| 95 | + | |
| 96 | +#pragma mark - UITextFieldDelegate | |
| 97 | +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { | |
| 98 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 99 | + self.navigationBar.right.backgroundColor = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 100 | + NSInteger maxLength = (self.model.dataType == CNLiveUserInfoDataTypeNickname) ? _nickMaxLength : _locMaxLength; | |
| 101 | + if (range.location >= maxLength) { | |
| 102 | + textField.text = [textField.text substringToIndex:maxLength]; | |
| 103 | + return NO; | |
| 104 | + } | |
| 105 | + return YES; | |
| 106 | +} | |
| 107 | + | |
| 108 | +- (BOOL)textFieldShouldReturn:(UITextField *)textField { | |
| 109 | + switch (self.model.dataType) { | |
| 110 | + case CNLiveUserInfoDataTypeNickname: | |
| 111 | + { | |
| 112 | + [self requestUpdateUserNickname]; | |
| 113 | + } | |
| 114 | + break; | |
| 115 | + case CNLiveUserInfoDataTypeAddress: | |
| 116 | + { | |
| 117 | + [self requestUpdateUserAddress]; | |
| 118 | + } | |
| 119 | + break; | |
| 120 | + | |
| 121 | + default: | |
| 122 | + break; | |
| 123 | + } | |
| 124 | + return YES; | |
| 125 | +} | |
| 126 | + | |
| 127 | +#pragma mark - UITextViewDelegate | |
| 128 | +- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { | |
| 129 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 130 | + self.navigationBar.right.backgroundColor = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 131 | + | |
| 132 | + if([text length] != 0) { | |
| 133 | + NSLog(@"增"); | |
| 134 | + if ([[text removeNewLine] length] == 0) { //换行 | |
| 135 | + return NO; | |
| 136 | + } | |
| 137 | + } | |
| 138 | + else { | |
| 139 | + NSLog(@"删"); | |
| 140 | + return YES; | |
| 141 | + } | |
| 142 | + NSLog(@"%lu",(unsigned long)textView.text.length); | |
| 143 | + | |
| 144 | + UITextRange *selectedRange = [textView markedTextRange]; //获取高亮部分 | |
| 145 | + UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0]; | |
| 146 | + NSString *selectedtext = [textView textInRange:selectedRange]; //获取高亮部分内容 | |
| 147 | + | |
| 148 | + //如果有高亮且当前字数开始位置小于最大限制时允许输入 | |
| 149 | + if (selectedRange && pos) { | |
| 150 | + NSInteger startOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.start]; | |
| 151 | + NSInteger endOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.end]; | |
| 152 | + NSRange offsetRange = NSMakeRange(startOffset, endOffset - startOffset); | |
| 153 | + | |
| 154 | + if (offsetRange.location < MAX_LIMIT_NUMS && offsetRange.location+selectedtext.length <= MAX_LIMIT_NUMS && offsetRange.location+text.length <= MAX_LIMIT_NUMS) { | |
| 155 | + return YES; | |
| 156 | + } | |
| 157 | + else { | |
| 158 | + return NO; | |
| 159 | + } | |
| 160 | + } | |
| 161 | + | |
| 162 | + NSString *comcatstr = [textView.text stringByReplacingCharactersInRange:range withString:text];//拼上 | |
| 163 | + NSInteger caninputlen = MAX_LIMIT_NUMS - comcatstr.length;//最大减全拼上(拼后剩/超) | |
| 164 | + if (caninputlen >= 0) { | |
| 165 | + return YES; | |
| 166 | + } | |
| 167 | + else { | |
| 168 | + NSInteger len = text.length + caninputlen; //原本剩余的空间 | |
| 169 | + //防止当text.length + caninputlen < 0时,使得rg.length为一个非法最大正数出错 | |
| 170 | + NSRange rg = {0,MAX(len,0)}; | |
| 171 | + | |
| 172 | + if (rg.length > 0) { | |
| 173 | + NSString *s = @"";//正确待拼text | |
| 174 | + //判断是否只普通的字符或asc码(对于中文和表情返回NO) | |
| 175 | + BOOL asc = [text canBeConvertedToEncoding:NSASCIIStringEncoding]; | |
| 176 | + if (asc) { | |
| 177 | + s = [text substringWithRange:rg];//因为是ascii码直接取就可以了不会错 | |
| 178 | + } | |
| 179 | + else { | |
| 180 | + __block NSInteger idx = 0; | |
| 181 | + __block NSString *trimString = @"";//截取出的字串 | |
| 182 | + //使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个 | |
| 183 | + [text enumerateSubstringsInRange:NSMakeRange(0, [text length]) | |
| 184 | + options:NSStringEnumerationByComposedCharacterSequences | |
| 185 | + usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) { | |
| 186 | + | |
| 187 | + NSInteger steplen = substring.length; | |
| 188 | + if (steplen>rg.length) { | |
| 189 | + *stop = YES; //取出所需要就break,提高效率 | |
| 190 | + return ; | |
| 191 | + } | |
| 192 | + if (idx >= rg.length) { | |
| 193 | + *stop = YES; //取出所需要就break,提高效率 | |
| 194 | + return ; | |
| 195 | + } | |
| 196 | + | |
| 197 | + trimString = [trimString stringByAppendingString:substring]; | |
| 198 | + idx = idx + steplen;//这里变化了,使用了字串占的长度来作为步长 | |
| 199 | + }]; | |
| 200 | + | |
| 201 | + s = trimString; | |
| 202 | + } | |
| 203 | + //rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件) | |
| 204 | + [textView setText:[textView.text stringByReplacingCharactersInRange:range withString:s]]; | |
| 205 | + //既然是超出部分截取了,哪一定是最大限制了。 | |
| 206 | + self.textNum.text = [NSString stringWithFormat:@"%d",0]; | |
| 207 | + } | |
| 208 | + return NO; | |
| 209 | + } | |
| 210 | + | |
| 211 | +} | |
| 212 | + | |
| 213 | +- (void)textViewDidChange:(UITextView *)textView{ | |
| 214 | + NSString *nsTextContent = textView.text; //总text | |
| 215 | + NSInteger existTextNum = nsTextContent.length; //总length | |
| 216 | + | |
| 217 | + if (existTextNum > MAX_LIMIT_NUMS) { | |
| 218 | + //截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断) | |
| 219 | + NSString *s = [nsTextContent substringToIndex:MAX_LIMIT_NUMS]; | |
| 220 | + [textView setText:s]; | |
| 221 | + } | |
| 222 | + //不让显示负数 | |
| 223 | + self.textNum.text = [NSString stringWithFormat:@"%ld",MAX(0,MAX_LIMIT_NUMS - existTextNum)]; | |
| 224 | + | |
| 225 | +} | |
| 226 | + | |
| 227 | +- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | |
| 228 | + [self.view endEditing:YES]; | |
| 229 | +} | |
| 230 | +#pragma mark - UITableViewDataSource | |
| 231 | +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | |
| 232 | + return 2; | |
| 233 | +} | |
| 234 | + | |
| 235 | +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { | |
| 236 | + NSArray *data = @[@"男", @"女"]; | |
| 237 | + CNLiveInfoUpdateCell *cell = [tableView dequeueReusableCellWithIdentifier:kCNLiveInfoUpdateCell forIndexPath:indexPath]; | |
| 238 | + cell.text = data[indexPath.row]; | |
| 239 | + if(indexPath.row == 0){ | |
| 240 | + cell.isShow = [CNUserShareModel.gender isEqualToString:@"m"]; | |
| 241 | + }else if (indexPath.row == 1){ | |
| 242 | + cell.isShow = [CNUserShareModel.gender isEqualToString:@"f"]; | |
| 243 | + } | |
| 244 | + return cell; | |
| 245 | +} | |
| 246 | + | |
| 247 | +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { | |
| 248 | + return 50.0; | |
| 249 | +} | |
| 250 | + | |
| 251 | +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { | |
| 252 | + [self.tableView qmui_clearsSelection]; | |
| 253 | + | |
| 254 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 255 | + self.navigationBar.right.backgroundColor = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 256 | + | |
| 257 | + CNLiveInfoUpdateCell *cell = [tableView cellForRowAtIndexPath:indexPath]; | |
| 258 | + NSArray *visibleCells = [self.tableView visibleCells]; | |
| 259 | + for (CNLiveInfoUpdateCell *visibleCell in visibleCells) { | |
| 260 | + visibleCell.isShow = NO; | |
| 261 | + } | |
| 262 | + cell.isShow = YES; | |
| 263 | + | |
| 264 | + if(indexPath.row == 0){ | |
| 265 | + self.gender = @"m"; | |
| 266 | + }else if(indexPath.row == 1){ | |
| 267 | + self.gender = @"f"; | |
| 268 | + } | |
| 269 | + | |
| 270 | +} | |
| 271 | + | |
| 272 | +- (void)didHideAlertController:(QMUIAlertController *)alertController{ | |
| 273 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 274 | + | |
| 275 | +} | |
| 276 | + | |
| 277 | +#pragma mark - 更新头像 | |
| 278 | +// 修改头像 | |
| 279 | +- (void)updateHeaderActionSheetView{ | |
| 280 | + __weak typeof(self) weakSelf = self; | |
| 281 | + QMUIAlertAction *action1 = [QMUIAlertAction actionWithTitle:@"拍照" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 282 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 283 | + if(!strongSelf) return ; | |
| 284 | + strongSelf.navigationBar.right.userInteractionEnabled = YES; | |
| 285 | + __strong typeof(strongSelf) weakSelf = strongSelf; | |
| 286 | + [CNLiveAuthorizationManager getAVAuthorizationStatus:^{ | |
| 287 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 288 | + if(!strongSelf) return ; | |
| 289 | + XFCameraController *cameraController = [[XFCameraController alloc] init]; | |
| 290 | + cameraController.isCanShootVideo = NO; | |
| 291 | + cameraController.modalPresentationStyle = UIModalPresentationFullScreen; | |
| 292 | + __weak XFCameraController *weakCameraController = cameraController; | |
| 293 | + __weak typeof(strongSelf) weakSelf = strongSelf; | |
| 294 | + cameraController.takePhotosCompletionBlock = ^(UIImage *image, NSError *error) { | |
| 295 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 296 | + if(!strongSelf) return ; | |
| 297 | + strongSelf->_image = image; | |
| 298 | + [strongSelf requestUpdateUserHeader:image]; | |
| 299 | + | |
| 300 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
| 301 | + [weakCameraController dismissViewControllerAnimated:YES completion:nil]; | |
| 302 | + }); | |
| 303 | + }; | |
| 304 | + [self presentViewController:cameraController animated:YES completion:nil]; | |
| 305 | + }]; | |
| 306 | + | |
| 307 | + }]; | |
| 308 | + QMUIAlertAction *action2 = [QMUIAlertAction actionWithTitle:@"从手机相册中选择" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 309 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 310 | + if(!strongSelf) return ; | |
| 311 | + strongSelf.navigationBar.right.userInteractionEnabled = YES; | |
| 312 | + __strong typeof(strongSelf) weakSelf = strongSelf; | |
| 313 | + [CNLiveAuthorizationManager getPHAuthorizationStatus:^{ | |
| 314 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 315 | + if(!strongSelf) return ; | |
| 316 | + TZImagePickerController *picker = [[TZImagePickerController alloc] initWithMaxImagesCount:1 delegate:strongSelf]; | |
| 317 | + picker.modalPresentationStyle = UIModalPresentationFullScreen; | |
| 318 | + picker.allowPickingVideo = NO; | |
| 319 | + picker.allowPreview = NO; | |
| 320 | + __weak typeof(strongSelf) weakSelf = strongSelf; | |
| 321 | + [picker setDidFinishPickingPhotosHandle:^(NSArray<UIImage *> *photos, NSArray *assets, BOOL isSelectOriginalPhoto) { | |
| 322 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 323 | + if(!strongSelf) return ; | |
| 324 | + strongSelf->_image = [photos firstObject]; | |
| 325 | + [strongSelf requestUpdateUserHeader:[photos firstObject]]; | |
| 326 | + }]; | |
| 327 | + [strongSelf presentViewController:picker animated:YES completion:nil]; | |
| 328 | + }]; | |
| 329 | + | |
| 330 | + }]; | |
| 331 | + QMUIAlertAction *action3 = [QMUIAlertAction actionWithTitle:@"保存图片" style:QMUIAlertActionStyleDefault handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 332 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 333 | + if(!strongSelf) return ; | |
| 334 | + [CNLiveAuthorizationManager getPHAuthorizationStatus:^{ | |
| 335 | + UIImage *image = [strongSelf generateImage:strongSelf.imageView]; | |
| 336 | + [QMUITips showLoadingInView:strongSelf.view]; | |
| 337 | + [strongSelf saveImage:image]; | |
| 338 | + [QMUITips hideAllTipsInView:strongSelf.view]; | |
| 339 | + }]; | |
| 340 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 341 | + | |
| 342 | + }]; | |
| 343 | + QMUIAlertAction *cancel = [QMUIAlertAction actionWithTitle:@"取消" style:QMUIAlertActionStyleCancel handler:^(__kindof QMUIAlertController *aAlertController, QMUIAlertAction *action) { | |
| 344 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 345 | + if(!strongSelf) return ; | |
| 346 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 347 | + | |
| 348 | + }]; | |
| 349 | + | |
| 350 | + QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:QMUIAlertControllerStyleActionSheet]; | |
| 351 | + alertController.delegate = self; | |
| 352 | + [alertController addAction:action1]; | |
| 353 | + [alertController addAction:action2]; | |
| 354 | + [alertController addAction:action3]; | |
| 355 | + [alertController addAction:cancel]; | |
| 356 | + | |
| 357 | + NSMutableDictionary *titleAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 358 | + | |
| 359 | + titleAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:35/255.0 green:212/255.0 blue:30/255.0 alpha:1.0]; | |
| 360 | + | |
| 361 | + NSMutableDictionary *cancelAttributs = [[NSMutableDictionary alloc] initWithDictionary:alertController.alertTitleAttributes]; | |
| 362 | + cancelAttributs[NSForegroundColorAttributeName] = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 363 | + | |
| 364 | + action1.buttonAttributes = titleAttributs; | |
| 365 | + action2.buttonAttributes = titleAttributs; | |
| 366 | + action3.buttonAttributes = titleAttributs; | |
| 367 | + cancel.buttonAttributes = cancelAttributs; | |
| 368 | + | |
| 369 | + [alertController showWithAnimated:YES]; | |
| 370 | +} | |
| 371 | + | |
| 372 | +// 更新头像 | |
| 373 | +- (void)requestUpdateUserHeader:(UIImage *)image{ | |
| 374 | + // 固定方向 | |
| 375 | + image = [image fixOrientation]; | |
| 376 | + //压缩图片质量 | |
| 377 | + image = [self reduceImage:image percent:0.5]; | |
| 378 | + [QMUITips showLoading:@"修改中" inView:self.view]; | |
| 379 | + | |
| 380 | + [CNLiveUserSystemCenter uploadIconWithUid:CNUserShareModel.uid icon:image compressionQuality:0.99 success:^(id result) { | |
| 381 | + CNUserShareModel.faceUrl = result[@"data"][@"faceUrl"]; | |
| 382 | + CNUserShareModel.bigFaceUrl = result[@"data"][@"bigFaceUrl"]; | |
| 383 | + | |
| 384 | + [self.imageView sd_setImageWithURL:[NSURL URLWithString:CNUserShareModel.bigFaceUrl] placeholderImage:image completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { | |
| 385 | + }]; | |
| 386 | + | |
| 387 | + [self showSucceed:CNUserShareModel.faceUrl]; | |
| 388 | + | |
| 389 | + } failure:^(NSDictionary *errorDic) { | |
| 390 | + [self showError:errorDic[@"errorMessage"]]; | |
| 391 | + | |
| 392 | + }]; | |
| 393 | + | |
| 394 | +} | |
| 395 | + | |
| 396 | +// 压缩图片质量 | |
| 397 | +- (UIImage *)reduceImage:(UIImage *)image percent:(float)percent { | |
| 398 | + NSData *imageData = UIImageJPEGRepresentation(image, percent); | |
| 399 | + UIImage *newImage = [UIImage imageWithData:imageData]; | |
| 400 | + return newImage; | |
| 401 | +} | |
| 402 | + | |
| 403 | +// 保存图片 | |
| 404 | +- (void)saveImage:(UIImage *)image{ | |
| 405 | + if(!image){ | |
| 406 | + [QMUITips showError:@"保存失败" inView:self.view hideAfterDelay:timeValue]; | |
| 407 | + return; | |
| 408 | + } | |
| 409 | + [[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{ | |
| 410 | + [PHAssetChangeRequest creationRequestForAssetFromImage:image]; | |
| 411 | + | |
| 412 | + } completionHandler:^(BOOL success, NSError * _Nullable error) { | |
| 413 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
| 414 | + if (success) { | |
| 415 | + [QMUITips showSucceed:@"保存成功" inView:self.view hideAfterDelay:timeValue]; | |
| 416 | + } else { | |
| 417 | + [QMUITips showError:@"保存失败" inView:self.view hideAfterDelay:timeValue]; | |
| 418 | + } | |
| 419 | + }); | |
| 420 | + | |
| 421 | + }]; | |
| 422 | +} | |
| 423 | + | |
| 424 | +// UIView转UIImage | |
| 425 | +- (UIImage *)generateImage:(UIView *)view{ | |
| 426 | + // 1.开启上下文 | |
| 427 | + UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0); | |
| 428 | + // 2. 将控制器View的Layer渲染到上下文 | |
| 429 | + [view.layer renderInContext:UIGraphicsGetCurrentContext()]; | |
| 430 | + // 3.取出图片 | |
| 431 | + UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); | |
| 432 | + // 4.结束上下文 | |
| 433 | + UIGraphicsEndImageContext(); | |
| 434 | + | |
| 435 | + return newImage; | |
| 436 | +} | |
| 437 | + | |
| 438 | +#pragma mark - 更新昵称 | |
| 439 | +- (void)requestUpdateUserNickname{ | |
| 440 | + NSString *text = [self.textField.text trim]; | |
| 441 | + if (text.length == 0) { | |
| 442 | + [QMUITips showError:@"没有输入名字,请重新填写" inView:self.view hideAfterDelay:timeValue]; | |
| 443 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 444 | + return; | |
| 445 | + } | |
| 446 | + if ([text isEqualToString:CNUserShareModel.nickname]) { | |
| 447 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 448 | + [self goBack]; | |
| 449 | + return; | |
| 450 | + } | |
| 451 | + | |
| 452 | + [QMUITips showLoading:@"修改中" inView:self.view]; | |
| 453 | + [CNLiveUserSystemCenter modifyUserInfoType:UserInfoTypeNickName uid:CNUserShareModel.uid modifyInfo:text success:^(id result) { | |
| 454 | + CNUserShareModel.nickname = self.textField.text; | |
| 455 | + [self showSucceed:CNUserShareModel.nickname]; | |
| 456 | + | |
| 457 | + } failure:^(NSDictionary *errorDic) { | |
| 458 | + [self showError:errorDic[@"errorMessage"]]; | |
| 459 | + | |
| 460 | + }]; | |
| 461 | + | |
| 462 | +} | |
| 463 | + | |
| 464 | +#pragma mark - 更新性别 | |
| 465 | +- (void)requestUpdateUserGender{ | |
| 466 | + if ([self.gender isEqualToString:CNUserShareModel.gender]) { | |
| 467 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 468 | + [self goBack]; | |
| 469 | + return; | |
| 470 | + } | |
| 471 | + [QMUITips showLoading:@"修改中" inView:self.view]; | |
| 472 | + [CNLiveUserSystemCenter modifyUserInfoType:UserInfoTypeGender uid:CNUserShareModel.uid modifyInfo:self.gender success:^(id result) { | |
| 473 | + CNUserShareModel.gender = self.gender; | |
| 474 | + [self showSucceed:CNUserShareModel.gender]; | |
| 475 | + | |
| 476 | + } failure:^(NSDictionary *errorDic) { | |
| 477 | + [self showError:errorDic[@"errorMessage"]]; | |
| 478 | + | |
| 479 | + }]; | |
| 480 | + | |
| 481 | +} | |
| 482 | + | |
| 483 | +#pragma mark - 更新地区 | |
| 484 | +- (void)requestUpdateUserAddress{ | |
| 485 | + NSString *text = [self.textField.text trim]; | |
| 486 | + if (text.length == 0) { | |
| 487 | + [QMUITips showError:@"请填写您的位置" inView:self.view hideAfterDelay:timeValue]; | |
| 488 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 489 | + return; | |
| 490 | + } | |
| 491 | + if ([text isEqualToString:CNUserShareModel.location]) { | |
| 492 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 493 | + [self goBack]; | |
| 494 | + return; | |
| 495 | + } | |
| 496 | + | |
| 497 | + [QMUITips showLoading:@"修改中" inView:self.view]; | |
| 498 | + [CNLiveUserSystemCenter modifyUserInfoType:UserInfoTypeLocation uid:CNUserShareModel.uid modifyInfo:text success:^(id result) { | |
| 499 | + CNUserShareModel.location = self.textField.text; | |
| 500 | + [self showSucceed:CNUserShareModel.location]; | |
| 501 | + | |
| 502 | + } failure:^(NSDictionary *errorDic) { | |
| 503 | + [self showError:errorDic[@"errorMessage"]]; | |
| 504 | + | |
| 505 | + }]; | |
| 506 | + | |
| 507 | +} | |
| 508 | + | |
| 509 | +#pragma mark - 更新个性签名 | |
| 510 | +- (void)requestUpdateUserIntroduction { | |
| 511 | + BOOL isNil = [[self.textView.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]length] == 0; | |
| 512 | + | |
| 513 | + if ([self.textView.text isEqualToString:CNUserShareModel.signature]) { | |
| 514 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 515 | + [self goBack]; | |
| 516 | + } | |
| 517 | + | |
| 518 | + // 签名不可以为空 | |
| 519 | + NSString *signature; | |
| 520 | + if (isNil) { | |
| 521 | + signature = @""; | |
| 522 | + } else { | |
| 523 | + signature = [self.textView.text qmui_trim]; | |
| 524 | + } | |
| 525 | + | |
| 526 | + NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:signature,@"userSign", nil]; | |
| 527 | + NSString *updateSign = CNLiveNSDictionaryDicToJson(dic); | |
| 528 | + | |
| 529 | + [QMUITips showLoading:@"修改中" inView:self.view]; | |
| 530 | + [CNLiveUserSystemCenter updateOtherInfoWithUid:CNUserShareModel.uid extInfo:updateSign success:^(id result) { | |
| 531 | + CNUserShareModel.signature = signature; | |
| 532 | + [self showSucceed:CNUserShareModel.signature]; | |
| 533 | + | |
| 534 | + } failure:^(NSDictionary *errorDic) { | |
| 535 | + [self showError:errorDic[@"errorMessage"]]; | |
| 536 | + | |
| 537 | + }]; | |
| 538 | + | |
| 539 | +} | |
| 540 | + | |
| 541 | +#pragma mark - 更新提示 | |
| 542 | +- (void)showSucceed:(NSString *)info{ | |
| 543 | + [CNLiveUserInfoNotification postUserInfoUpdateNotificationType:self.model.dataType info:info]; | |
| 544 | + | |
| 545 | + [[IMAPlatform sharedInstance].host asyncProfile]; | |
| 546 | + [QMUITips hideAllToastInView:self.view animated:YES]; | |
| 547 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 548 | + [QMUITips showSucceed:@"修改成功" inView:self.view]; | |
| 549 | + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeValue * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | |
| 550 | + [QMUITips hideAllToastInView:self.view animated:YES]; | |
| 551 | + [self goBack]; | |
| 552 | + }); | |
| 553 | + | |
| 554 | +} | |
| 555 | +- (void)showError:(NSString *)text{ | |
| 556 | + self.navigationBar.right.userInteractionEnabled = YES; | |
| 557 | + [QMUITips hideAllToastInView:self.view animated:YES]; | |
| 558 | + [QMUITips showError:text inView:self.view hideAfterDelay:timeValue]; | |
| 559 | +} | |
| 560 | + | |
| 561 | +#pragma mark - 懒加载 | |
| 562 | +- (CNLiveNavigationBar *)navigationBar { | |
| 563 | + if (!_navigationBar) { | |
| 564 | + _navigationBar = [CNLiveNavigationBar navigationBar]; | |
| 565 | + _navigationBar.title.text = @"个人资料"; | |
| 566 | + switch (self.model.dataType) { | |
| 567 | + case CNLiveUserInfoDataTypeHeader: | |
| 568 | + { | |
| 569 | + UIImage *xw_image = [self getImageWithImageName:@"cnlive_black_more" bundleName:@"CNLiveCustomControl" targetClass:[CNLiveNavigationBar class]]; | |
| 570 | + _navigationBar.rightImage = xw_image; | |
| 571 | + } | |
| 572 | + break; | |
| 573 | + default: | |
| 574 | + { | |
| 575 | + _navigationBar.rightTitle = @"完成"; | |
| 576 | + _navigationBar.right.frame = CGRectMake(SCREEN_WIDTH-45-15, StatusBarHeight+10, 45, 24); | |
| 577 | + [_navigationBar.right setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter]; | |
| 578 | + _navigationBar.right.backgroundColor = [UIColor lightGrayColor]; | |
| 579 | + _navigationBar.right.userInteractionEnabled = NO; | |
| 580 | + _navigationBar.right.titleLabel.font = [UIFont boldSystemFontOfSize:13]; | |
| 581 | + [_navigationBar.right setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; | |
| 582 | + _navigationBar.right.adjustsImageWhenHighlighted = NO; | |
| 583 | + _navigationBar.right.layer.masksToBounds = YES; | |
| 584 | + _navigationBar.right.layer.cornerRadius = 5; | |
| 585 | + | |
| 586 | + } | |
| 587 | + break; | |
| 588 | + } | |
| 589 | + | |
| 590 | + __weak typeof(self) weakSelf = self; | |
| 591 | + _navigationBar.onClickLeftButton = ^{ | |
| 592 | + [weakSelf goBack]; | |
| 593 | + }; | |
| 594 | + _navigationBar.onClickRightButton = ^{ | |
| 595 | + [self.textField resignFirstResponder]; | |
| 596 | + [self.textView resignFirstResponder]; | |
| 597 | + | |
| 598 | + switch (self.model.dataType) { | |
| 599 | + case CNLiveUserInfoDataTypeHeader://头像 | |
| 600 | + { | |
| 601 | + [self updateHeaderActionSheetView]; | |
| 602 | + } | |
| 603 | + break; | |
| 604 | + case CNLiveUserInfoDataTypeNickname://昵称 | |
| 605 | + { | |
| 606 | + [self requestUpdateUserNickname]; | |
| 607 | + } | |
| 608 | + break; | |
| 609 | + case CNLiveUserInfoDataTypeGender://昵称 | |
| 610 | + { | |
| 611 | + [self requestUpdateUserGender]; | |
| 612 | + } | |
| 613 | + break; | |
| 614 | + case CNLiveUserInfoDataTypeAddress://地区 | |
| 615 | + { | |
| 616 | + [self requestUpdateUserAddress]; | |
| 617 | + } | |
| 618 | + break; | |
| 619 | + case CNLiveUserInfoDataTypeIntroduction://简介 | |
| 620 | + { | |
| 621 | + [self requestUpdateUserIntroduction]; | |
| 622 | + } | |
| 623 | + break; | |
| 624 | + | |
| 625 | + default: | |
| 626 | + break; | |
| 627 | + } | |
| 628 | + | |
| 629 | + }; | |
| 630 | + } | |
| 631 | + return _navigationBar; | |
| 632 | +} | |
| 633 | + | |
| 634 | +- (UIView *)contentView{ | |
| 635 | + if(!_contentView){ | |
| 636 | + _contentView = [[UIView alloc] initWithFrame:CGRectMake(0, NavigationContentTop+margin, SCREEN_WIDTH, 50)]; | |
| 637 | + _contentView.backgroundColor = [UIColor whiteColor]; | |
| 638 | + switch (self.model.dataType) { | |
| 639 | + case CNLiveUserInfoDataTypeHeader: | |
| 640 | + { | |
| 641 | + self.view.backgroundColor = [UIColor blackColor]; | |
| 642 | + _contentView.backgroundColor = [UIColor blackColor]; | |
| 643 | + | |
| 644 | + self.navigationBar.title.text = @"个人头像"; | |
| 645 | + [self.view addSubview:self.imageView]; | |
| 646 | + | |
| 647 | + } | |
| 648 | + break; | |
| 649 | + case CNLiveUserInfoDataTypeNickname: | |
| 650 | + { | |
| 651 | + self.navigationBar.title.text = @"设置昵称"; | |
| 652 | + | |
| 653 | + [_contentView addSubview:self.textField]; | |
| 654 | + self.textField.placeholder = @"请输入昵称"; | |
| 655 | + | |
| 656 | + self.textField.text = self.model.info; | |
| 657 | + } | |
| 658 | + break; | |
| 659 | + case CNLiveUserInfoDataTypeAddress: | |
| 660 | + { | |
| 661 | + self.navigationBar.title.text = @"设置地区"; | |
| 662 | + | |
| 663 | + [_contentView addSubview:self.textField]; | |
| 664 | + self.textField.placeholder = @"请输入你所在的地区"; | |
| 665 | + | |
| 666 | + self.textField.text = self.model.info; | |
| 667 | + } | |
| 668 | + break; | |
| 669 | + case CNLiveUserInfoDataTypeGender: | |
| 670 | + { | |
| 671 | + self.navigationBar.title.text = @"设置性别"; | |
| 672 | + [self.navigationBar.left setTitle:@"取消" forState:UIControlStateNormal]; | |
| 673 | + [self.navigationBar.left setTitleColor:[UIColor colorWithRed:30/255.0 green:30/255.0 blue:30/255.0 alpha:1.0] forState:UIControlStateNormal]; | |
| 674 | + [self.navigationBar.left setImage:nil forState:UIControlStateNormal]; | |
| 675 | + _contentView.frame = CGRectMake(0, NavigationContentTop+margin, SCREEN_WIDTH, 100); | |
| 676 | + [_contentView addSubview:self.tableView]; | |
| 677 | + } | |
| 678 | + break; | |
| 679 | + case CNLiveUserInfoDataTypeIntroduction: | |
| 680 | + { | |
| 681 | + self.navigationBar.title.text = @"设置个性签名"; | |
| 682 | + | |
| 683 | + _contentView.frame = CGRectMake(0, NavigationContentTop+margin, SCREEN_WIDTH, 120); | |
| 684 | + [_contentView addSubview:self.textView]; | |
| 685 | + self.textView.text = self.model.info; | |
| 686 | + self.textNum.text = [NSString stringWithFormat:@"%lu",MAX(0,MAX_LIMIT_NUMS - self.textView.text.length)]; | |
| 687 | + | |
| 688 | + [_contentView addSubview:self.textNum]; | |
| 689 | + [self.textNum mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 690 | + make.right.equalTo(self.textView); | |
| 691 | + make.bottom.equalTo(self.textView).offset(-margin); | |
| 692 | + }]; | |
| 693 | + } | |
| 694 | + break; | |
| 695 | + default: | |
| 696 | + { | |
| 697 | + | |
| 698 | + } | |
| 699 | + break; | |
| 700 | + } | |
| 701 | + | |
| 702 | + } | |
| 703 | + return _contentView; | |
| 704 | + | |
| 705 | +} | |
| 706 | + | |
| 707 | +- (UIImageView *)imageView{ | |
| 708 | + if(!_imageView){ | |
| 709 | + _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_WIDTH)]; | |
| 710 | + _imageView.center = self.view.center; | |
| 711 | + UIImage *xw_image = [self getImageWithImageName:@"default_avatar_f" bundleName:@"CNLiveBMineModule" targetClass:[CNLiveInfoUpdateController class]]; | |
| 712 | + [_imageView sd_setImageWithURL:[NSURL URLWithString:CNUserShareModel.bigFaceUrl?CNUserShareModel.bigFaceUrl:CNUserShareModel.faceUrl] placeholderImage:xw_image]; | |
| 713 | + } | |
| 714 | + return _imageView; | |
| 715 | +} | |
| 716 | + | |
| 717 | +- (UITextField *)textField{ | |
| 718 | + if(!_textField){ | |
| 719 | + _textField = [[UITextField alloc] initWithFrame:CGRectMake(margin, 0, SCREEN_WIDTH-2*margin, 50)]; | |
| 720 | + _textField.delegate = self; | |
| 721 | + _textField.backgroundColor = [UIColor whiteColor];// 设置背景颜色 | |
| 722 | + _textField.textColor = [UIColor blackColor]; // 设置文字的颜色 | |
| 723 | + _textField.clearsOnBeginEditing = YES; // 当第二次输入的时候,清空上一次的内容 | |
| 724 | + _textField.font = [UIFont systemFontOfSize:15.0f]; | |
| 725 | + _textField.clearButtonMode = UITextFieldViewModeWhileEditing; // 编辑的时候会显示出删除全部的小X | |
| 726 | + _textField.clearButtonMode = UITextFieldViewModeAlways; | |
| 727 | + _textField.backgroundColor = [UIColor whiteColor]; | |
| 728 | + //设置显示模式为永远显示(默认不显示) | |
| 729 | + _textField.leftViewMode = UITextFieldViewModeAlways; | |
| 730 | + _textField.returnKeyType = UIReturnKeyDone; | |
| 731 | + _textField.delegate = self; | |
| 732 | + } | |
| 733 | + return _textField; | |
| 734 | +} | |
| 735 | + | |
| 736 | +- (UITextView *)textView{ | |
| 737 | + if(!_textView){ | |
| 738 | + _textView = [[UITextView alloc] initWithFrame:CGRectMake(margin, 0, SCREEN_WIDTH-2*margin, 120)]; | |
| 739 | + _textView.delegate = self; | |
| 740 | + _textView.backgroundColor = [UIColor whiteColor];// 设置背景颜色 | |
| 741 | + _textView.textColor = [UIColor blackColor]; // 设置文字的颜色 | |
| 742 | + _textView.font = [UIFont systemFontOfSize:16.0f]; | |
| 743 | + } | |
| 744 | + return _textView; | |
| 745 | +} | |
| 746 | + | |
| 747 | +- (UILabel *)textNum { | |
| 748 | + if (!_textNum) { | |
| 749 | + _textNum = [[UILabel alloc] init]; | |
| 750 | + _textNum.textColor = [UIColor colorWithRed:206/255.0 green:206/255.0 blue:206/255.0 alpha:1.0]; | |
| 751 | + _textNum.font = [UIFont systemFontOfSize:16]; | |
| 752 | + _textNum.text = @"30"; | |
| 753 | + } | |
| 754 | + return _textNum; | |
| 755 | +} | |
| 756 | + | |
| 757 | +- (UITableView *)tableView { | |
| 758 | + if (!_tableView) { | |
| 759 | + _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 100) style:UITableViewStylePlain]; | |
| 760 | + _tableView.delegate = self; | |
| 761 | + _tableView.dataSource = self; | |
| 762 | + _tableView.showsVerticalScrollIndicator = NO; | |
| 763 | + _tableView.showsHorizontalScrollIndicator = NO; | |
| 764 | + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; | |
| 765 | + [_tableView registerClass:[CNLiveInfoUpdateCell class] forCellReuseIdentifier:kCNLiveInfoUpdateCell]; | |
| 766 | + _tableView.backgroundColor = [UIColor colorWithRed:242/255.0 green:242/255.0 blue:242/255.0 alpha:1.0]; | |
| 767 | + } | |
| 768 | + return _tableView; | |
| 769 | +} | |
| 770 | + | |
| 771 | +#pragma mark - 响应方法 | |
| 772 | +- (void)goBack { | |
| 773 | + [self.textField resignFirstResponder]; | |
| 774 | + [self.textView resignFirstResponder]; | |
| 775 | + | |
| 776 | + if (self.presentingViewController != nil) { | |
| 777 | + [self dismissViewControllerAnimated:YES completion:nil]; | |
| 778 | + } | |
| 779 | + else { | |
| 780 | + [self.navigationController popViewControllerAnimated:YES]; | |
| 781 | + } | |
| 782 | +} | |
| 783 | + | |
| 784 | +@end | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveUserInfoCell.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveUserInfoCell.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <UIKit/UIKit.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | +@class CNLiveUserInfoModel; | |
| 13 | +static NSString * const kCNLiveUserInfoCell = @"CNLiveUserInfoCell"; | |
| 14 | + | |
| 15 | +@interface CNLiveUserInfoCell : UITableViewCell | |
| 16 | + | |
| 17 | +@property (nonatomic, strong) CNLiveUserInfoModel *model; | |
| 18 | +@property (nonatomic, strong) UIImage *image; | |
| 19 | + | |
| 20 | +@end | |
| 21 | + | |
| 22 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveUserInfoCell.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveUserInfoCell.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveUserInfoCell.h" | |
| 10 | +#import <Masonry/Masonry.h> | |
| 11 | +#import <SDWebImage/SDWebImage.h> | |
| 12 | +#import "CNLiveUserInfoModel.h" | |
| 13 | +#import "CNLiveCategory.h" | |
| 14 | + | |
| 15 | +@interface CNLiveUserInfoCell() | |
| 16 | +@property (nonatomic, strong) UIView *line; | |
| 17 | +@property (nonatomic, strong) UILabel *title; | |
| 18 | +@property (nonatomic, strong) UILabel *content; | |
| 19 | +@property (nonatomic, strong) UIImageView *front; | |
| 20 | +@property (nonatomic, strong) UIImageView *pic; | |
| 21 | + | |
| 22 | +@end | |
| 23 | + | |
| 24 | +@implementation CNLiveUserInfoCell | |
| 25 | +static const NSInteger margin = 12; | |
| 26 | + | |
| 27 | +- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { | |
| 28 | + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; | |
| 29 | + if (self) { | |
| 30 | + self.contentView.backgroundColor = [UIColor whiteColor]; | |
| 31 | + | |
| 32 | + [self.contentView addSubview:self.line]; | |
| 33 | + [self.contentView addSubview:self.title]; | |
| 34 | + [self.contentView addSubview:self.content]; | |
| 35 | + [self.contentView addSubview:self.front]; | |
| 36 | + [self.contentView addSubview:self.pic]; | |
| 37 | + | |
| 38 | + } | |
| 39 | + return self; | |
| 40 | +} | |
| 41 | + | |
| 42 | +- (void)setImage:(UIImage *)image{ | |
| 43 | + _image = image; | |
| 44 | + if(self.model.dataType == CNLiveUserInfoDataTypeHeader){ | |
| 45 | + _pic.image = image; | |
| 46 | + } | |
| 47 | +} | |
| 48 | + | |
| 49 | +- (void)setModel:(CNLiveUserInfoModel *)model{ | |
| 50 | + _model = model; | |
| 51 | + _title.text = model.title; | |
| 52 | + | |
| 53 | + _content.text = model.info; | |
| 54 | + | |
| 55 | + if(model.dataType == CNLiveUserInfoDataTypeHeader){ | |
| 56 | + _pic.backgroundColor = [UIColor whiteColor]; | |
| 57 | + _pic.contentMode = UIViewContentModeScaleToFill; | |
| 58 | + _pic.layer.masksToBounds = YES; | |
| 59 | + _pic.layer.cornerRadius = 5.0; | |
| 60 | + UIImage *xw_image = [self getImageWithImageName:@"default_avatar_y" bundleName:@"CNLiveBMineModule" targetClass:[self class]]; | |
| 61 | + [_pic sd_setImageWithURL:[NSURL URLWithString:model.info] placeholderImage:xw_image]; | |
| 62 | + | |
| 63 | + }else if (model.dataType == CNLiveUserInfoDataTypeNickname){ | |
| 64 | + | |
| 65 | + | |
| 66 | + }else if (model.dataType == CNLiveUserInfoDataTypeGender){ | |
| 67 | + if([model.info isEqualToString:@"m"]){ | |
| 68 | + _content.text = @"男"; | |
| 69 | + }else if([model.info isEqualToString:@"f"]){ | |
| 70 | + _content.text = @"女"; | |
| 71 | + }else{ | |
| 72 | + _content.text = @"未知"; | |
| 73 | + } | |
| 74 | + | |
| 75 | + }else if (model.dataType == CNLiveUserInfoDataTypeCode){ | |
| 76 | + | |
| 77 | + }else if (model.dataType == CNLiveUserInfoDataTypeAddress){ | |
| 78 | + | |
| 79 | + }else if (model.dataType == CNLiveUserInfoDataTypeIntroduction){ | |
| 80 | + | |
| 81 | + } | |
| 82 | + | |
| 83 | + [self xw_layoutSubviews]; | |
| 84 | +} | |
| 85 | + | |
| 86 | +- (void)xw_layoutSubviews{ | |
| 87 | + | |
| 88 | + CGFloat line_margin = self.model.lineHeight >= 5?0:margin; | |
| 89 | + | |
| 90 | + [_line mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 91 | + make.left.equalTo(self.contentView.mas_left).with.offset(line_margin); | |
| 92 | + make.right.equalTo(self.contentView.mas_right).with.offset(-line_margin); | |
| 93 | + make.bottom.equalTo(self.contentView.mas_bottom).with.offset(0); | |
| 94 | + make.height.offset(self.model.lineHeight); | |
| 95 | + | |
| 96 | + }]; | |
| 97 | + | |
| 98 | + [_title mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 99 | + make.left.equalTo(self.contentView.mas_left).with.offset(margin); | |
| 100 | + make.top.equalTo(self.contentView.mas_top).with.offset(0); | |
| 101 | + make.height.offset(self.model.height-self.model.lineHeight); | |
| 102 | + | |
| 103 | + }]; | |
| 104 | + | |
| 105 | + [_front mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 106 | + make.right.equalTo(self.contentView.mas_right).with.offset(-margin); | |
| 107 | + make.top.equalTo(self.title.mas_top).with.offset(0); | |
| 108 | + make.width.with.offset(margin); | |
| 109 | + make.height.equalTo(self.title.mas_height); | |
| 110 | + | |
| 111 | + }]; | |
| 112 | + | |
| 113 | + switch (self.model.layoutType) { | |
| 114 | + case CNLiveUserInfoLayoutTypeText: | |
| 115 | + { | |
| 116 | + _content.hidden = NO; | |
| 117 | + _pic.hidden = YES; | |
| 118 | + [_content mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 119 | + make.top.equalTo(self.title.mas_top).with.offset(0); | |
| 120 | + make.left.equalTo(self.title.mas_right).with.offset(margin); | |
| 121 | + make.right.equalTo(self.front.mas_left).with.offset(-margin); | |
| 122 | + make.height.equalTo(self.title.mas_height); | |
| 123 | + | |
| 124 | + }]; | |
| 125 | + } | |
| 126 | + break; | |
| 127 | + case CNLiveUserInfoLayoutTypeImage: | |
| 128 | + { | |
| 129 | + CGFloat height = self.model.height-self.model.lineHeight-2*margin; | |
| 130 | + _content.hidden = YES; | |
| 131 | + _pic.hidden = NO; | |
| 132 | + [_pic mas_updateConstraints:^(MASConstraintMaker *make) { | |
| 133 | + make.top.equalTo(self.contentView.mas_top).with.offset(margin); | |
| 134 | + make.right.equalTo(self.front.mas_left).with.offset(-margin); | |
| 135 | + make.width.height.offset(height); | |
| 136 | + | |
| 137 | + }]; | |
| 138 | + | |
| 139 | + } | |
| 140 | + break; | |
| 141 | + | |
| 142 | + default: | |
| 143 | + { | |
| 144 | + _content.hidden = YES; | |
| 145 | + _pic.hidden = YES; | |
| 146 | + | |
| 147 | + } | |
| 148 | + break; | |
| 149 | + } | |
| 150 | + | |
| 151 | +} | |
| 152 | +- (void)awakeFromNib { | |
| 153 | + [super awakeFromNib]; | |
| 154 | + // Initialization code | |
| 155 | +} | |
| 156 | + | |
| 157 | +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { | |
| 158 | + [super setSelected:selected animated:animated]; | |
| 159 | + | |
| 160 | + // Configure the view for the selected state | |
| 161 | +} | |
| 162 | +#pragma mark - 懒加载 | |
| 163 | +- (UIView *)line { | |
| 164 | + if (!_line) { | |
| 165 | + _line = [[UIView alloc] init]; | |
| 166 | + _line.backgroundColor = [UIColor colorWithRed:235/255.0 green:235/255.0 blue:235/255.0 alpha:1.0]; | |
| 167 | + } | |
| 168 | + return _line; | |
| 169 | +} | |
| 170 | + | |
| 171 | +- (UILabel *)title { | |
| 172 | + if (!_title) { | |
| 173 | + _title = [[UILabel alloc] init]; | |
| 174 | + _title.numberOfLines = 1; | |
| 175 | + _title.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0]; | |
| 176 | + _title.font = [UIFont systemFontOfSize:16]; | |
| 177 | + } | |
| 178 | + return _title; | |
| 179 | +} | |
| 180 | + | |
| 181 | +- (UILabel *)content { | |
| 182 | + if (!_content) { | |
| 183 | + _content = [[UILabel alloc] init]; | |
| 184 | + _content.numberOfLines = 1; | |
| 185 | + _content.lineBreakMode = NSLineBreakByTruncatingTail; | |
| 186 | + _content.textColor = [UIColor colorWithRed:102/255.0 green:102/255.0 blue:102/255.0 alpha:1.0]; | |
| 187 | + _content.font = [UIFont systemFontOfSize:14]; | |
| 188 | + _content.textAlignment = NSTextAlignmentRight; | |
| 189 | + } | |
| 190 | + return _content; | |
| 191 | +} | |
| 192 | + | |
| 193 | +- (UIImageView *)front { | |
| 194 | + if (!_front) { | |
| 195 | + _front = [[UIImageView alloc] init]; | |
| 196 | + UIImage *xw_image = [self getImageWithImageName:@"mine_into" bundleName:@"CNLiveBMineModule" targetClass:[self class]]; | |
| 197 | + _front.image = xw_image; | |
| 198 | + _front.contentMode = UIViewContentModeCenter; | |
| 199 | + | |
| 200 | + } | |
| 201 | + return _front; | |
| 202 | +} | |
| 203 | +- (UIImageView *)pic { | |
| 204 | + if (!_pic) { | |
| 205 | + _pic = [[UIImageView alloc] init]; | |
| 206 | + } | |
| 207 | + return _pic; | |
| 208 | +} | |
| 209 | +#pragma mark - 响应方法 | |
| 210 | +- (void)switchChanged:(UISwitch *)sw{ | |
| 211 | + | |
| 212 | +} | |
| 213 | + | |
| 214 | +@end | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveUserInfoController.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * 个人资料 | |
| 11 | + */ | |
| 12 | + | |
| 13 | +#import <UIKit/UIKit.h> | |
| 14 | +#import "CNCommonViewController.h" | |
| 15 | + | |
| 16 | +NS_ASSUME_NONNULL_BEGIN | |
| 17 | + | |
| 18 | +@interface CNLiveUserInfoController : CNCommonViewController | |
| 19 | + | |
| 20 | +@end | |
| 21 | + | |
| 22 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveUserInfoController.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveUserInfoController.h" | |
| 10 | +#import "MJExtension.h" | |
| 11 | +#import "QMUIKit.h" | |
| 12 | + | |
| 13 | +#import "CNUserInfoManager.h" | |
| 14 | +#import "CNLiveServices.h" | |
| 15 | +#import "CNLiveNavigationBar.h" | |
| 16 | + | |
| 17 | +#import "CNLiveUserInfoCell.h" | |
| 18 | +#import "CNLiveUserInfoModel.h" | |
| 19 | +#import "CNLiveInfoUpdateController.h" | |
| 20 | +#import "CNLiveUserInfoNotification.h" | |
| 21 | + | |
| 22 | +@interface CNLiveUserInfoController ()<UITableViewDelegate, UITableViewDataSource>{ | |
| 23 | + UIImage *_image; | |
| 24 | +} | |
| 25 | +@property (nonatomic, strong) CNLiveNavigationBar *navigationBar; | |
| 26 | +@property (nonatomic, strong) UITableView *tableView; | |
| 27 | +@property (nonatomic, strong) NSMutableArray *data; | |
| 28 | + | |
| 29 | +@end | |
| 30 | + | |
| 31 | +@implementation CNLiveUserInfoController | |
| 32 | +#pragma mark - 加载数据 | |
| 33 | +- (void)loadData { | |
| 34 | + NSArray *data = @[ | |
| 35 | + @{ | |
| 36 | + @"layout":@"2", | |
| 37 | + @"data":@"0", | |
| 38 | + @"title":@"头像", | |
| 39 | + @"info":CNUserShareModel.faceUrl?CNUserShareModel.faceUrl:@"", | |
| 40 | + @"height":@"81", | |
| 41 | + @"lineHeight":@"0.5" | |
| 42 | + }, | |
| 43 | + @{ | |
| 44 | + @"layout":@"1", | |
| 45 | + @"data":@"1", | |
| 46 | + @"title":@"昵称", | |
| 47 | + @"info":CNUserShareModel.nickname?CNUserShareModel.nickname:@"", | |
| 48 | + @"height":@"51", | |
| 49 | + @"lineHeight":@"0.5" | |
| 50 | + }, | |
| 51 | + @{ | |
| 52 | + @"layout":@"1", | |
| 53 | + @"data":@"2", | |
| 54 | + @"title":@"性别", | |
| 55 | + @"info":CNUserShareModel.gender?CNUserShareModel.gender:@"未知", | |
| 56 | + @"height":@"60", | |
| 57 | + @"lineHeight":@"10" | |
| 58 | + }, | |
| 59 | + @{ | |
| 60 | + @"layout":@"1", | |
| 61 | + @"data":@"4", | |
| 62 | + @"title":@"地区", | |
| 63 | + @"info":CNUserShareModel.location?CNUserShareModel.location:@"", | |
| 64 | + @"height":@"60", | |
| 65 | + @"lineHeight":@"10" | |
| 66 | + } | |
| 67 | + | |
| 68 | + ]; | |
| 69 | + for(NSDictionary *dic in data){ | |
| 70 | + [self.data addObject:[CNLiveUserInfoModel mj_objectWithKeyValues:dic]]; | |
| 71 | + } | |
| 72 | + [self.tableView reloadData]; | |
| 73 | + | |
| 74 | +} | |
| 75 | + | |
| 76 | +#pragma mark - 生命周期 | |
| 77 | +- (void)viewWillAppear:(BOOL)animated{ | |
| 78 | + [super viewWillAppear:animated]; | |
| 79 | + self.navigationController.navigationBarHidden = YES; | |
| 80 | +} | |
| 81 | + | |
| 82 | +- (void)viewDidLoad { | |
| 83 | + [super viewDidLoad]; | |
| 84 | + self.view.backgroundColor = [UIColor whiteColor]; | |
| 85 | + if (@available(iOS 11, *)) { | |
| 86 | + self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; | |
| 87 | + } | |
| 88 | + else { | |
| 89 | + self.automaticallyAdjustsScrollViewInsets = NO; | |
| 90 | + } | |
| 91 | + [CNLiveUserInfoNotification addUserInfoUpdateObserver:self selector:@selector(userInfoUpdateNotification:)]; | |
| 92 | + | |
| 93 | + [self createSubViews]; | |
| 94 | + [self loadData]; | |
| 95 | + | |
| 96 | +} | |
| 97 | + | |
| 98 | +- (void)dealloc { | |
| 99 | + [CNLiveUserInfoNotification removeObserver:self]; | |
| 100 | +} | |
| 101 | + | |
| 102 | +- (void)createSubViews { | |
| 103 | + [self.view addSubview:self.navigationBar]; | |
| 104 | + [self.view addSubview:self.tableView]; | |
| 105 | + | |
| 106 | +} | |
| 107 | + | |
| 108 | +#pragma mark - UITableViewDelegate | |
| 109 | +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ | |
| 110 | + CNLiveUserInfoModel *model = self.data[indexPath.row]; | |
| 111 | + return model.height; | |
| 112 | +} | |
| 113 | + | |
| 114 | +#pragma mark - UITableViewDataSource | |
| 115 | +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | |
| 116 | + return self.data.count; | |
| 117 | +} | |
| 118 | + | |
| 119 | +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { | |
| 120 | + CNLiveUserInfoCell *cell = [tableView dequeueReusableCellWithIdentifier:kCNLiveUserInfoCell]; | |
| 121 | + cell.selectionStyle = UITableViewCellSelectionStyleNone; | |
| 122 | + CNLiveUserInfoModel *model = self.data[indexPath.row]; | |
| 123 | + cell.model = model; | |
| 124 | + if(_image){ | |
| 125 | + cell.image = _image; | |
| 126 | + } | |
| 127 | + return cell; | |
| 128 | +} | |
| 129 | +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ | |
| 130 | + CNLiveUserInfoModel *model = self.data[indexPath.row]; | |
| 131 | + switch (model.dataType) { | |
| 132 | + case CNLiveUserInfoDataTypeCode: | |
| 133 | + { | |
| 134 | + id<CNLiveQrCodeServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(CNLiveQrCodeServiceProtocol)]; | |
| 135 | + [service pushToMyQrCodeController:NO]; | |
| 136 | + } | |
| 137 | + break; | |
| 138 | + default: | |
| 139 | + { | |
| 140 | + CNLiveInfoUpdateController *vc = [[CNLiveInfoUpdateController alloc]initWithModel:model]; | |
| 141 | + [self.navigationController pushViewController:vc animated:YES]; | |
| 142 | + } | |
| 143 | + break; | |
| 144 | + } | |
| 145 | +} | |
| 146 | + | |
| 147 | +#pragma mark - 监听 | |
| 148 | +// 更新用户信息 | |
| 149 | +- (void)userInfoUpdateNotification:(NSNotification *)noti{ | |
| 150 | + //使用userInfo处理消息 | |
| 151 | + NSDictionary *dic = [noti userInfo]; | |
| 152 | + CNLiveUserInfoDataType dataType = [[dic objectForKey:@"dataType"] integerValue]; | |
| 153 | + NSString *info = [dic objectForKey:@"info"]; | |
| 154 | + | |
| 155 | + // 更新cell展示信息 | |
| 156 | + for(CNLiveUserInfoModel *model in self.data){ | |
| 157 | + if(dataType == model.dataType){ | |
| 158 | + model.info = info; | |
| 159 | + break; | |
| 160 | + } | |
| 161 | + } | |
| 162 | + [self.tableView reloadData]; | |
| 163 | + | |
| 164 | +} | |
| 165 | + | |
| 166 | +#pragma mark - 懒加载 | |
| 167 | +- (CNLiveNavigationBar *)navigationBar { | |
| 168 | + if (!_navigationBar) { | |
| 169 | + _navigationBar = [CNLiveNavigationBar navigationBar]; | |
| 170 | + _navigationBar.title.text = @"个人资料"; | |
| 171 | + __weak typeof(self) weakSelf = self; | |
| 172 | + _navigationBar.onClickLeftButton = ^{ | |
| 173 | + [weakSelf goBack]; | |
| 174 | + }; | |
| 175 | + } | |
| 176 | + return _navigationBar; | |
| 177 | +} | |
| 178 | + | |
| 179 | +- (NSMutableArray *)data { | |
| 180 | + if (!_data) { | |
| 181 | + _data = [NSMutableArray array]; | |
| 182 | + } | |
| 183 | + return _data; | |
| 184 | +} | |
| 185 | + | |
| 186 | +- (UITableView *)tableView{ | |
| 187 | + if(!_tableView){ | |
| 188 | + _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, NavigationContentTop, SCREEN_WIDTH, SCREEN_HEIGHT-NavigationContentTop) style:UITableViewStylePlain]; | |
| 189 | + _tableView.delegate = self; | |
| 190 | + _tableView.dataSource = self; | |
| 191 | + _tableView.bounces = NO; | |
| 192 | + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; | |
| 193 | + _tableView.backgroundColor = [UIColor whiteColor]; | |
| 194 | + _tableView.estimatedRowHeight = 0; | |
| 195 | + _tableView.estimatedSectionHeaderHeight = 0; | |
| 196 | + _tableView.estimatedSectionFooterHeight = 0; | |
| 197 | + [_tableView registerClass:[CNLiveUserInfoCell class] forCellReuseIdentifier:kCNLiveUserInfoCell]; | |
| 198 | + } | |
| 199 | + return _tableView; | |
| 200 | +} | |
| 201 | + | |
| 202 | +#pragma mark - 响应方法 | |
| 203 | +- (void)goBack { | |
| 204 | + if (self.presentingViewController != nil) { | |
| 205 | + [self dismissViewControllerAnimated:YES completion:nil]; | |
| 206 | + } | |
| 207 | + else { | |
| 208 | + [self.navigationController popViewControllerAnimated:YES]; | |
| 209 | + } | |
| 210 | +} | |
| 211 | + | |
| 212 | +@end | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveUserInfoModel.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | + | |
| 13 | +typedef NS_ENUM(NSInteger, CNLiveUserInfoLayoutType) { | |
| 14 | + CNLiveUserInfoLayoutTypeDefault = 0, | |
| 15 | + CNLiveUserInfoLayoutTypeText = 1, | |
| 16 | + CNLiveUserInfoLayoutTypeImage = 2 | |
| 17 | +}; | |
| 18 | + | |
| 19 | +typedef NS_ENUM(NSInteger, CNLiveUserInfoDataType) { | |
| 20 | + CNLiveUserInfoDataTypeNickname = 0, | |
| 21 | + CNLiveUserInfoDataTypeHeader = 1, | |
| 22 | + CNLiveUserInfoDataTypeGender = 2, | |
| 23 | + CNLiveUserInfoDataTypeCode = 3, | |
| 24 | + CNLiveUserInfoDataTypeAddress = 4, | |
| 25 | + CNLiveUserInfoDataTypeIntroduction = 5 | |
| 26 | + | |
| 27 | +}; | |
| 28 | + | |
| 29 | + | |
| 30 | +@interface CNLiveUserInfoModel : NSObject | |
| 31 | +@property (nonatomic, copy) NSString *title; | |
| 32 | +@property (nonatomic, copy) NSString *info; | |
| 33 | +@property (nonatomic, copy) NSString *layout; | |
| 34 | +@property (nonatomic, copy) NSString *data; | |
| 35 | + | |
| 36 | +@property (nonatomic, assign) CNLiveUserInfoLayoutType layoutType; | |
| 37 | +@property (nonatomic, assign) CNLiveUserInfoDataType dataType; | |
| 38 | + | |
| 39 | +@property (nonatomic, assign) CGFloat height; | |
| 40 | +@property (nonatomic, assign) CGFloat lineHeight; | |
| 41 | + | |
| 42 | +@end | |
| 43 | + | |
| 44 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveUserInfoModel.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveBMineController.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveUserInfoModel.h" | |
| 10 | + | |
| 11 | +@implementation CNLiveUserInfoModel | |
| 12 | +- (CNLiveUserInfoLayoutType)layoutType{ | |
| 13 | + if([self.layout isEqualToString:@"0"]){ | |
| 14 | + return CNLiveUserInfoLayoutTypeDefault; | |
| 15 | + } | |
| 16 | + else if([self.layout isEqualToString:@"1"]){ | |
| 17 | + return CNLiveUserInfoLayoutTypeText; | |
| 18 | + | |
| 19 | + } | |
| 20 | + else if([self.layout isEqualToString:@"2"]){ | |
| 21 | + return CNLiveUserInfoLayoutTypeImage; | |
| 22 | + | |
| 23 | + } | |
| 24 | + return CNLiveUserInfoLayoutTypeDefault; | |
| 25 | +} | |
| 26 | + | |
| 27 | +- (CNLiveUserInfoDataType)dataType{ | |
| 28 | + if([self.data isEqualToString:@"0"]){ | |
| 29 | + return CNLiveUserInfoDataTypeHeader; | |
| 30 | + } | |
| 31 | + else if([self.data isEqualToString:@"1"]){ | |
| 32 | + return CNLiveUserInfoDataTypeNickname; | |
| 33 | + | |
| 34 | + } | |
| 35 | + else if([self.data isEqualToString:@"2"]){ | |
| 36 | + return CNLiveUserInfoDataTypeGender; | |
| 37 | + | |
| 38 | + } | |
| 39 | + else if([self.data isEqualToString:@"3"]){ | |
| 40 | + return CNLiveUserInfoDataTypeCode; | |
| 41 | + | |
| 42 | + } | |
| 43 | + else if([self.data isEqualToString:@"4"]){ | |
| 44 | + return CNLiveUserInfoDataTypeAddress; | |
| 45 | + | |
| 46 | + } | |
| 47 | + else if([self.data isEqualToString:@"5"]){ | |
| 48 | + return CNLiveUserInfoDataTypeIntroduction; | |
| 49 | + | |
| 50 | + } | |
| 51 | + return CNLiveUserInfoDataTypeNickname; | |
| 52 | +} | |
| 53 | + | |
| 54 | +@end | ... | ... |
CNLiveBMineModule/Classes/UserInfo/CNLiveUserInfoNotification.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveUserInfoNotification.m | |
| 3 | +// CNLiveBMineModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | +#import "CNLiveUserInfoModel.h" | |
| 11 | + | |
| 12 | +NS_ASSUME_NONNULL_BEGIN | |
| 13 | +extern NSString * const kCNLiveUserInfoUpdateNotification; | |
| 14 | + | |
| 15 | +@interface CNLiveUserInfoNotification : NSObject | |
| 16 | ++ (void)postUserInfoUpdateNotificationType:(CNLiveUserInfoDataType)type info:(id)info; | |
| 17 | +//NSDictionary *dic = @{@"type":@(type),@"info":info}; | |
| 18 | ++ (void)addUserInfoUpdateObserver:(id)observer selector:(SEL)selector; | |
| 19 | + | |
| 20 | ++ (void)removeObserver:(id)observer; | |
| 21 | + | |
| 22 | +@end | |
| 23 | + | |
| 24 | +NS_ASSUME_NONNULL_END | ... | ... |