更新信息:完善功能集合页以及相关View内容,新建Feeback页

This commit is contained in:
Mr.zhou 2024-04-12 18:37:29 +08:00
parent db9e06d91c
commit 2098919d41
14 changed files with 819 additions and 53 deletions

View 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>

View File

@ -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 */,

View File

@ -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>

View File

@ -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>

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 877 B

View File

@ -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))
//1Label
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)
}
}

View File

@ -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)
}
//ViewtableView
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)
//tableViewbgView
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)
}
//Share VPCamera And Feedback,keyimagetitle
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,keyimagetitle
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 imagetitleurl
private func getDatasourceThreeSection () -> [[String:Any]] {
let url = URL(string: "XXXXXX")
//MARK: - TableViewDelegate and DataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 0
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
}
}
}

View File

@ -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) {

View File

@ -139,7 +139,6 @@ extension CCSpatialVideoDisplayController {
assetReader?.cancelReading()
}
assetReader = try! AVAssetReader(asset: self.videoOriginalAsset)
assetOutput = AVAssetReaderTrackOutput(
track: self.assetTrack!,
outputSettings: [

View File

@ -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"

View File

@ -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" = "提交"