Commit 5e494916 authored by David黄金龙's avatar David黄金龙

Merge commit 'efbbafcd' into davidhuang

* commit 'efbbafcd':
  图片选择器弹窗
  // 选择器
  暂存
  // 护照选择器
  地址选择器
  时间选择器
  // 家庭成员信息model 更新
parents ded1848f efbbafcd
This diff is collapsed.
......@@ -141,8 +141,8 @@ extension YHServiceCenterMainViewController : UITableViewDelegate,UITableViewDat
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
printLog("点击了 tableView Cell \(indexPath.row)")
// let vc = YHServiceCenterSecondViewController()
let vc = YHPersonInformMainViewController() //for test hjl
let vc = YHServiceCenterSecondViewController()
// let vc = YHPersonInformMainViewController() //for test hjl
self.navigationController?.pushViewController(vc)
}
......
......@@ -10,7 +10,7 @@ import UIKit
class YHBrotherInfoVC: YHBaseViewController {
var brotherInfo:YHBrother?
var brotherInfo:YHFamilyMember?
var items:[[YHFormItemProtocol]] = [[YHFormItemProtocol]]()
......
......@@ -10,7 +10,7 @@ import UIKit
class YHCertificateViewController: YHBaseViewController {
var spouse:YHSpouse?
var spouse:YHFamilyMember?
var cardInfo: YHCNIdentityCard?
......@@ -42,7 +42,7 @@ class YHCertificateViewController: YHBaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
gk_navTitle = "配偶信息填写".local
gk_navTitle = "证件信息填写".local
createUI()
loadCertificateInfo()
}
......@@ -187,6 +187,31 @@ extension YHCertificateViewController : UITableViewDelegate, UITableViewDataSour
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.section >= items.count { return }
let arr:[YHFormItemProtocol] = items[indexPath.section]
if indexPath.row >= arr.count || indexPath.row < 0 { return }
let item = arr[indexPath.row]
if item is YHFormTitleItem {
return
}
if item is YHFormDetailItem {
let detailItem = item as! YHFormDetailItem
if detailItem.type == .certificateValidDate ||
detailItem.type == .certificateSignDate { // 届满日期 签发日期
YHDatePickView.show(type: .yyyymmdd) { date in
let arr = date.components(separatedBy: YHDatePickView.separator)
// [yyyy, mm, dd] eg ["2024", "01", "20"]
print(date)
}
}
return
}
let vc = YHSpouseBasicInfoVC()
self.navigationController?.pushViewController(vc)
}
......
......@@ -10,7 +10,7 @@ import UIKit
class YHChildBasicInfoVC: YHBaseViewController {
var child:YHChild?
var child:YHFamilyMember?
var cardInfo: YHCNIdentityCard?
......
......@@ -10,7 +10,7 @@ import UIKit
class YHChildInitialInfoVC: YHBaseViewController {
var child:YHChild?
var child:YHFamilyMember?
lazy var items:[[YHFormItemProtocol]] = [[YHFormItemProtocol]]()
......
......@@ -17,7 +17,7 @@ enum YHFormTitleItemEditType:Int {
class YHFamilyMemberFormVC: YHBaseViewController {
var familyMemberInfo: YHFamilyMemberInfo?
var familyMemberInfo: YHFamilyMemberGroupInfo?
var isChildsEditMode: YHFormTitleItemEditType = .none
var isBrothersEditMode: YHFormTitleItemEditType = .none
......@@ -141,7 +141,7 @@ class YHFamilyMemberFormVC: YHBaseViewController {
"is_handled": 0,
"finish_follow": 0,
"step": 0,
"not_fill_num": -1,
"not_fill_num": 7,
"certificates": [],
"is_live_oversea_year": 0
],
......@@ -180,7 +180,7 @@ class YHFamilyMemberFormVC: YHBaseViewController {
"is_handled": 0,
"finish_follow": 0,
"step": 0,
"not_fill_num": -1,
"not_fill_num": 5,
"certificates": [],
"is_live_oversea_year": 0
],
......@@ -269,7 +269,7 @@ class YHFamilyMemberFormVC: YHBaseViewController {
]
] as [String : Any]
familyMemberInfo = YHFamilyMemberInfo.deserialize(dict: dic)
familyMemberInfo = YHFamilyMemberGroupInfo.deserialize(dict: dic)
loadFamilyMember()
}
......@@ -280,6 +280,8 @@ class YHFamilyMemberFormVC: YHBaseViewController {
// 配偶section
if let sponse = familyMemberInfo?.spouse {
// 信息未填写时服务器返回的relation=0
sponse.relation = String(format: "%d", YHFamilyMemberType.spouse.rawValue)
let sponseArray:[YHFormItemProtocol] = [YHFormTitleItem(type: .sponse), sponse]
items.append(sponseArray)
}
......@@ -287,9 +289,13 @@ class YHFamilyMemberFormVC: YHBaseViewController {
// 父母section
var parents = [YHFormItemProtocol]()
if let father = familyMemberInfo?.father {
// 信息未填写时服务器返回的relation=0
father.relation = String(format: "%d", YHFamilyMemberType.father.rawValue)
parents.append(father)
}
if let mother = familyMemberInfo?.mother {
// 信息未填写时服务器返回的relation=0
mother.relation = String(format: "%d", YHFamilyMemberType.mother.rawValue)
parents.append(mother)
}
if !parents.isEmpty {
......@@ -308,6 +314,10 @@ class YHFamilyMemberFormVC: YHBaseViewController {
// 兄妹section
var brotherArr:[YHFormItemProtocol] = [YHFormTitleItem(type: .brother), YHFormAddItem(type: .addBrother)]
if let brothers = familyMemberInfo?.brother, !brothers.isEmpty {
for brother in brothers {
// 信息未填写时服务器返回的relation=0
brother.relation = String(format: "%d", YHFamilyMemberType.brother.rawValue)
}
brotherArr.insert(contentsOf: brothers, at:1)
}
items.append(brotherArr)
......@@ -391,7 +401,7 @@ extension YHFamilyMemberFormVC {
"certificates": []
] as [String : Any]
let brother:YHBrother = YHBrother.deserialize(dict: dict)!
let brother:YHFamilyMember = YHFamilyMember.deserialize(dict: dict)!
if var brothers = familyMemberInfo?.brother {
brothers.append(brother)
......@@ -466,7 +476,7 @@ extension YHFamilyMemberFormVC {
"certificates":[]
] as [String : Any]
let child = YHChild.deserialize(dict: dict)!
let child = YHFamilyMember.deserialize(dict: dict)!
if var childs = familyMemberInfo?.child {
childs.append(child)
familyMemberInfo!.child = childs
......@@ -534,22 +544,26 @@ extension YHFamilyMemberFormVC : UITableViewDelegate, UITableViewDataSource {
}
// 配偶父母子女兄妹具体条目
if item is YHParent || item is YHChild || item is YHSpouse || item is YHBrother {
if item is YHFamilyMember {
let detailItem = item as! YHFamilyMember
let cell = tableView.dequeueReusableCell(withIdentifier: YHFormItemEnterDetailCell.cellReuseIdentifier, for: indexPath) as! YHFormItemEnterDetailCell
cell.title = detailItem.getTitle()
cell.detailLabel.text = String(format: "有%d项未填写".local, detailItem.notFillNum)
cell.isShowDeleteBtn = false
cell.deleteBlock = nil
if item is YHChild || item is YHBrother {
if detailItem.relationType == .child || detailItem.relationType == .brother {
if item is YHChild {
if detailItem.relationType == .child {
cell.isShowDeleteBtn = (isChildsEditMode == .canCancel)
} else if item is YHBrother {
} else if detailItem.relationType == .brother {
cell.isShowDeleteBtn = (isBrothersEditMode == .canCancel)
}
// 删除子女兄妹处理
cell.deleteBlock = { [weak self] in
if item is YHChild {
if detailItem.relationType == .child {
let childCount = self?.familyMemberInfo?.child?.count ?? 0
// 因为子女兄妹section第一行都是标题所以row-1
if (indexPath.row-1 < childCount) {
......@@ -557,7 +571,7 @@ extension YHFamilyMemberFormVC : UITableViewDelegate, UITableViewDataSource {
self?.isChildsEditMode = .none
self?.isBrothersEditMode = .none
}
} else if item is YHBrother {
} else if detailItem.relationType == .brother {
let brotherCount = self?.familyMemberInfo?.brother?.count ?? 0
// 因为子女兄妹section第一行都是标题所以row-1
......@@ -629,12 +643,6 @@ extension YHFamilyMemberFormVC : UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
IQKeyboardManager.shared.enable = true
let caseList = YHFormTitleItemType.allCases.map({ "\($0)" }).joined(separator: ", ")
print(caseList)
let arr = items[indexPath.section]
let item:YHFormItemProtocol = arr[indexPath.row]
......@@ -652,40 +660,40 @@ extension YHFamilyMemberFormVC : UITableViewDelegate, UITableViewDataSource {
}
return
}
// 父母
if item is YHParent {
let parent = item as! YHParent
let vc = YHParentInfoVC()
vc.parentInfo = parent
self.navigationController?.pushViewController(vc)
return
}
// 配偶
if item is YHSpouse {
let spouse = item as! YHSpouse
let vc = YHSpouseInitialInfoVC()
vc.spouse = spouse
self.navigationController?.pushViewController(vc)
return
}
// 子女
if item is YHChild {
let child = item as! YHChild
let vc = YHChildInitialInfoVC()
vc.child = child
self.navigationController?.pushViewController(vc)
return
}
// 兄弟姐妹
if item is YHBrother {
let brother = item as! YHBrother
let vc = YHBrotherInfoVC()
vc.brotherInfo = brother
self.navigationController?.pushViewController(vc)
return
if item is YHFamilyMember {
let detailItem = item as! YHFamilyMember
// 父母
if detailItem.relationType == .father || detailItem.relationType == .mother {
let vc = YHParentInfoVC()
vc.parentInfo = detailItem
self.navigationController?.pushViewController(vc)
return
}
// 配偶
if detailItem.relationType == .spouse {
let vc = YHSpouseInitialInfoVC()
vc.spouse = detailItem
self.navigationController?.pushViewController(vc)
return
}
// 子女
if detailItem.relationType == .child {
let vc = YHChildInitialInfoVC()
vc.child = detailItem
self.navigationController?.pushViewController(vc)
return
}
// 兄弟姐妹
if detailItem.relationType == .brother {
let vc = YHBrotherInfoVC()
vc.brotherInfo = detailItem
self.navigationController?.pushViewController(vc)
return
}
}
}
......
......@@ -10,7 +10,7 @@ import UIKit
class YHParentInfoVC: YHBaseViewController {
var parentInfo: YHParent?
var parentInfo: YHFamilyMember?
var items:[[YHFormItemProtocol]] = [[YHFormItemProtocol]]()
......@@ -72,7 +72,7 @@ class YHParentInfoVC: YHBaseViewController {
// 父母亲信息
var arr1 = [YHFormItemProtocol]()
if parentInfo.sex == -1 { // 父亲
if parentInfo.relationType == .father { // 父亲
let title1:YHFormItemProtocol = YHFormTitleItem(type: .fatherInfo)
let item10:YHFormItemProtocol = YHFormDetailItem(type: .fatherName)
arr1.append(contentsOf: [title1, item10])
......
......@@ -24,7 +24,7 @@ enum HKFormItemCellType: Int {
class YHSpouseBasicInfoVC: YHBaseViewController {
var spouse:YHSpouse?
var spouse:YHFamilyMember?
var cardInfo: YHCNIdentityCard?
......
......@@ -7,10 +7,11 @@
//
import UIKit
import SmartCodable
class YHSpouseInitialInfoVC: YHBaseViewController {
var spouse:YHSpouse?
var spouse:YHFamilyMember?
lazy var items:[[YHFormItemProtocol]] = [[YHFormItemProtocol]]()
......@@ -93,13 +94,32 @@ class YHSpouseInitialInfoVC: YHBaseViewController {
let arr1:[YHFormItemProtocol] = [title1, item10]
// 居住信息
var arr2 = [YHFormItemProtocol]()
let title2 = YHFormTitleItem(type: .liveInfo)
let item20 = YHFormDetailItem(type: .isLiveTother)
item20.isLiveTogether = (spouse.finishFollow == 1)
let item21 = YHFormDetailItem(type: .nationOrArea)
let item22 = YHFormDetailItem(type: .liveCity)
let item23 = YHFormDetailItem(type: .detailAddress)
let arr2:[YHFormItemProtocol] = [title2, item20, item21, item22, item23]
arr2.append(title2)
arr2.append(item20)
if !item20.isLiveTogether { // 不同住 才需填写国家/地区
let item21 = YHFormDetailItem(type: .nationOrArea)
arr2.append(item21)
// 国家/地区已填写 才显示现居住城市和详细地址两行
if let dict = spouse.address {
if dict.peel is [String: Any] {
let dict = dict.peel as! [String: Any]
let address = YHAddress.deserialize(dict: dict)
if address?.area != nil || address?.country != nil {
let item22 = YHFormDetailItem(type: .liveCity)
let item23 = YHFormDetailItem(type: .detailAddress)
arr2.append(item22)
arr2.append(item23)
}
}
}
}
// 港澳通信证
let title3 = YHFormTitleItem(type: .hkAndMacaoPassport)
......
......@@ -6,6 +6,24 @@
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
// 【 用法 Usage】
/*
// (1) 直接传type
YHFormPickerView.show(type: .certificate, selectType: .certificate(.otherStatelessTravelPassport)) { selectType in
// 选择类型的标题
print(selectType.title)
}
// (2) 直接传字符串值
YHFormPickerView.show(type: .certificate, selectTitle: "公务通行证") { selectType in
// 选择类型的标题
print(selectType.title)
}
*/
import UIKit
enum YHFormPickerViewType: Int {
......@@ -21,6 +39,8 @@ enum YHFormPickerViewType: Int {
case occupation = 4
// 性别
case gender = 5
// 证件
case certificate = 6
}
enum YHFormPickerViewSubType {
......@@ -31,54 +51,70 @@ enum YHFormPickerViewSubType {
case education(YHPickerViewEducationType)
case occupation(YHPickerViewOccupationType)
case gender(YHPickerViewGenderType)
case certificate(YHPickerViewCertificateType)
var title:String {
switch self {
case .none:
return "".local
case .marriage(.unmarriage):
return "未婚".local
case .marriage(.marriaged):
return "已婚".local
case .marriage(.separated):
return "分居".local
case .marriage(.divorced):
return "离婚".local
case .marriage(.widowed):
return "丧偶".local
case .degree(.bachelor):
return "学士学位".local
case .degree(.master):
return "硕士学位".local
case .degree(.doctor):
return "博士学位".local
case .none:
return "".local
case .education(.fullTime):
return "全日制".local
case .education(.partTime):
return "兼职制".local
case.education(.distanceCourses):
return "遥距课程".local
case .marriage(.unmarriage):
return "未婚".local
case .marriage(.marriaged):
return "已婚".local
case .marriage(.separated):
return "分居".local
case .marriage(.divorced):
return "离婚".local
case .marriage(.widowed):
return "丧偶".local
case .occupation(.onTheJob):
return "在职".local
case .occupation(.retire):
return "退休".local
case .occupation(.unemployed):
return "无业".local
case .occupation(.student):
return "学生".local
case .degree(.bachelor):
return "学士学位".local
case .degree(.master):
return "硕士学位".local
case .degree(.doctor):
return "博士学位".local
case .education(.fullTime):
return "全日制".local
case .education(.partTime):
return "兼职制".local
case.education(.distanceCourses):
return "遥距课程".local
case .occupation(.onTheJob):
return "在职".local
case .occupation(.retire):
return "退休".local
case .occupation(.unemployed):
return "无业".local
case .occupation(.student):
return "学生".local
case .gender(.male):
return "男".local
case .gender(.female):
return "女".local
case .gender(.male):
return "男".local
case .gender(.female):
return "女".local
case .certificate(.passport):
return "护照".local
case .certificate(.travelPassport):
return "旅游通行证".local
case .certificate(.diplomaticPassport):
return "外交护照".local
case .certificate(.chineseStatelessTravelPassport):
return "中国发无国籍旅游证件".local
case .certificate(.otherStatelessTravelPassport):
return "其他无国籍旅行证件".local
case .certificate(.unitedNationsPassport):
return "联合国通行证".local
case .certificate(.officialPassport):
return "公务护照".local
}
}
}
static func getType(_ title: String?) -> YHFormPickerViewSubType {
......@@ -124,6 +160,21 @@ enum YHFormPickerViewSubType {
return .gender(.male)
} else if title == "女".local {
return .gender(.female)
} else if title == "护照".local {
return .certificate(.passport)
} else if title == "外交护照".local {
return .certificate(.diplomaticPassport)
} else if title == "旅游通行证".local {
return .certificate(.travelPassport)
} else if title == "公务护照".local {
return .certificate(.officialPassport)
} else if title == "中国发无国籍旅游证件".local {
return .certificate(.chineseStatelessTravelPassport)
} else if title == "其他无国籍旅行证件".local {
return .certificate(.otherStatelessTravelPassport)
} else if title == "联合国通行证".local {
return .certificate(.unitedNationsPassport)
}
return .none
......@@ -180,6 +231,24 @@ enum YHPickerViewGenderType {
case female
}
enum YHPickerViewCertificateType {
// 护照
case passport
// 外交护照
case diplomaticPassport
// 公务护照
case officialPassport
// 中国发无国籍旅游证件
case chineseStatelessTravelPassport
// 旅游通行证
case travelPassport
// 联合国通行证
case unitedNationsPassport
// 其他无国籍旅行证件
case otherStatelessTravelPassport
}
class YHFormPickerViewItem {
......@@ -319,6 +388,15 @@ class YHFormPickerView: UIView {
[YHFormPickerViewItem(type: .gender(.male)),
YHFormPickerViewItem(type: .gender(.female))],
// 证件
.certificate:
[YHFormPickerViewItem(type: .certificate(.passport)),
YHFormPickerViewItem(type: .certificate(.diplomaticPassport)),
YHFormPickerViewItem(type: .certificate(.officialPassport)),
YHFormPickerViewItem(type: .certificate(.chineseStatelessTravelPassport)),
YHFormPickerViewItem(type: .certificate(.travelPassport)),
YHFormPickerViewItem(type: .certificate(.unitedNationsPassport)),
YHFormPickerViewItem(type: .certificate(.otherStatelessTravelPassport))],
]
}()
......@@ -338,6 +416,24 @@ class YHFormPickerView: UIView {
UIApplication.shared.yhKeyWindow()?.addSubview(self)
}
static func show(type:YHFormPickerViewType, selectType:YHFormPickerViewSubType, callBack: @escaping ((YHFormPickerViewSubType)->Void)) {
let picker = YHFormPickerView(type: type)
picker.selectType = selectType
picker.selectBlock = callBack
picker.show()
}
static func show(type:YHFormPickerViewType, selectTitle:String?, callBack: @escaping ((YHFormPickerViewSubType)->Void)) {
let picker = YHFormPickerView(type: type)
picker.selectTitle = selectTitle
picker.selectBlock = callBack
picker.show()
}
@objc func dismiss() {
self.removeFromSuperview()
}
......@@ -431,19 +527,21 @@ class YHFormPickerView: UIView {
func getTitle(type: YHFormPickerViewType)-> String {
switch type {
case .none:
return ""
case .degree:
return "选择学位"
case .marriage:
return "选择婚姻状况"
case .edution:
return "选择学位"
case .occupation:
return "选择职业"
case .gender:
return "选择性别"
}
case .none:
return ""
case .degree:
return "选择学位"
case .marriage:
return "选择婚姻状况"
case .edution:
return "选择学位"
case .occupation:
return "选择职业"
case .gender:
return "选择性别"
case .certificate:
return "选择证件"
}
}
}
......
......@@ -36,6 +36,7 @@ class YHMainApplicantInformationViewController: YHBaseViewController {
dataSource = viewModel.getDetailDataSource()
}
tableView.reloadData()
}
func setView() {
......@@ -89,16 +90,6 @@ class YHMainApplicantInformationViewController: YHBaseViewController {
make.left.right.bottom.equalTo(view)
make.height.equalTo(k_Height_safeAreaInsetsBottom() + 64)
}
stepView.isHidden = true
tableView.isHidden = true
bottomView.isHidden = true
let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 150, width: self.view.bounds.width, height: 200))
datePicker.datePickerMode = .dateAndTime
// datePicker.addTarget(self, action: #selector(handleDateChange), for: .valueChanged)
// 将日期选择器添加到视图上
self.view.addSubview(datePicker)
}
}
......@@ -126,7 +117,7 @@ extension YHMainApplicantInformationViewController: UITableViewDelegate, UITable
if stepView.currentIndex == 1 {
return 217.0
} else {
return CGFloat(count * 52 + 52 + 14)
return CGFloat(count * 52 + 52 + 14)
}
}
}
//
// YHDatePickView.swift
// galaxy
//
// Created by EDY on 2024/1/30.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
struct YHCountryModel {
var provincesArray: [YHProvincesModel] = []
init(dic: [String:[String:[String]]]) {
for (key,value) in dic {
let model = YHProvincesModel(name: key, dic: value)
provincesArray.append(model)
provincesArray.sort { a, b in
a.provincesName < b.provincesName
}
}
}
}
struct YHProvincesModel {
var provincesName: String = ""
var cityArray: [YHCityModel] = []
init(name : String ,dic:[String: [String]]) {
provincesName = name
for (key,value) in dic {
let model = YHCityModel(name: key, Arr: value)
cityArray.append(model)
cityArray.sort { a, b in
a.cityName < b.cityName
}
}
}
}
struct YHCityModel {
var cityName: String = ""
var areaArray: [String] = []
init(name: String,Arr: [String]) {
cityName = name
for str in Arr {
areaArray.append(str)
}
areaArray.sort(by: <)
}
}
//
// YHDatePickView.swift
// galaxy
//
// Created by EDY on 2024/1/30.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHAddressPickViewTableViewCell: UITableViewCell {
static let identifier = "YHAddressPickViewTableViewCell"
let label: UILabel = {
let label = UILabel(frame: CGRect(x: 42, y: 8, width: 200, height: 24))
label.font = UIFont.systemFont(ofSize: 14)
label.textColor = UIColor(red: 51/255, green: 51/255, blue: 51/255, alpha: 1)
return label
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.selectionStyle = .none
drawMyView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func drawMyView() {
self.addSubview(label)
}
}
class YHAddressPickViewFirstTableViewCell: UITableViewCell {
static let identifier = "YHAddressPickViewFirstTableViewCell"
let label: UILabel = {
let label = UILabel(frame: CGRect(x: 24, y: 11.5, width: 100, height: 17))
label.font = UIFont.systemFont(ofSize: 12)
label.textColor = UIColor(red: 102/255, green: 102/255, blue: 102/255, alpha: 1)
return label
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.selectionStyle = .none
drawMyView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func drawMyView() {
self.addSubview(label)
}
}
//
// YHDatePickView.swift
// galaxy
//
// Created by EDY on 2024/1/30.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
enum YHAddressPickerPresentAnimateType {
case present//被推出时
case dismiss//取消时
}
//EWAddressPickerViewController的推出和取消动画
class YHAddressPickerPresentAnimated: NSObject,UIViewControllerAnimatedTransitioning {
var type: YHAddressPickerPresentAnimateType = .present
init(type: YHAddressPickerPresentAnimateType) {
self.type = type
}
/// 动画时间
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.3
}
/// 动画效果
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
switch type {
case .present:
guard let toVC: YHAddressViewController = transitionContext.viewController(forKey: .to) as? YHAddressViewController else {
return
}
let toView = toVC.view
let containerView = transitionContext.containerView
containerView.addSubview(toView!)
toVC.containV.transform = CGAffineTransform(translationX: 0, y: (toVC.containV.frame.height))
UIView.animate(withDuration: 0.25, animations: {
/// 背景变色
toVC.backgroundView.alpha = 1.0
/// addresspicker向上推出
toVC.containV.transform = CGAffineTransform(translationX: 0, y: -10)
}) { (_) in
UIView.animate(withDuration: 0.2, animations: {
/// transform初始化
toVC.containV.transform = CGAffineTransform.identity
}, completion: { (_) in
transitionContext.completeTransition(true)
})
}
case .dismiss:
guard let toVC: YHAddressViewController = transitionContext.viewController(forKey: .from) as? YHAddressViewController else {
return
}
UIView.animate(withDuration: 0.25, animations: {
toVC.backgroundView.alpha = 0.0
/// addresspicker向下推回
toVC.containV.transform = CGAffineTransform(translationX: 0, y: (toVC.containV.frame.height))
}) { (_) in
transitionContext.completeTransition(true)
}
}
}
}
//
// YHDatePickView.swift
// galaxy
//
// Created by EDY on 2024/1/30.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
/*
let addressPicker = YHAddressViewController( selectProvince: "上海市", selectCity: "" )
/*** 可使用这种init方法自定制选中颜色,不填写selectColor默认颜色为UIColor(red: 79/255, green: 176/255, blue: 255/255, alpha: 1),蓝色
let addressPicker = EWAddressViewController(selectColor: UIColor.yellow)
*/
// 返回选择数据,地址,省,市,区
addressPicker.backLocationStringController = { (address,province,city,area) in
}
self.present(addressPicker, animated: true, completion: nil)
*/
import UIKit
///默认选中颜色
let defaultColor = UIColor(red: 79/255, green: 176/255, blue: 255/255, alpha: 1)
class YHAddressViewController: UIViewController {
public var backLocationStringController: ((String,String,String,String) -> Void)?
///title选中颜色
public var selectColor: UIColor
public var selectProvince: String?
public var selectCity: String?
public lazy var containV: YHAddressPickView = {
let view = YHAddressPickView(frame: CGRect(x: 0, y: UIScreen.main.bounds.height - 550, width: UIScreen.main.bounds.width, height: 550),selectColor: selectColor,selectedProvince: selectProvince,selectedCity: selectCity)
view.backOnClickCancel = {
[weak self] in
self?.onClickCancel()
}
/// 成功选择后将数据回调,并推出视图
view.backLocationString = {[weak self] (address,province,city,area) in
if self?.backLocationStringController != nil {
self?.backLocationStringController!(address,province,city,area)
self?.onClickCancel()
}
}
return view
}()
public var backgroundView:UIView = {
let view = UIView()
view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4)
return view
}()
init(selectColor: UIColor = defaultColor,selectProvince: String? = nil, selectCity: String? = nil) {
self.selectColor = selectColor
self.selectProvince = selectProvince
self.selectCity = selectCity
super.init(nibName: nil, bundle: nil)
self.view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.3)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
drawMyView()
// Do any additional setup after loading the view.
}
private func drawMyView() {
self.view.insertSubview(self.backgroundView, at: 0)
self.providesPresentationContextTransitionStyle = true
self.definesPresentationContext = true
self.modalPresentationStyle = .custom//viewcontroller弹出后之前控制器页面不隐藏 .custom代表自定义
self.view.addSubview(self.containV)
// 转场动画代理
self.transitioningDelegate = self
}
///点击推出
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
let currentPoint = touches.first?.location(in: self.view)
if !self.containV.frame.contains(currentPoint ?? CGPoint()) {
self.dismiss(animated: true, completion: nil)
}
}
// MARK: onClick
@objc private func onClickCancel() {
self.dismiss(animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
// MARK: - 转场动画delegate
extension YHAddressViewController: UIViewControllerTransitioningDelegate {
/// 推入动画
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let animated = YHAddressPickerPresentAnimated(type: .present)
return animated
}
/// 推出动画
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let animated = YHAddressPickerPresentAnimated(type: .dismiss)
return animated
}
}
//
// YHDatePickView.swift
// galaxy
//
// Created by EDY on 2024/1/30.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
/* 使用例子
YHDatePickView.show(type: .yyyymmdd) { date in
let arr = date.components(separatedBy: YHDatePickView.separator)
// [yyyy, mm, dd] eg ["2024", "01", "20"]
print(date)
}
*/
import UIKit
enum YHDateType: Int {
case yyyymmdd = 0
case yyyymm = 1
case yyyy = 2
}
class YHDatePickView: UIView {
var backDate: ((String) -> Void)?
var centerView: UIView!
var titleLabel: UILabel!
var closeButton: UIButton!
var sureButton: UIButton!
var lineView: UIView!
var pickerView: UIPickerView!
private var currentDateCom: DateComponents = Calendar.current.dateComponents([.year, .month, .day], from: Date())
// 日期分割符 eg: 2024-01-01
static let separator: String = "-"
var type: YHDateType? {
didSet {
guard let type = type else { return }
switch type {
case .yyyymmdd:
pickerView.reloadAllComponents()
case .yyyymm:
pickerView.reloadAllComponents()
case .yyyy:
pickerView.reloadAllComponents()
}
}
}
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor(white: 0.5, alpha: 0.1)
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tap.delegate = self
addGestureRecognizer(tap)
setView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setView() {
backgroundColor = UIColor(hex: 0x0000, alpha: 0.5)
centerView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = 16
return view
}()
addSubview(centerView)
centerView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.height.equalTo(322)
}
titleLabel = {
let label = UILabel()
label.text = "选择出生日期"
label.font = kFont(size: 17)
label.textColor = UIColor(hex:0x222222)
label.textAlignment = .center
return label
}()
centerView.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.top.equalTo(16)
make.height.equalTo(21)
make.width.equalTo(200)
make.centerX.equalToSuperview()
}
closeButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = kBoldFont(size: 14)
button.contentHorizontalAlignment = .center
button.setTitle("取消", for: .normal)
button.setTitleColor( UIColor(hex:0x222222), for: .normal)
button.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return button
}()
centerView.addSubview(closeButton)
closeButton.snp.makeConstraints { make in
make.left.equalTo(21)
make.height.equalTo(20)
make.width.equalTo(30)
make.top.equalTo(18)
}
sureButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = kBoldFont(size: 14)
button.contentHorizontalAlignment = .center
button.setTitle("确定", for: .normal)
button.setTitleColor( UIColor(hex:0x4487f9), for: .normal)
button.addTarget(self, action: #selector(sure), for: .touchUpInside)
return button
}()
centerView.addSubview(sureButton)
sureButton.snp.makeConstraints { make in
make.right.equalTo(-21)
make.height.equalTo(20)
make.width.equalTo(30)
make.top.equalTo(18)
}
lineView = {
let view = UIView()
view.backgroundColor = UIColor(hex: 0xf0f0f0)
return view
}()
centerView.addSubview(lineView)
lineView.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(52)
make.height.equalTo(1)
make.right.equalTo(-18)
}
pickerView = {
let picker = UIPickerView()
picker.delegate = self
picker.dataSource = self
picker.backgroundColor = UIColor.clear
picker.clipsToBounds = true
return picker
}()
centerView.addSubview(pickerView)
pickerView.snp.makeConstraints { make in
make.left.equalTo(16)
make.top.equalTo(68)
make.height.equalTo(220)
make.right.equalTo(-16)
}
}
@objc private func handleTap(_ sender: AnyObject?) {
print("处理点击手势")
dismiss()
}
static func show(type:YHDateType, callBack: @escaping ((String) -> Void)) {
let view = YHDatePickView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: KScreenHeight))
view.type = type
view.backDate = callBack
let window = UIApplication.shared.yhKeyWindow()
window?.addSubview(view)
}
@objc func dismiss() {
removeFromSuperview()
}
@objc func sure() {
guard let type = type else { return }
var date = ""
switch type {
case .yyyymmdd:
date = String(format: "%02ld%@%02ld%@%02ld", (self.currentDateCom.year!) - self.pickerView.selectedRow(inComponent: 0),Self.separator, self.pickerView.selectedRow(inComponent: 1) + 1,Self.separator, self.pickerView.selectedRow(inComponent: 2) + 1)
case .yyyymm:
date = String(format: "%02ld%@%02ld", (self.currentDateCom.year!) - self.pickerView.selectedRow(inComponent: 0),Self.separator, self.pickerView.selectedRow(inComponent: 1) + 1)
case .yyyy:
date = String(format: "%02ld", (self.currentDateCom.year!) - self.pickerView.selectedRow(inComponent: 0))
}
if self.backDate != nil {
self.backDate!(date)
}
}
}
extension YHDatePickView: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer:UIGestureRecognizer, shouldReceive touch:UITouch) -> Bool {
if touch.view == self {
return true
}
return false
}
}
extension YHDatePickView: UIPickerViewDelegate,UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
guard let type = type else { return 3 }
switch type {
case .yyyymmdd:
return 3
case .yyyymm:
return 2
case .yyyy:
return 1
}
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return 100
} else if component == 1 {
return 12
} else {
let year: Int = pickerView.selectedRow(inComponent: 0) + currentDateCom.year!
let month: Int = pickerView.selectedRow(inComponent: 1) + 1
let days: Int = howManyDays(inThisYear: year, withMonth: month)
return days
}
}
private func howManyDays(inThisYear year: Int, withMonth month: Int) -> Int {
if (month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12) {
return 31
}
if (month == 4) || (month == 6) || (month == 9) || (month == 11) {
return 30
}
if (year % 4 == 1) || (year % 4 == 2) || (year % 4 == 3) {
return 28
}
if year % 400 == 0 {
return 29
}
if year % 100 == 0 {
return 28
}
return 29
}
func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
guard let type = type else { return KScreenWidth / 3 }
switch type {
case .yyyymmdd:
return KScreenWidth / 3
case .yyyymm:
return KScreenWidth / 2
case .yyyy:
return KScreenWidth
}
}
func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
return 44
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
return "\((currentDateCom.year!) - row)"
} else if component == 1 {
return "\(row + 1)"
} else {
return "\(row + 1)"
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if component == 1, self.type == .yyyymmdd {
pickerView.reloadComponent(2)
}
}
}
//
// YHImagePickerView.swift
// galaxy
//
// Created by EDY on 2024/1/30.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
/*
let view = YHImagePickerView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: KScreenHeight))
view.backImage = { [weak self] image in
guard let self = self else { return }
}
let window = UIApplication.shared.yhKeyWindow()
window?.addSubview(view)
*/
import UIKit
class YHImagePickerView: UIView {
var backImage: ((UIImage) -> Void)?
var centerView: UIView!
var titleLabel: UILabel!
var closeButton: UIButton!
var takePhotoBtton: UIButton!
var selectPhotoButton: UIButton!
var cannalButton: UIButton!
var lineView: UIView!
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor(white: 0.5, alpha: 0.1)
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tap.delegate = self
addGestureRecognizer(tap)
setView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setView() {
backgroundColor = UIColor(hex: 0x0000, alpha: 0.5)
centerView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = 16
return view
}()
addSubview(centerView)
centerView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.height.equalTo(244)
}
titleLabel = {
let label = UILabel()
label.text = "请选择上传方式"
label.font = kFont(size: 17)
label.textColor = UIColor(hex:0x222222)
label.textAlignment = .left
return label
}()
centerView.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.top.equalTo(16)
make.left.height.equalTo(21)
make.right.equalTo(-21)
}
closeButton = {
let button = UIButton(type: .custom)
button.setBackgroundImage(UIImage(named: "service_card_close"), for: .normal)
button.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return button
}()
centerView.addSubview(closeButton)
closeButton.snp.makeConstraints { make in
make.right.equalTo(-21)
make.width.height.equalTo(24)
make.top.equalTo(16)
}
takePhotoBtton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = kBoldFont(size: 14)
button.contentHorizontalAlignment = .center
button.setTitle("拍照上传", for: .normal)
button.setTitleColor( UIColor(hex:0x222222), for: .normal)
button.addTarget(self, action: #selector(takePhoto), for: .touchUpInside)
return button
}()
centerView.addSubview(takePhotoBtton)
takePhotoBtton.snp.makeConstraints { make in
make.right.equalTo(-21)
make.height.equalTo(51)
make.left.equalTo(21)
make.top.equalTo(53)
}
selectPhotoButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = kBoldFont(size: 14)
button.contentHorizontalAlignment = .center
button.setTitle("相册上传", for: .normal)
button.setTitleColor( UIColor(hex:0x222222), for: .normal)
button.addTarget(self, action: #selector(selectPhoto), for: .touchUpInside)
return button
}()
centerView.addSubview(selectPhotoButton)
selectPhotoButton.snp.makeConstraints { make in
make.right.equalTo(-21)
make.height.equalTo(51)
make.left.equalTo(21)
make.top.equalTo(105)
}
cannalButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = kBoldFont(size: 14)
button.contentHorizontalAlignment = .center
button.setTitle("取消", for: .normal)
button.setTitleColor( UIColor(hex:0x909090), for: .normal)
button.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return button
}()
centerView.addSubview(cannalButton)
cannalButton.snp.makeConstraints { make in
make.right.equalTo(-21)
make.height.equalTo(51)
make.left.equalTo(21)
make.top.equalTo(156)
}
for i in 0..<3 {
let view = UIView()
view.backgroundColor = UIColor(hex: 0xf0f0f0)
centerView.addSubview(view)
view.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(52 + 52 * i)
make.height.equalTo(1)
make.right.equalTo(-18)
}
}
}
@objc private func handleTap(_ sender: AnyObject?) {
print("处理点击手势")
dismiss()
}
@objc func dismiss() {
removeFromSuperview()
}
@objc func takePhoto() {
if UIImagePickerController.isSourceTypeAvailable(.camera){
//创建图片控制器
let imagePicker = UIImagePickerController()
//设置代理
imagePicker.delegate = self
//设置来源
imagePicker.sourceType = .camera
//允许编辑
imagePicker.allowsEditing = true
//打开相机
UIViewController.current?.present(imagePicker, animated: true, completion: { () -> Void in
})
} else {
printLog("找不到相机")
}
}
@objc func selectPhoto() {
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = true
// 这一句,开始调用图库
UIViewController.current?.present(imagePicker,animated: true)
}
}
}
extension YHImagePickerView: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer:UIGestureRecognizer, shouldReceive touch:UITouch) -> Bool {
if touch.view == self {
return true
}
return false
}
}
extension YHImagePickerView: UINavigationControllerDelegate, UIImagePickerControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
// 将图片显示给UIImageView
if let block = backImage {
block(image)
self.dismiss()
}
} else {
printLog("pick image wrong")
}
// 收回图库选择界面
picker.dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
}
}
<?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/>
<dict>
<key>NSCameraUsageDescription</key>
<string>cameraDesciption</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>photoLibraryDesciption</string>
</dict>
</plist>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment