更新信息:完善功能集合页以及相关View内容,新建Feeback页
This commit is contained in:
parent
db9e06d91c
commit
2098919d41
294
SwiftProject/Pods/Pods.xcodeproj/xcuserdata/zhou.xcuserdatad/xcschemes/xcschememanagement.plist
generated
Normal file
294
SwiftProject/Pods/Pods.xcodeproj/xcuserdata/zhou.xcuserdatad/xcschemes/xcschememanagement.plist
generated
Normal file
@ -0,0 +1,294 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SchemeUserState</key>
|
||||
<dict>
|
||||
<key>Alamofire.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>42</integer>
|
||||
</dict>
|
||||
<key>BoringSSL-GRPC-openssl_grpc.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>20</integer>
|
||||
</dict>
|
||||
<key>BoringSSL-GRPC.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>12</integer>
|
||||
</dict>
|
||||
<key>DeviceKit.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>11</integer>
|
||||
</dict>
|
||||
<key>FBSDKCoreKit.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>22</integer>
|
||||
</dict>
|
||||
<key>FacebookCore.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>10</integer>
|
||||
</dict>
|
||||
<key>Firebase.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>26</integer>
|
||||
</dict>
|
||||
<key>FirebaseAnalytics.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>49</integer>
|
||||
</dict>
|
||||
<key>FirebaseAppCheckInterop.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>38</integer>
|
||||
</dict>
|
||||
<key>FirebaseAuth-FirebaseAuth_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>31</integer>
|
||||
</dict>
|
||||
<key>FirebaseAuth.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>43</integer>
|
||||
</dict>
|
||||
<key>FirebaseCore-FirebaseCore_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>29</integer>
|
||||
</dict>
|
||||
<key>FirebaseCore.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>51</integer>
|
||||
</dict>
|
||||
<key>FirebaseCoreExtension-FirebaseCoreExtension_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>50</integer>
|
||||
</dict>
|
||||
<key>FirebaseCoreExtension.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>5</integer>
|
||||
</dict>
|
||||
<key>FirebaseCoreInternal-FirebaseCoreInternal_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>23</integer>
|
||||
</dict>
|
||||
<key>FirebaseCoreInternal.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>FirebaseCrashlytics-FirebaseCrashlytics_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>41</integer>
|
||||
</dict>
|
||||
<key>FirebaseCrashlytics.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>35</integer>
|
||||
</dict>
|
||||
<key>FirebaseFirestore-FirebaseFirestore_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>6</integer>
|
||||
</dict>
|
||||
<key>FirebaseFirestore.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>56</integer>
|
||||
</dict>
|
||||
<key>FirebaseFirestoreInternal-FirebaseFirestoreInternal_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>54</integer>
|
||||
</dict>
|
||||
<key>FirebaseFirestoreInternal.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>32</integer>
|
||||
</dict>
|
||||
<key>FirebaseInstallations-FirebaseInstallations_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>47</integer>
|
||||
</dict>
|
||||
<key>FirebaseInstallations.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>13</integer>
|
||||
</dict>
|
||||
<key>FirebaseRemoteConfigInterop.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>37</integer>
|
||||
</dict>
|
||||
<key>FirebaseSessions.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>36</integer>
|
||||
</dict>
|
||||
<key>FirebaseSharedSwift.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>39</integer>
|
||||
</dict>
|
||||
<key>GTMSessionFetcher-GTMSessionFetcher_Core_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>7</integer>
|
||||
</dict>
|
||||
<key>GTMSessionFetcher.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>16</integer>
|
||||
</dict>
|
||||
<key>GoogleAppMeasurement.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>21</integer>
|
||||
</dict>
|
||||
<key>GoogleDataTransport-GoogleDataTransport_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>17</integer>
|
||||
</dict>
|
||||
<key>GoogleDataTransport.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>24</integer>
|
||||
</dict>
|
||||
<key>GoogleUtilities-GoogleUtilities_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>34</integer>
|
||||
</dict>
|
||||
<key>GoogleUtilities.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>15</integer>
|
||||
</dict>
|
||||
<key>Kingfisher-Kingfisher.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>57</integer>
|
||||
</dict>
|
||||
<key>Kingfisher.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>28</integer>
|
||||
</dict>
|
||||
<key>LLCycleScrollView.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>4</integer>
|
||||
</dict>
|
||||
<key>Pods-SwiftProject.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>45</integer>
|
||||
</dict>
|
||||
<key>PromisesObjC-FBLPromises_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>30</integer>
|
||||
</dict>
|
||||
<key>PromisesObjC.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>33</integer>
|
||||
</dict>
|
||||
<key>PromisesSwift-Promises_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>25</integer>
|
||||
</dict>
|
||||
<key>PromisesSwift.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>8</integer>
|
||||
</dict>
|
||||
<key>RecaptchaInterop.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>19</integer>
|
||||
</dict>
|
||||
<key>SVProgressHUD.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>46</integer>
|
||||
</dict>
|
||||
<key>SnapKit.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>52</integer>
|
||||
</dict>
|
||||
<key>TZImagePickerController.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>40</integer>
|
||||
</dict>
|
||||
<key>abseil.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>9</integer>
|
||||
</dict>
|
||||
<key>gRPC-C++-gRPCCertificates-Cpp.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>18</integer>
|
||||
</dict>
|
||||
<key>gRPC-C++-grpcpp.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<key>gRPC-C++.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>14</integer>
|
||||
</dict>
|
||||
<key>gRPC-Core-grpc.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>53</integer>
|
||||
</dict>
|
||||
<key>gRPC-Core.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>3</integer>
|
||||
</dict>
|
||||
<key>leveldb-library-leveldb_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>27</integer>
|
||||
</dict>
|
||||
<key>leveldb-library.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>48</integer>
|
||||
</dict>
|
||||
<key>nanopb-nanopb_Privacy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>44</integer>
|
||||
</dict>
|
||||
<key>nanopb.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>55</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -106,9 +106,10 @@
|
||||
AF2121092B4EA7E200400B7F /* CCRequestDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF2121082B4EA7E200400B7F /* CCRequestDefine.swift */; };
|
||||
AF21210B2B4EA7FE00400B7F /* CCRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF21210A2B4EA7FE00400B7F /* CCRequest.swift */; };
|
||||
AF21210D2B4EA86700400B7F /* RootData.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF21210C2B4EA86700400B7F /* RootData.swift */; };
|
||||
AF478B032B577D51005C35A5 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF478B022B577D51005C35A5 /* AVFoundation.framework */; };
|
||||
AFD9F5932B58C34A008716DE /* ImageProcessingShaders.metal in Sources */ = {isa = PBXBuildFile; fileRef = AFD9F5922B58C34A008716DE /* ImageProcessingShaders.metal */; };
|
||||
AFD9F5952B58D029008716DE /* MetalPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFD9F5942B58D029008716DE /* MetalPlayer.swift */; };
|
||||
CBBE190C2BC929F50095F6C4 /* FeedBackVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBBE190B2BC929F50095F6C4 /* FeedBackVC.swift */; };
|
||||
CBC8BFBA2BC9082700FC49CC /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF478B022B577D51005C35A5 /* AVFoundation.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
@ -220,6 +221,7 @@
|
||||
AF478B022B577D51005C35A5 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
|
||||
AFD9F5922B58C34A008716DE /* ImageProcessingShaders.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; path = ImageProcessingShaders.metal; sourceTree = "<group>"; };
|
||||
AFD9F5942B58D029008716DE /* MetalPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetalPlayer.swift; sourceTree = "<group>"; };
|
||||
CBBE190B2BC929F50095F6C4 /* FeedBackVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedBackVC.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -227,9 +229,9 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
AF478B032B577D51005C35A5 /* AVFoundation.framework in Frameworks */,
|
||||
00EB2D052BA2D59000924D84 /* MessageUI.framework in Frameworks */,
|
||||
009DFB032BC63AF0007B56E8 /* CoreImage.framework in Frameworks */,
|
||||
CBC8BFBA2BC9082700FC49CC /* AVFoundation.framework in Frameworks */,
|
||||
1E277B76988DF1691E8E5A49 /* Pods_SwiftProject.framework in Frameworks */,
|
||||
006B61D32BBAA938003FCB49 /* StoreKit.framework in Frameworks */,
|
||||
AF2120D42B4E99FA00400B7F /* MobileCoreServices.framework in Frameworks */,
|
||||
@ -317,6 +319,7 @@
|
||||
children = (
|
||||
009DFB102BC8E2E9007B56E8 /* MenuVC.swift */,
|
||||
009DFB122BC8EA90007B56E8 /* MenuVCCell.swift */,
|
||||
CBBE190B2BC929F50095F6C4 /* FeedBackVC.swift */,
|
||||
);
|
||||
path = MenuVC;
|
||||
sourceTree = "<group>";
|
||||
@ -812,6 +815,7 @@
|
||||
006B61DE2BBCFB45003FCB49 /* CustomSheetCell.swift in Sources */,
|
||||
1EFB8C782B88E2F600C72119 /* UIColor+CCExtension.swift in Sources */,
|
||||
00D33BF62B99A19900604A44 /* SpatialVideoConvertor.swift in Sources */,
|
||||
CBBE190C2BC929F50095F6C4 /* FeedBackVC.swift in Sources */,
|
||||
AF2120EE2B4EA34E00400B7F /* BaseTableViewPlainController.swift in Sources */,
|
||||
1E1EA28C2B93272700A5D5D2 /* CCSpatialDisplayTypeView.swift in Sources */,
|
||||
AF2120C62B4E95DA00400B7F /* UIView+Add.swift in Sources */,
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SchemeUserState</key>
|
||||
<dict>
|
||||
<key>SwiftProject.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
BIN
SwiftProject/SwiftProject.xcworkspace/xcuserdata/zhou.xcuserdatad/UserInterfaceState.xcuserstate
generated
Normal file
BIN
SwiftProject/SwiftProject.xcworkspace/xcuserdata/zhou.xcuserdatad/UserInterfaceState.xcuserstate
generated
Normal file
Binary file not shown.
@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SchemeUserState</key>
|
||||
<dict>
|
||||
<key>Promises (Playground) 1.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>59</integer>
|
||||
</dict>
|
||||
<key>Promises (Playground) 2.xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>60</integer>
|
||||
</dict>
|
||||
<key>Promises (Playground).xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>58</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -0,0 +1,22 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "_@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "_@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
SwiftProject/SwiftProject/Assets.xcassets/ProblemSuggestion description'logo.imageset/_@2x.png
vendored
Normal file
BIN
SwiftProject/SwiftProject/Assets.xcassets/ProblemSuggestion description'logo.imageset/_@2x.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 553 B |
BIN
SwiftProject/SwiftProject/Assets.xcassets/ProblemSuggestion description'logo.imageset/_@3x.png
vendored
Normal file
BIN
SwiftProject/SwiftProject/Assets.xcassets/ProblemSuggestion description'logo.imageset/_@3x.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 877 B |
@ -0,0 +1,233 @@
|
||||
//
|
||||
// FeedBackVC.swift
|
||||
// SwiftProject
|
||||
//
|
||||
// Created by Mr.Zhou on 2024/4/12.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class FeedBackVC: BaseController, UITextViewDelegate, UITextFieldDelegate {
|
||||
//问题意见标题Label
|
||||
private lazy var problemTitleLabel:UILabel = setLabel(NSLocalizedString("v1.5_problem/suggestion title", comment: ""), color: .init(r: 255, g: 255, b: 255, a: 0.8), font: .systemFont(ofSize: 16, weight: .medium))
|
||||
//问题意见文本框
|
||||
private lazy var problemTextView:UITextView = {
|
||||
let textView:UITextView = .init()
|
||||
textView.textColor = .white
|
||||
textView.font = .systemFont(ofSize: 14, weight: .medium)
|
||||
textView.text = ""
|
||||
textView.backgroundColor = .clear
|
||||
textView.delegate = self
|
||||
return textView
|
||||
}()
|
||||
//问题意见占位字符
|
||||
private lazy var problemPlaceholderLabel:UILabel = setLabel(NSLocalizedString("v1.5_problem/suggestion placeholder", comment: ""), color: .init(r: 255, g: 255, b: 255, a: 0.6), font: .systemFont(ofSize: 14, weight: .medium))
|
||||
//1号计数Label
|
||||
private lazy var oneNumbersLabel:UILabel = setLabel("0/500", color: .init(r: 255, g: 255, b: 255, a: 0.5), font: .systemFont(ofSize: 14, weight: .medium))
|
||||
//问联系信息标题Label
|
||||
private lazy var contactTitleLabel:UILabel = setLabel(NSLocalizedString("v1.5_contact information title", comment: ""), color: .init(r: 255, g: 255, b: 255, a: 0.8), font: .systemFont(ofSize: 16, weight: .medium))
|
||||
|
||||
//联系信息输入框
|
||||
private lazy var contactTextField:UITextField = {
|
||||
let textField:UITextField = .init()
|
||||
textField.text = ""
|
||||
textField.textColor = .white
|
||||
textField.font = .systemFont(ofSize: 14, weight: .medium)
|
||||
textField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("v1.5_contact information placeholder", comment: ""), attributes: [.foregroundColor:UIColor(r: 255, g: 255, b: 255, a: 0.6), .font:UIFont.systemFont(ofSize: 14, weight: .medium)])
|
||||
textField.borderStyle = .none
|
||||
textField.delegate = self
|
||||
return textField
|
||||
}()
|
||||
//二号计数Label
|
||||
private lazy var twoNumbersLabel:UILabel = setLabel("0/30", color: .init(r: 255, g: 255, b: 255, a: 0.5), font: .systemFont(ofSize: 14, weight: .medium))
|
||||
//提交按钮
|
||||
private lazy var submitButton:UIButton = {
|
||||
let btn = UIButton()
|
||||
btn.setTitle(NSLocalizedString("v1.5_submit", comment: ""), for: .normal)
|
||||
btn.setTitle(NSLocalizedString("v1.5_submit", comment: ""), for: .disabled)
|
||||
btn.setTitleColor(.init(r: 255, g: 255, b: 255, a: 0.6), for: .disabled)
|
||||
btn.setTitleColor(.white, for: .normal)
|
||||
btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium)
|
||||
btn.addTarget(self, action: #selector(submitClick(_ :)), for: .touchUpInside)
|
||||
//不可选中颜色
|
||||
btn.backgroundColor = .init(r: 42, g: 42, b: 42, a: 1)
|
||||
btn.layer.masksToBounds = true
|
||||
btn.layer.cornerRadius = 12
|
||||
|
||||
return btn
|
||||
}()
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
navLine?.isHidden = true
|
||||
setLeftOneBtnImg(imgStr: "menuvc_backbtn")
|
||||
leftBtn1?.addTarget(self, action: #selector(popVC(_ :)), for: .touchUpInside)
|
||||
self.view.backgroundColor = UIColor(r: 6, g: 5, b: 7, a: 1)
|
||||
//设置标题
|
||||
titleLab?.isHidden = false
|
||||
setNavgaionTitle(string: NSLocalizedString("v1.5_feedback", comment: ""))
|
||||
setNavgationTitleAttribute(font: .systemFont(ofSize: 18, weight: .medium), color: .white)
|
||||
configureUI()
|
||||
}
|
||||
|
||||
//生成label
|
||||
private func setLabel(_ text:String, color:UIColor, font:UIFont) -> UILabel {
|
||||
let label = UILabel()
|
||||
label.text = text
|
||||
label.textColor = color
|
||||
label.font = font
|
||||
label.numberOfLines = 0
|
||||
return label
|
||||
}
|
||||
//配置UI
|
||||
private func configureUI() {
|
||||
//配置问题/意见View
|
||||
let problemView = problemView()
|
||||
view.addSubview(problemView)
|
||||
problemView.snp.makeConstraints { make in
|
||||
make.centerX.equalToSuperview()
|
||||
make.top.equalToSuperview().offset(145)
|
||||
make.width.equalTo(345)
|
||||
make.height.equalTo(120)
|
||||
}
|
||||
view.addSubview(problemTitleLabel)
|
||||
problemTitleLabel.snp.makeConstraints { make in
|
||||
make.left.equalTo(problemView.snp.left).offset(12)
|
||||
make.bottom.equalTo(problemView.snp.top).offset(-12)
|
||||
}
|
||||
let imageView = UIImageView(image: .init(named: "ProblemSuggestion description'logo"))
|
||||
view.addSubview(imageView)
|
||||
imageView.snp.makeConstraints { make in
|
||||
make.top.equalTo(problemTitleLabel)
|
||||
make.left.equalTo(problemTitleLabel.snp.right)
|
||||
}
|
||||
//配置联系我们View
|
||||
let contactView = contactView()
|
||||
view.addSubview(contactView)
|
||||
contactView.snp.makeConstraints { make in
|
||||
make.centerX.equalToSuperview()
|
||||
make.top.equalTo(problemView.snp.bottom).offset(72)
|
||||
make.width.equalTo(345)
|
||||
make.height.equalTo(56)
|
||||
}
|
||||
view.addSubview(contactTitleLabel)
|
||||
contactTitleLabel.snp.makeConstraints { make in
|
||||
make.left.equalTo(problemTitleLabel)
|
||||
make.bottom.equalTo(contactView.snp.top).offset(-10)
|
||||
}
|
||||
//添加提交按钮
|
||||
view.addSubview(submitButton)
|
||||
submitButton.snp.makeConstraints { make in
|
||||
make.centerX.equalToSuperview()
|
||||
make.bottom.equalToSuperview().offset(-52)
|
||||
make.width.equalTo(345)
|
||||
make.height.equalTo(54)
|
||||
}
|
||||
}
|
||||
//生成问题意见View
|
||||
private func problemView() -> UIView {
|
||||
let bgView = UIView()
|
||||
bgView.backgroundColor = .init(r: 29, g: 29, b: 29, a: 1)
|
||||
bgView.layer.masksToBounds = true
|
||||
bgView.layer.cornerRadius = 12
|
||||
bgView.addSubview(problemTextView)
|
||||
problemTextView.snp.makeConstraints { make in
|
||||
make.top.left.equalToSuperview().offset(12)
|
||||
make.right.equalToSuperview().offset(-12)
|
||||
make.height.equalTo(72)
|
||||
}
|
||||
bgView.addSubview(problemPlaceholderLabel)
|
||||
problemTitleLabel.snp.makeConstraints { make in
|
||||
make.top.left.right.equalTo(problemTextView)
|
||||
}
|
||||
bgView.addSubview(oneNumbersLabel)
|
||||
oneNumbersLabel.snp.makeConstraints { make in
|
||||
make.right.bottom.equalToSuperview().offset(-12)
|
||||
}
|
||||
return bgView
|
||||
}
|
||||
//生成联系我们View
|
||||
private func contactView() -> UIView {
|
||||
let bgView = UIView()
|
||||
bgView.backgroundColor = .init(r: 29, g: 29, b: 29, a: 1)
|
||||
bgView.layer.masksToBounds = true
|
||||
bgView.layer.cornerRadius = 8
|
||||
bgView.addSubview(twoNumbersLabel)
|
||||
twoNumbersLabel.snp.makeConstraints { make in
|
||||
make.centerY.equalToSuperview()
|
||||
make.right.equalToSuperview().offset(-12)
|
||||
}
|
||||
bgView.addSubview(contactTextField)
|
||||
contactTextField.snp.makeConstraints { make in
|
||||
make.centerY.equalToSuperview()
|
||||
make.left.equalToSuperview().offset(12)
|
||||
make.right.equalToSuperview().offset(-42)
|
||||
}
|
||||
return bgView
|
||||
}
|
||||
//MARK: - textField And textView
|
||||
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
|
||||
let text = (textField.text! as NSString).replacingCharacters(in: range, with: string)
|
||||
guard text.count <= 30 else {
|
||||
twoNumbersLabel.text = "30/30"
|
||||
return false
|
||||
}
|
||||
twoNumbersLabel.text = "\(text.count)/30"
|
||||
return true
|
||||
}
|
||||
func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
|
||||
self.problemPlaceholderLabel.isHidden = true // 隐藏
|
||||
return true
|
||||
}
|
||||
func textViewDidBeginEditing(_ textView: UITextView) {
|
||||
|
||||
}
|
||||
func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
|
||||
return true
|
||||
}
|
||||
func textViewDidEndEditing(_ textView: UITextView) {
|
||||
if textView.text.isEmpty {
|
||||
self.problemPlaceholderLabel.isHidden = false // 显示
|
||||
}
|
||||
else{
|
||||
self.problemPlaceholderLabel.isHidden = true // 隐藏
|
||||
}
|
||||
}
|
||||
func textViewDidChange(_ textView: UITextView) {
|
||||
|
||||
}
|
||||
//获取textView字符内容
|
||||
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
|
||||
let str = (textView.text! as NSString).replacingCharacters(in: range, with: text)
|
||||
guard text.count <= 500 else {
|
||||
oneNumbersLabel.text = "500/500"
|
||||
submitButton.isEnabled = true
|
||||
submitButton.backgroundColor = .init(r: 83, g: 38, b: 214, a: 1)
|
||||
return false
|
||||
}
|
||||
if text.count >= 5 {
|
||||
submitButton.isEnabled = true
|
||||
submitButton.backgroundColor = .init(r: 83, g: 38, b: 214, a: 1)
|
||||
}else {
|
||||
submitButton.isEnabled = false
|
||||
submitButton.backgroundColor = .init(r: 42, g: 42, b: 42, a: 1)
|
||||
}
|
||||
oneNumbersLabel.text = "\(text.count)/500"
|
||||
return true
|
||||
}
|
||||
//pop回上一个控制器
|
||||
@objc private func popVC(_ sender:UIButton) {
|
||||
navigationController?.popViewController(animated: true)
|
||||
}
|
||||
//提交
|
||||
@objc private func submitClick(_ sender:UIButton) {
|
||||
//获取
|
||||
let probleText = problemTextView.text
|
||||
let contact = contactTextField.text
|
||||
//获取设备唯一标识
|
||||
|
||||
//上传用户反馈的内容
|
||||
|
||||
//pop退出页面
|
||||
navigationController?.popViewController(animated: true)
|
||||
}
|
||||
}
|
||||
@ -11,18 +11,13 @@ import Firebase
|
||||
class MenuVC: BaseController,UITableViewDelegate,UITableViewDataSource {
|
||||
|
||||
static let kMenuVCCell_identifier = "kMenuVCCell_identifier"
|
||||
var dataSource:[[[String:String]]] {
|
||||
var dataSource:[[[String:Any]]]{
|
||||
get {
|
||||
return [[["image":"icon","title":NSLocalizedString("Share VPCamera", comment: "")],
|
||||
["image":"icon","title":NSLocalizedString("Feedback", comment: "")]],
|
||||
[["image":"icon","title":NSLocalizedString("Privacy Policy", comment: "")],
|
||||
["image":"icon","title":NSLocalizedString("Terms of Service", comment: "")]],
|
||||
[["image":"icon","title":NSLocalizedString("WeChat", comment: "")],
|
||||
["image":"icon","title":NSLocalizedString("Tencent QQ", comment: "")],
|
||||
["image":"icon","title":NSLocalizedString("Telegram", comment: "")],
|
||||
["image":"icon","title":NSLocalizedString("Share VPCamera", comment: "")]]]
|
||||
[getDatasourceOneSection(), getDatasourceTwoSection(), getDatasourceThreeSection()]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
self.configureUI()
|
||||
@ -62,9 +57,10 @@ class MenuVC: BaseController,UITableViewDelegate,UITableViewDataSource {
|
||||
make.left.right.equalToSuperview()
|
||||
make.height.equalTo(162)
|
||||
}
|
||||
|
||||
//创建一个底部View(内置一个tableView)
|
||||
let bottomView = buttomView()
|
||||
self.view.addSubview(bottomView)
|
||||
//覆盖主视图下半部分
|
||||
bottomView.snp.makeConstraints { make in
|
||||
make.left.right.equalToSuperview()
|
||||
make.bottom.equalToSuperview().offset(-20)
|
||||
@ -109,47 +105,141 @@ class MenuVC: BaseController,UITableViewDelegate,UITableViewDataSource {
|
||||
|
||||
func buttomView() -> UIView {
|
||||
let bgView = UIView()
|
||||
//创建tableView
|
||||
let tableView = UITableView(frame: .zero, style: .insetGrouped)
|
||||
//注册cell
|
||||
tableView.register(MenuVCCell.classForCoder(), forCellReuseIdentifier: MenuVC.kMenuVCCell_identifier)
|
||||
//将tableView添加入bgView
|
||||
bgView.addSubview(tableView)
|
||||
//tableView全覆盖
|
||||
tableView.snp.makeConstraints { make in
|
||||
make.left.top.bottom.right.equalToSuperview()
|
||||
make.top.bottom.equalToSuperview()
|
||||
make.left.equalToSuperview().offset(24)
|
||||
make.right.equalToSuperview().offset(-24)
|
||||
}
|
||||
tableView.backgroundColor = .red
|
||||
//实现tableView数据源和代理
|
||||
tableView.dataSource = self
|
||||
tableView.delegate = self
|
||||
//颜色为透明
|
||||
tableView.backgroundColor = .clear
|
||||
return bgView
|
||||
}
|
||||
|
||||
@objc func dismissVC(sender:UIButton) {
|
||||
self.dismiss(animated: true)
|
||||
}
|
||||
|
||||
|
||||
|
||||
//MARK: - TableViewDelegate and DataSource
|
||||
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
return 0
|
||||
//数据源第一组(Share VPCamera And Feedback),key值为image、title
|
||||
private func getDatasourceOneSection () -> [[String:Any]] {
|
||||
return [
|
||||
["image":UIImage(named: "")!, "title":NSLocalizedString("v1.5_share vpcamera", comment: "")],
|
||||
["image":UIImage(named: "")!, "title":NSLocalizedString("v1.5_feedback", comment: "")]
|
||||
]
|
||||
}
|
||||
//数据源第二组(Privacy Policy And Terms of Service),key值为image、title
|
||||
private func getDatasourceTwoSection () -> [[String:Any]] {
|
||||
return [
|
||||
["image":UIImage(named: "")!, "title":NSLocalizedString("v1.5_privacy policy", comment: "")],
|
||||
["image":UIImage(named: "")!, "title":NSLocalizedString("v1.5_terms of service", comment: "")]
|
||||
]
|
||||
}
|
||||
//数据源第三组,网络获取,key值为 image、title、url
|
||||
private func getDatasourceThreeSection () -> [[String:Any]] {
|
||||
let url = URL(string: "XXXXXX")
|
||||
|
||||
return [
|
||||
["image":UIImage(named: ""), "title":"title", "url":"url"]
|
||||
]
|
||||
}
|
||||
|
||||
//MARK: - TableViewDelegate and DataSource
|
||||
func numberOfSections(in tableView: UITableView) -> Int {
|
||||
return 3
|
||||
return dataSource.count
|
||||
}
|
||||
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
return dataSource[section].count
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
let cell = tableView.dequeueReusableCell(withIdentifier: MenuVC.kMenuVCCell_identifier, for: indexPath)
|
||||
let cell = tableView.dequeueReusableCell(withIdentifier: MenuVC.kMenuVCCell_identifier, for: indexPath) as! MenuVCCell
|
||||
cell.data = dataSource[indexPath.section][indexPath.row]
|
||||
if dataSource[indexPath.section].count == 1 {
|
||||
//这一组只有一行
|
||||
cell.radiusType = .all
|
||||
}else {
|
||||
switch indexPath.row {
|
||||
case 0:
|
||||
cell.radiusType = .top
|
||||
case dataSource[indexPath.section].count - 1:
|
||||
cell.radiusType = .bottom
|
||||
default:
|
||||
cell.radiusType = ._none
|
||||
}
|
||||
}
|
||||
return cell
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
||||
55
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||
|
||||
return 52
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
|
||||
return UIView()
|
||||
let sectionView:UIView = .init(frame: .init(x: 0, y: 0, width: tableView.bounds.width, height: 54))
|
||||
sectionView.backgroundColor = .clear
|
||||
//添加一个Label
|
||||
let titleLabel = UILabel()
|
||||
titleLabel.textColor = .init(r: 255, g: 255, b: 255, a: 0.5)
|
||||
titleLabel.text = section == 2 ? NSLocalizedString("v1.5_contact us", comment: ""):""
|
||||
titleLabel.font = .systemFont(ofSize: 15, weight: .medium)
|
||||
sectionView.addSubview(titleLabel)
|
||||
titleLabel.snp.makeConstraints { make in
|
||||
make.bottom.equalToSuperview().offset(-10)
|
||||
make.left.equalToSuperview()
|
||||
}
|
||||
titleLabel.isHidden = !(section == 2)
|
||||
return sectionView
|
||||
}
|
||||
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
|
||||
switch section {
|
||||
case 0:
|
||||
return 0
|
||||
case dataSource[section].count - 1:
|
||||
return 54
|
||||
default:
|
||||
return 18
|
||||
}
|
||||
}
|
||||
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||
switch indexPath.section {
|
||||
case 0://第一组
|
||||
switch indexPath.row {
|
||||
case 0://Share VPCamera,执行分享
|
||||
//设置分享文本
|
||||
let text = "VPCamera"
|
||||
//分享图片icon
|
||||
let image = UIImage(named: "AppIcon")
|
||||
//设置分享路径
|
||||
let url = URL(string: "")
|
||||
let activityItems = [text,image as Any,url as Any]
|
||||
//弹出分享框
|
||||
let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities:nil)
|
||||
present(activityViewController, animated: true, completion: nil)
|
||||
//分享结束后的回调
|
||||
activityViewController.completionWithItemsHandler = { [weak self] ( activityType, isCompleted, returnedItems, error) -> Void in
|
||||
print(isCompleted ? "Share Success":"Share Failure")
|
||||
}
|
||||
default://反馈
|
||||
let feedVC = FeedBackVC()
|
||||
navigationController?.pushViewController(feedVC, animated: true)
|
||||
}
|
||||
case 1://第二组
|
||||
switch indexPath.row {
|
||||
case 0://Privacy Policy,执行隐私政策
|
||||
break
|
||||
default://Terms of Service, 执行服务条例
|
||||
break
|
||||
}
|
||||
default://跳转组
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -8,29 +8,91 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
class MenuVCCell: UITableViewCell {
|
||||
var limgView:UIImageView?
|
||||
var ltitleLabel:UILabel?
|
||||
//cell圆角类型
|
||||
enum MenuVCCellCornerRadiusType:Int {
|
||||
///没有圆角
|
||||
case _none = 0
|
||||
///上圆角
|
||||
case top = 1
|
||||
///下圆角
|
||||
case bottom = 2
|
||||
///全部圆角
|
||||
case all = 3
|
||||
///对应切除范围
|
||||
var maskcorners:CACornerMask {
|
||||
switch self {
|
||||
case ._none:
|
||||
return []
|
||||
case .top:
|
||||
return [.layerMinXMinYCorner, .layerMaxXMinYCorner]
|
||||
case .bottom:
|
||||
return [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
|
||||
case .all:
|
||||
return [.layerMinXMinYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMaxYCorner]
|
||||
}
|
||||
}
|
||||
///对应圆角度数
|
||||
var corner:CGFloat{
|
||||
switch self {
|
||||
case ._none:
|
||||
return 0
|
||||
default:
|
||||
return 12
|
||||
}
|
||||
}
|
||||
}
|
||||
//当前cell的圆角
|
||||
var radiusType:MenuVCCellCornerRadiusType! {
|
||||
didSet{
|
||||
layer.maskedCorners = radiusType.maskcorners
|
||||
layer.cornerRadius = radiusType.corner
|
||||
}
|
||||
}
|
||||
//展示内容
|
||||
var data:[String:Any]!{
|
||||
didSet{
|
||||
//获取图片
|
||||
iconImageView.image = data["image"] as? UIImage
|
||||
//设置标题
|
||||
titleLabel.text = data["title"] as? String
|
||||
}
|
||||
}
|
||||
|
||||
//icon展示
|
||||
fileprivate lazy var iconImageView:UIImageView = {
|
||||
let imageView:UIImageView = .init()
|
||||
imageView.contentMode = .scaleAspectFill
|
||||
return imageView
|
||||
}()
|
||||
//标题Label
|
||||
fileprivate lazy var titleLabel:UILabel = {
|
||||
let label = UILabel()
|
||||
label.textColor = .white
|
||||
label.font = .systemFont(ofSize: 14, weight: .medium)
|
||||
label.text = "Text"
|
||||
return label
|
||||
}()
|
||||
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
||||
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
||||
self.backgroundColor = UIColor(r: 29, g: 29, b: 29, a: 1)
|
||||
limgView = UIImageView()
|
||||
self.contentView.addSubview(limgView!)
|
||||
ltitleLabel = UILabel()
|
||||
self.contentView.addSubview(ltitleLabel!)
|
||||
|
||||
limgView?.snp.makeConstraints({ make in
|
||||
make.width.height.equalTo(20)
|
||||
backgroundColor = UIColor(r: 29, g: 29, b: 29, a: 1)
|
||||
selectionStyle = .none
|
||||
//设置icon
|
||||
addSubview(iconImageView)
|
||||
iconImageView.snp.makeConstraints { make in
|
||||
make.left.equalTo(16)
|
||||
make.centerY.equalToSuperview()
|
||||
make.left.equalToSuperview().offset(16)
|
||||
})
|
||||
|
||||
ltitleLabel?.snp.makeConstraints {[weak self] make in
|
||||
make.centerY.equalToSuperview()
|
||||
make.left.equalTo((self?.limgView!.snp.right)!).offset(12)
|
||||
make.width.height.equalTo(16)
|
||||
}
|
||||
//设置标题Label
|
||||
addSubview(titleLabel)
|
||||
titleLabel.snp.makeConstraints { make in
|
||||
make.centerY.equalToSuperview()
|
||||
make.left.equalTo(12)
|
||||
make.right.equalToSuperview().offset(-16)
|
||||
}
|
||||
//设置超出范围切除
|
||||
layer.masksToBounds = true
|
||||
|
||||
ltitleLabel!.textColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
|
||||
ltitleLabel!.font = UIFont(name: "PingFangSC-Medium", size: 14)
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
|
||||
@ -139,7 +139,6 @@ extension CCSpatialVideoDisplayController {
|
||||
assetReader?.cancelReading()
|
||||
}
|
||||
assetReader = try! AVAssetReader(asset: self.videoOriginalAsset)
|
||||
|
||||
assetOutput = AVAssetReaderTrackOutput(
|
||||
track: self.assetTrack!,
|
||||
outputSettings: [
|
||||
|
||||
@ -121,3 +121,14 @@
|
||||
"v1.5_praise" = "Praise";
|
||||
"v1.5_negative" = "Negative";
|
||||
"v1.5_feedbackdesc" = "Do you like VPCamera?\nPlease rate a Five star or give a feed\n back to us";
|
||||
//V1.5版本,用于功能集合页
|
||||
"v1.5_share vpcamera" = "Share VPCamera"
|
||||
"v1.5_feedback" = "Feedback"
|
||||
"v1.5_privacy policy" = "Privacy Policy"
|
||||
"v1.5_terms of service" = "Terms of Service"
|
||||
"v1.5_contact us" = "Contact us"
|
||||
"v1.5_problem/suggestion placeholder" = "Please let us kno'w your prablems or suggestions. Our service team will deal with it soon."
|
||||
"v1.5_problem/suggestion title" = "Problem/Suggestion description"
|
||||
"v1.5_contact information placeholder" = "Please @xxxx.com"
|
||||
"v1.5_contact information title" = "Contact information"
|
||||
"v1.5_submit" = "Submit"
|
||||
|
||||
@ -117,7 +117,14 @@
|
||||
"右侧中间键长按3s" = "右侧中间键长按3s";
|
||||
"右侧亮度循环按键" ="右侧亮度循环按键\n长按 3s 切换 HSBS\n长按 7s 切换 FSBS";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//V1.5版本,用于功能集合页
|
||||
"v1.5_share vpcamera" = "分享 VPCamera"
|
||||
"v1.5_feedback" = "反馈意见"
|
||||
"v1.5_privacy policy" = "隐私政策"
|
||||
"v1.5_terms of service" = "服务条款"
|
||||
"v1.5_contact us" = "联系我们"
|
||||
"v1.5_problem/suggestion title" = "问题/建议描述"
|
||||
"v1.5_problem/suggestion placeholder" = "请告知我们您的问题或建议。我们的服务团队将尽快处理。"
|
||||
"v1.5_contact information title" = "联系信息"
|
||||
"v1.5_contact information placeholder" = "请输入 @xxxx.com"
|
||||
"v1.5_submit" = "提交"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user