mvcgen 0.1.14 → 0.1.18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mvcgen/filemanager.rb +1 -1
- data/lib/mvcgen/generator.rb +36 -33
- data/lib/mvcgen/version.rb +1 -1
- data/lib/templates/default/mvcspec.yml +1 -1
- data/lib/templates/default/podfile/Podfile +73 -0
- data/lib/templates/default/swift/AppDelegate.swift +181 -0
- data/lib/templates/default/swift/Assets.xcassets/AppIcon.appiconset/Contents.json +133 -0
- data/lib/templates/default/swift/Assets.xcassets/Back.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/Back.imageset/icons8-back-filled-100-2.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Contents.json +6 -0
- data/lib/templates/default/swift/Assets.xcassets/Down.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/Down.imageset/icons8-expand-arrow-filled-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Forward.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/Forward.imageset/icons8-forward-filled-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Key.imageset/Contents.json +1 -0
- data/lib/templates/default/swift/Assets.xcassets/Key.imageset/universal_Key.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Shopping-cart.imageset/Contents.json +1 -0
- data/lib/templates/default/swift/Assets.xcassets/Shopping-cart.imageset/universal_Shopping-cart.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Tick.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/Tick.imageset/icons8-Checkmark-96 (1).png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Up.imageset/Contents.json +22 -0
- data/lib/templates/default/swift/Assets.xcassets/Up.imageset/icons8-collapse-arrow-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Up.imageset/icons8-collapse-arrow-50.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Uruguay.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/Uruguay.imageset/icons8-uruguay-40.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Wallet.imageset/Contents.json +1 -0
- data/lib/templates/default/swift/Assets.xcassets/Wallet.imageset/universal_Wallet.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_001.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_001.imageset/Icons_NotATour_Welcome_001.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_002.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_002.imageset/Icons_NotATour_Welcome_002.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_003.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_003.imageset/Icons_NotATour_Welcome_003.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_004.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_004.imageset/Icons_NotATour_Welcome_004.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_beach.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_beach.imageset/icons8-beach-64.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_nobaggage.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_nobaggage.imageset/icons8-no-baggage-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_signpost.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_signpost.imageset/icons8-signpost-64.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_sunbed.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_sunbed.imageset/sunbed.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/arrow.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/arrow.imageset/arrow.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/Contents.json +22 -0
- data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/baggage.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/baggage@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/burger.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/burger.imageset/burger.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/calendar-white.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/calendar-white.imageset/icons8-calendar.pdf +70 -0
- data/lib/templates/default/swift/Assets.xcassets/calendar.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/calendar.imageset/calendar.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/dots.imageset/Contents.json +24 -0
- data/lib/templates/default/swift/Assets.xcassets/dots.imageset/dots.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/edit.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/edit.imageset/edit.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/emptylogin.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/emptylogin.imageset/empty state loging.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/envelope.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/envelope.imageset/icons8-envelope.pdf +70 -0
- data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/Contents.json +22 -0
- data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/icons8-expand-arrow-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/icons8-expand-arrow-50.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/facebook.imageset/Contents.json +24 -0
- data/lib/templates/default/swift/Assets.xcassets/facebook.imageset/icons8-facebook-f.pdf +68 -0
- data/lib/templates/default/swift/Assets.xcassets/filter-white.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/filter-white.imageset/icons8-adjust (3).pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/filter.imageset/Contents.json +15 -0
- data/lib/templates/default/swift/Assets.xcassets/filter.imageset/filter.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/food.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/food.imageset/food.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/Contents.json +23 -0
- data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1@3x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/heart-active.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/heart-active.imageset/favortio activo.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/heart.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/heart.imageset/favorito inactivo.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/icons8-delete.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/icons8-delete.imageset/icons8-delete (3).pdf +69 -0
- data/lib/templates/default/swift/Assets.xcassets/lock.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/lock.imageset/icons8-lock.pdf +69 -0
- data/lib/templates/default/swift/Assets.xcassets/man-avatar.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/man-avatar.imageset/man-avatar.pdf +1149 -1
- data/lib/templates/default/swift/Assets.xcassets/new-notification.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/new-notification.imageset/icons8-filled-circle-filled-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/no-fav.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/no-fav.imageset/page-1@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/notificaciones.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/notificaciones.imageset/notificaciones.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/notification.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/notification.imageset/icons8-notification-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/other.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/other.imageset/other.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/page-1.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/page-1.imageset/page-1@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/page-3.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/page-3.imageset/page-1@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/photo.imageset/Contents.json +24 -0
- data/lib/templates/default/swift/Assets.xcassets/photo.imageset/photo.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/plus-white.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/plus-white.imageset/icons8-plus-math-26.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/plus.imageset/+.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/plus.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/register.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/register.imageset/registro.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/search.imageset/Contents.json +15 -0
- data/lib/templates/default/swift/Assets.xcassets/search.imageset/search.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/settings.imageset/Contents.json +23 -0
- data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-50.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-500.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/shape.imageset/Contents.json +23 -0
- data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape@3x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/signpost.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/signpost.imageset/icons8-signpost-50.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/stars.imageset/Contents.json +24 -0
- data/lib/templates/default/swift/Assets.xcassets/stars.imageset/stars.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/terms.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/terms.imageset/terminos y condiciones.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/tickets.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/tickets.imageset/tickets.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/user.imageset/Contents.json +22 -0
- data/lib/templates/default/swift/Assets.xcassets/user.imageset/icons8-account-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/user.imageset/icons8-account-50.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/visa.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/visa.imageset/visa.png +0 -0
- data/lib/templates/default/swift/Config/Config.swift +1 -1
- data/lib/templates/default/swift/Controllers/Login/ForgetPasswordVC.swift +125 -0
- data/lib/templates/default/swift/Controllers/Login/LoginVC.swift +244 -0
- data/lib/templates/default/swift/Controllers/Login/RegisterVC.swift +213 -0
- data/lib/templates/default/swift/Controllers/Notifications/Cells/NotificationCell.swift +51 -0
- data/lib/templates/default/swift/Controllers/Notifications/NotificationsVC.swift +164 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/ForgetPasswordTVC.swift +98 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/LoginTVC.swift +245 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/OtherRegisterVC.swift +299 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/SelectLanguageCell.swift +17 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/SelectLanguageVC.swift +116 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/TermsAndConditionsVC.swift +76 -0
- data/lib/templates/default/swift/Controllers/Profile/AboutUsVC.swift +93 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/AboutUsImageCell.swift +66 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/DescriptionCell.swift +16 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/DestinationCell.swift +35 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/DestinationCellView.xib +84 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/FavoriteCollectionCell.swift +24 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/ImagesCollectionViewCell.swift +15 -0
- data/lib/templates/default/swift/Controllers/Profile/ProfileContainerVC.swift +72 -0
- data/lib/templates/default/swift/Controllers/Profile/ProfileTVC.swift +581 -0
- data/lib/templates/default/swift/Controllers/Tutorial/TutorialVC.swift +121 -0
- data/lib/templates/default/swift/Extensions/ArrayDuplicates.swift +35 -0
- data/lib/templates/default/swift/Extensions/Buttons.swift +1 -1
- data/lib/templates/default/swift/Extensions/CustomCamera.swift +65 -0
- data/lib/templates/default/swift/Extensions/GradientView.swift +121 -0
- data/lib/templates/default/swift/Extensions/HideKeyboard.swift +22 -0
- data/lib/templates/default/swift/Extensions/Images.swift +82 -0
- data/lib/templates/default/swift/Extensions/InnerShadowExtension.swift +83 -0
- data/lib/templates/default/swift/Extensions/TableViewEmptyView.swift +30 -0
- data/lib/templates/default/swift/Extensions/TapEffectExtension.swift +48 -0
- data/lib/templates/default/swift/Extensions/{ColorHex.swift → UIColorExtensions.swift} +2 -2
- data/lib/templates/default/swift/Extensions/UnderlinedTextView.swift +61 -0
- data/lib/templates/default/swift/Extensions/UnderlinedWithIconTextField.swift +55 -0
- data/lib/templates/default/swift/Helper/APIHelper.swift +4 -4
- data/lib/templates/default/swift/Helper/APIManager.swift +81 -14
- data/lib/templates/default/swift/Helper/APIRequestBody.swift +1 -1
- data/lib/templates/default/swift/Helper/AWSManager.swift +1 -1
- data/lib/templates/default/swift/Helper/FilesManager.swift +1 -1
- data/lib/templates/default/swift/Helper/S3Manager.swift +1 -1
- data/lib/templates/default/swift/Helper/Utils.swift +3 -1
- data/lib/templates/default/swift/Info.plist +53 -0
- data/lib/templates/default/swift/Models/Country.swift +28 -0
- data/lib/templates/default/swift/Models/Managers/UserManager.swift +1 -1
- data/lib/templates/default/swift/Models/Notif.swift +71 -0
- data/lib/templates/default/swift/Models/Responses/BaseResponse.swift +1 -1
- data/lib/templates/default/swift/Models/Responses/NotificationResponse.swift +24 -0
- data/lib/templates/default/swift/Models/Responses/UserResponse.swift +1 -1
- data/lib/templates/default/swift/Models/Responses/UserSingupResponse.swift +1 -1
- data/lib/templates/default/swift/Models/User.swift +2 -2
- data/lib/templates/default/swift/UI/Storyboards/Home.storyboard +2113 -0
- data/lib/templates/default/swift/UI/Storyboards/Login.storyboard +814 -0
- data/lib/templates/default/swift/UI/Storyboards/OtherLogin.storyboard +1031 -0
- data/lib/templates/default/swift/UI/Views/EmptyTableView/EmptyTableLabelView.swift +18 -0
- data/lib/templates/default/swift/UI/Views/EmptyTableView/NoNotificationView.swift +16 -0
- data/lib/templates/default/swift/UI/Views/EmptyTableView/Xibs/EmptyTableLabelView.xib +72 -0
- data/lib/templates/default/swift/UI/Views/EmptyTableView/Xibs/NoNotificationsView.xib +61 -0
- metadata +176 -4
@@ -0,0 +1,93 @@
|
|
1
|
+
//
|
2
|
+
// AboutUsVC.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
// TODO: Temp picture struct
|
12
|
+
struct Pic{
|
13
|
+
|
14
|
+
var url = ""
|
15
|
+
|
16
|
+
init(url: String) {
|
17
|
+
self.url = url
|
18
|
+
}
|
19
|
+
|
20
|
+
}
|
21
|
+
|
22
|
+
class AboutUsVC: UIViewController, UITableViewDelegate, UITableViewDataSource{
|
23
|
+
|
24
|
+
// MARK: - Outlets
|
25
|
+
|
26
|
+
@IBOutlet var gradientView: UIView!
|
27
|
+
|
28
|
+
@IBOutlet weak var tableView: UITableView!
|
29
|
+
|
30
|
+
@IBOutlet weak var backButton: UIButton!
|
31
|
+
|
32
|
+
// MARK: - Properties
|
33
|
+
|
34
|
+
var pictures = [Pic]()
|
35
|
+
|
36
|
+
|
37
|
+
override func viewDidLoad() {
|
38
|
+
super.viewDidLoad()
|
39
|
+
|
40
|
+
setup()
|
41
|
+
|
42
|
+
// TODO: Add some pictures
|
43
|
+
self.pictures.append(Pic(url: "http://detoqueytoque.com/Fotos_Web_new/Home/grupo%20en%20TLG.jpg"))
|
44
|
+
}
|
45
|
+
|
46
|
+
override func viewWillAppear(_ animated: Bool) {
|
47
|
+
super.viewWillAppear(true)
|
48
|
+
self.navigationController?.navigationBar.isHidden = true
|
49
|
+
self.navigationController?.navigationItem.hidesBackButton = true
|
50
|
+
|
51
|
+
}
|
52
|
+
private func setup() {
|
53
|
+
|
54
|
+
self.gradientView.applyGradient(withColours: [Colors.firstGradientColor, Colors.thirdGradientColor], locations: [0, 0.5])
|
55
|
+
|
56
|
+
self.tableView.rowHeight = UITableViewAutomaticDimension
|
57
|
+
|
58
|
+
let origImage = UIImage(named: "Back")
|
59
|
+
let tintedImage = origImage?.withRenderingMode(.alwaysTemplate)
|
60
|
+
self.backButton.setImage(tintedImage, for: .normal)
|
61
|
+
self.backButton.tintColor = UIColor(red: 107.0/255.0, green: 255.0/255.0, blue: 192.0/255.0, alpha: 1)
|
62
|
+
}
|
63
|
+
|
64
|
+
@IBAction func backTapped(_ sender: UIButton) {
|
65
|
+
self.navigationController?.popViewController(animated: true)
|
66
|
+
}
|
67
|
+
|
68
|
+
// MARK: - Table view
|
69
|
+
|
70
|
+
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
71
|
+
return 1
|
72
|
+
}
|
73
|
+
|
74
|
+
func numberOfSections(in tableView: UITableView) -> Int {
|
75
|
+
return 2
|
76
|
+
}
|
77
|
+
|
78
|
+
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
79
|
+
switch indexPath.section{
|
80
|
+
case 0:
|
81
|
+
let cell = tableView.dequeueReusableCell(withIdentifier: "aboutUsImageCell", for: indexPath) as! AboutUsImageCell
|
82
|
+
cell.pictures = self.pictures
|
83
|
+
cell.pageControl.numberOfPages = self.pictures.count
|
84
|
+
return cell
|
85
|
+
default:
|
86
|
+
let cell = tableView.dequeueReusableCell(withIdentifier: "descriptionCell", for: indexPath) as! DescriptionCell
|
87
|
+
// TODO: Add description
|
88
|
+
cell.descriptionTextView.text = "About us description"
|
89
|
+
return cell
|
90
|
+
}
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
@@ -0,0 +1,66 @@
|
|
1
|
+
//
|
2
|
+
// AboutUsImageCell.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
import Kingfisher
|
11
|
+
|
12
|
+
class AboutUsImageCell: UITableViewCell {
|
13
|
+
|
14
|
+
@IBOutlet weak var collectionView: UICollectionView!
|
15
|
+
@IBOutlet weak var pageControl: UIPageControl!
|
16
|
+
var pictures : [Pic] = []
|
17
|
+
|
18
|
+
var thisWidth:CGFloat = 0
|
19
|
+
|
20
|
+
|
21
|
+
override func awakeFromNib() {
|
22
|
+
super.awakeFromNib()
|
23
|
+
self.collectionView.dataSource = self
|
24
|
+
self.collectionView.delegate = self
|
25
|
+
|
26
|
+
self.pageControl.hidesForSinglePage = true
|
27
|
+
self.pageControl.numberOfPages = self.pictures.count
|
28
|
+
// Initialization code
|
29
|
+
}
|
30
|
+
|
31
|
+
override func setSelected(_ selected: Bool, animated: Bool) {
|
32
|
+
super.setSelected(selected, animated: animated)
|
33
|
+
|
34
|
+
// Configure the view for the selected state
|
35
|
+
}
|
36
|
+
|
37
|
+
}
|
38
|
+
extension AboutUsImageCell : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{
|
39
|
+
func numberOfSections(in collectionView: UICollectionView) -> Int {
|
40
|
+
return self.pictures.count
|
41
|
+
}
|
42
|
+
|
43
|
+
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
44
|
+
return 1
|
45
|
+
}
|
46
|
+
|
47
|
+
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
48
|
+
|
49
|
+
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "imagesCollectionViewCell", for: indexPath) as! ImagesCollectionViewCell
|
50
|
+
let picture = pictures[indexPath.section]
|
51
|
+
cell.imageOutlet.kf.indicatorType = .activity
|
52
|
+
cell.imageOutlet.kf.setImage(with: URL(string : picture.url))
|
53
|
+
return cell
|
54
|
+
|
55
|
+
}
|
56
|
+
|
57
|
+
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
|
58
|
+
self.pageControl.currentPage = indexPath.section
|
59
|
+
}
|
60
|
+
|
61
|
+
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
|
62
|
+
thisWidth = self.collectionView.frame.width
|
63
|
+
return CGSize(width: thisWidth, height: self.collectionView.frame.height)
|
64
|
+
}
|
65
|
+
|
66
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
//
|
2
|
+
// DescriptionCell.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
class DescriptionCell: UITableViewCell {
|
12
|
+
|
13
|
+
@IBOutlet weak var descriptionTextView: UITextView!
|
14
|
+
|
15
|
+
}
|
16
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
//
|
2
|
+
// DestinationCell.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
class DestinationCell: UICollectionViewCell {
|
12
|
+
|
13
|
+
@IBOutlet weak var destinationBackgroundImage: UIImageView!
|
14
|
+
|
15
|
+
@IBOutlet weak var destinationLabel: UILabel!
|
16
|
+
|
17
|
+
@IBOutlet weak var blueGradientView: UIView!
|
18
|
+
|
19
|
+
@IBOutlet weak var tickImage: UIImageView!
|
20
|
+
|
21
|
+
override func awakeFromNib() {
|
22
|
+
super.awakeFromNib()
|
23
|
+
// Initialization code
|
24
|
+
self.blueGradientView.applyGradient(withColours: [Colors.firstGradientColor, UIColor.clear], alpha: 0.8, angle: 90)
|
25
|
+
}
|
26
|
+
|
27
|
+
override var isSelected: Bool {
|
28
|
+
didSet {
|
29
|
+
self.layer.borderWidth = 1.0
|
30
|
+
self.layer.borderColor = isSelected ? Colors.firstGradientColor.cgColor : UIColor.clear.cgColor
|
31
|
+
self.blueGradientView.backgroundColor = isSelected ? Colors.thirdGradientColor : UIColor.clear
|
32
|
+
self.tickImage.image = isSelected ? UIImage(named: "Tick") : nil
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
3
|
+
<device id="retina4_7" orientation="portrait">
|
4
|
+
<adaptation id="fullscreen"/>
|
5
|
+
</device>
|
6
|
+
<dependencies>
|
7
|
+
<deployment identifier="iOS"/>
|
8
|
+
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
|
9
|
+
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
10
|
+
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
11
|
+
</dependencies>
|
12
|
+
<customFonts key="customFonts">
|
13
|
+
<array key="Quicksand-Light.ttf">
|
14
|
+
<string>Quicksand-Light</string>
|
15
|
+
</array>
|
16
|
+
</customFonts>
|
17
|
+
<objects>
|
18
|
+
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="FilterTravelGroupsVC" customModule="NT_Dev" customModuleProvider="target"/>
|
19
|
+
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
20
|
+
<view clipsSubviews="YES" contentMode="scaleAspectFill" restorationIdentifier="DestinationCellView" id="iN0-l3-epB" customClass="DestinationCell" customModule="NT_Dev" customModuleProvider="target">
|
21
|
+
<rect key="frame" x="0.0" y="0.0" width="375" height="150"/>
|
22
|
+
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
23
|
+
<subviews>
|
24
|
+
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="egypt_color" translatesAutoresizingMaskIntoConstraints="NO" id="ZIW-cb-MdB">
|
25
|
+
<rect key="frame" x="0.0" y="0.0" width="375" height="150"/>
|
26
|
+
</imageView>
|
27
|
+
<view clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="T6C-j1-5G0">
|
28
|
+
<rect key="frame" x="0.0" y="0.0" width="375" height="150"/>
|
29
|
+
<subviews>
|
30
|
+
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="DUZ-yF-H2J">
|
31
|
+
<rect key="frame" x="157" y="45" width="60" height="60"/>
|
32
|
+
<constraints>
|
33
|
+
<constraint firstAttribute="height" constant="60" id="ImN-yp-2bS"/>
|
34
|
+
<constraint firstAttribute="width" constant="60" id="vBT-aO-c3d"/>
|
35
|
+
</constraints>
|
36
|
+
</imageView>
|
37
|
+
</subviews>
|
38
|
+
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
39
|
+
<constraints>
|
40
|
+
<constraint firstItem="DUZ-yF-H2J" firstAttribute="centerY" secondItem="T6C-j1-5G0" secondAttribute="centerY" id="5XI-WP-f5H"/>
|
41
|
+
<constraint firstItem="DUZ-yF-H2J" firstAttribute="centerX" secondItem="T6C-j1-5G0" secondAttribute="centerX" id="cIr-3l-AB4"/>
|
42
|
+
</constraints>
|
43
|
+
</view>
|
44
|
+
<label opaque="NO" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="249" verticalHuggingPriority="248" text="Egipto" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cmq-b1-dok" customClass="BottomAlignedLabel" customModule="NT_Dev" customModuleProvider="target">
|
45
|
+
<rect key="frame" x="20" y="59" width="335" height="32.5"/>
|
46
|
+
<fontDescription key="fontDescription" name="Quicksand-Light" family="Quicksand" pointSize="26"/>
|
47
|
+
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
48
|
+
<nil key="highlightedColor"/>
|
49
|
+
</label>
|
50
|
+
</subviews>
|
51
|
+
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
52
|
+
<constraints>
|
53
|
+
<constraint firstItem="cmq-b1-dok" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="20" id="DWl-x3-DSL"/>
|
54
|
+
<constraint firstItem="cmq-b1-dok" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="J54-jr-Ciz"/>
|
55
|
+
<constraint firstItem="ZIW-cb-MdB" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" id="N89-SN-5g0"/>
|
56
|
+
<constraint firstItem="vUN-kp-3ea" firstAttribute="bottom" secondItem="ZIW-cb-MdB" secondAttribute="bottom" id="QHQ-By-FPQ"/>
|
57
|
+
<constraint firstItem="vUN-kp-3ea" firstAttribute="bottom" secondItem="T6C-j1-5G0" secondAttribute="bottom" id="Tqy-qe-vOv"/>
|
58
|
+
<constraint firstItem="ZIW-cb-MdB" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="YQi-Wi-Fxf"/>
|
59
|
+
<constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="ZIW-cb-MdB" secondAttribute="trailing" id="g4G-Av-AB8"/>
|
60
|
+
<constraint firstItem="T6C-j1-5G0" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="gJN-3H-ddk"/>
|
61
|
+
<constraint firstItem="T6C-j1-5G0" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" id="jZF-Mk-OHL"/>
|
62
|
+
<constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="cmq-b1-dok" secondAttribute="trailing" constant="20" id="oZS-k2-cNC"/>
|
63
|
+
<constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="T6C-j1-5G0" secondAttribute="trailing" id="wLo-sS-qFc"/>
|
64
|
+
</constraints>
|
65
|
+
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
66
|
+
<viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
|
67
|
+
<userDefinedRuntimeAttributes>
|
68
|
+
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
|
69
|
+
<integer key="value" value="5"/>
|
70
|
+
</userDefinedRuntimeAttribute>
|
71
|
+
</userDefinedRuntimeAttributes>
|
72
|
+
<connections>
|
73
|
+
<outlet property="blueGradientView" destination="T6C-j1-5G0" id="B8q-Bn-4iB"/>
|
74
|
+
<outlet property="destinationBackgroundImage" destination="ZIW-cb-MdB" id="uEs-ch-6kk"/>
|
75
|
+
<outlet property="destinationLabel" destination="cmq-b1-dok" id="2Y8-v2-0FB"/>
|
76
|
+
<outlet property="tickImage" destination="DUZ-yF-H2J" id="9Jz-YO-bco"/>
|
77
|
+
</connections>
|
78
|
+
<point key="canvasLocation" x="33.5" y="-208"/>
|
79
|
+
</view>
|
80
|
+
</objects>
|
81
|
+
<resources>
|
82
|
+
<image name="egypt_color" width="1280" height="823"/>
|
83
|
+
</resources>
|
84
|
+
</document>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
//
|
2
|
+
// FavoriteCollectionCell.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
class FavoriteCollectionCell: UICollectionViewCell {
|
12
|
+
|
13
|
+
@IBOutlet weak var favoriteBackgroundView: UIView! {
|
14
|
+
didSet {
|
15
|
+
favoriteBackgroundView.layer.cornerRadius = favoriteBackgroundView.frame.size.height/2
|
16
|
+
favoriteBackgroundView.layer.masksToBounds = true
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
@IBOutlet weak var destinationLabel: UILabel!
|
21
|
+
|
22
|
+
@IBOutlet weak var removeButton: UIButton!
|
23
|
+
|
24
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
//
|
2
|
+
// ImagesCollectionViewCell.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
class ImagesCollectionViewCell: UICollectionViewCell {
|
12
|
+
@IBOutlet weak var imageOutlet: UIImageView!
|
13
|
+
|
14
|
+
}
|
15
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
//
|
2
|
+
// ProfileContainerVC.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
class ProfileContainerVC: UIViewController {
|
12
|
+
|
13
|
+
@IBOutlet weak var gradientView: UIView!
|
14
|
+
|
15
|
+
@IBOutlet weak var containerView: UIView!
|
16
|
+
|
17
|
+
let homeStoryboard = UIStoryboard(name: "Home", bundle: Bundle.main)
|
18
|
+
|
19
|
+
override func viewDidLoad() {
|
20
|
+
super.viewDidLoad()
|
21
|
+
|
22
|
+
setupNavigationBar()
|
23
|
+
|
24
|
+
self.add(asChildViewController: self.profileTVC)
|
25
|
+
}
|
26
|
+
override func viewDidLayoutSubviews() {
|
27
|
+
super.viewDidLayoutSubviews()
|
28
|
+
|
29
|
+
// self.gradientView.backgroundColor = ColorConstants.backgroundColor
|
30
|
+
|
31
|
+
self.gradientView.applyGradient(withColours: [Colors.firstGradientColor, Colors.thirdGradientColor], locations: [0, 0.5])
|
32
|
+
|
33
|
+
}
|
34
|
+
|
35
|
+
func setupNavigationBar() {
|
36
|
+
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
|
37
|
+
self.navigationController?.navigationBar.shadowImage = UIImage()
|
38
|
+
self.navigationController?.navigationBar.isTranslucent = true
|
39
|
+
self.navigationController?.view.backgroundColor = UIColor.clear
|
40
|
+
|
41
|
+
}
|
42
|
+
|
43
|
+
private lazy var profileTVC: ProfileTVC = {
|
44
|
+
|
45
|
+
return self.homeStoryboard.instantiateViewController(withIdentifier: "ProfileTVC") as! ProfileTVC
|
46
|
+
|
47
|
+
}()
|
48
|
+
|
49
|
+
private func add(asChildViewController viewController: UIViewController) {
|
50
|
+
addChildViewController(viewController)
|
51
|
+
|
52
|
+
containerView.addSubview(viewController.view)
|
53
|
+
|
54
|
+
// Configure Child View
|
55
|
+
viewController.view.frame = containerView.bounds
|
56
|
+
viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
57
|
+
|
58
|
+
// Notify Child View Controller
|
59
|
+
viewController.didMove(toParentViewController: self)
|
60
|
+
}
|
61
|
+
|
62
|
+
private func remove(asChildViewController viewController: UIViewController) {
|
63
|
+
// Notify Child View Controller
|
64
|
+
viewController.willMove(toParentViewController: nil)
|
65
|
+
|
66
|
+
viewController.view.removeFromSuperview()
|
67
|
+
|
68
|
+
// Notify Child View Controller
|
69
|
+
viewController.removeFromParentViewController()
|
70
|
+
}
|
71
|
+
|
72
|
+
}
|
@@ -0,0 +1,581 @@
|
|
1
|
+
//
|
2
|
+
// ProfileVC.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
import AVFoundation
|
11
|
+
import MobileCoreServices
|
12
|
+
import DKImagePickerController
|
13
|
+
import ActionSheetPicker_3_0
|
14
|
+
import Kingfisher
|
15
|
+
import NVActivityIndicatorView
|
16
|
+
|
17
|
+
struct Favorite {
|
18
|
+
var name: String = ""
|
19
|
+
}
|
20
|
+
|
21
|
+
struct UserHistory{
|
22
|
+
var name: String = ""
|
23
|
+
var thumbnailUrl: String = ""
|
24
|
+
}
|
25
|
+
|
26
|
+
class ProfileTVC: UITableViewController, UITextFieldDelegate, NotificationReadProtocol, UITextViewDelegate {
|
27
|
+
|
28
|
+
|
29
|
+
// MARK: - Outlets
|
30
|
+
|
31
|
+
@IBOutlet weak var editProfileImageButton: UIButton! {
|
32
|
+
didSet {
|
33
|
+
editProfileImageButton.imageView?.contentMode = .scaleAspectFit
|
34
|
+
editProfileImageButton.layer.cornerRadius = editProfileImageButton.frame.size.height/2
|
35
|
+
editProfileImageButton.layer.masksToBounds = true
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
@IBOutlet weak var editProfileImageView: UIImageView! {
|
40
|
+
didSet {
|
41
|
+
editProfileImageView.layer.cornerRadius = editProfileImageView.frame.size.height/2
|
42
|
+
editProfileImageView.layer.masksToBounds = true
|
43
|
+
editProfileImageView.layer.borderWidth = 1.0
|
44
|
+
editProfileImageView.layer.borderColor = UIColor.white.cgColor
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
@IBOutlet weak var profileImageLoading: NVActivityIndicatorView!
|
49
|
+
|
50
|
+
@IBOutlet weak var phonePrefix: UILabel!
|
51
|
+
|
52
|
+
@IBOutlet weak var phoneFlagImage: UIImageView!
|
53
|
+
|
54
|
+
@IBOutlet weak var phoneFlagLabel: UILabel!
|
55
|
+
|
56
|
+
@IBOutlet weak var nameTextField: UnderlinedWithIconTextField!
|
57
|
+
|
58
|
+
@IBOutlet weak var lastnameTextField: UnderlinedWithIconTextField!
|
59
|
+
|
60
|
+
@IBOutlet weak var emailTextField: UnderlinedWithIconTextField!
|
61
|
+
|
62
|
+
@IBOutlet weak var phoneTextField: UnderlinedWithIconTextField!
|
63
|
+
|
64
|
+
@IBOutlet weak var aboutMeTextView: UnderlinedTextView!
|
65
|
+
|
66
|
+
@IBOutlet weak var favoritesCollectionView: UICollectionView!
|
67
|
+
|
68
|
+
@IBOutlet weak var historyTripsCollectionView: UICollectionView!
|
69
|
+
|
70
|
+
@IBOutlet weak var saveChangesButton: LoadingButton!
|
71
|
+
|
72
|
+
@IBOutlet weak var logoutButton: LoadingButton!
|
73
|
+
|
74
|
+
@IBOutlet weak var noFavoritesView: UIView!{
|
75
|
+
didSet {
|
76
|
+
noFavoritesView.layer.cornerRadius = noFavoritesView.frame.size.height/2
|
77
|
+
noFavoritesView.layer.masksToBounds = true
|
78
|
+
}
|
79
|
+
}
|
80
|
+
@IBOutlet weak var noTravelsView: UIView!
|
81
|
+
|
82
|
+
@IBOutlet weak var notificationImage: UIImageView!
|
83
|
+
|
84
|
+
@IBOutlet weak var notificationButton: UIButton!{
|
85
|
+
didSet{
|
86
|
+
notificationButton.layer.shadowColor = UIColor.black.cgColor
|
87
|
+
notificationButton.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
|
88
|
+
notificationButton.layer.masksToBounds = false
|
89
|
+
notificationButton.layer.shadowRadius = 1.0
|
90
|
+
notificationButton.layer.shadowOpacity = 0.5
|
91
|
+
notificationButton.layer.cornerRadius = notificationButton.frame.width / 2
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
95
|
+
@IBOutlet weak var noTravelsMessageView: UIView!{
|
96
|
+
didSet{
|
97
|
+
noTravelsMessageView.layer.borderWidth = 1.0
|
98
|
+
noTravelsMessageView.layer.borderColor = UIColor.white.cgColor
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
@IBOutlet weak var notificationsTapView: UIView!
|
103
|
+
|
104
|
+
@IBOutlet weak var notificationBadgeView: UIView!{
|
105
|
+
didSet{
|
106
|
+
self.notificationBadgeView.layer.shadowColor = UIColor.black.cgColor
|
107
|
+
self.notificationBadgeView.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
|
108
|
+
self.notificationBadgeView.layer.shadowRadius = 1.0
|
109
|
+
self.notificationBadgeView.layer.shadowOpacity = 0.5
|
110
|
+
self.notificationBadgeView.layer.masksToBounds = false
|
111
|
+
self.notificationBadgeView.layer.cornerRadius = self.notificationBadgeView.frame.height/2
|
112
|
+
self.notificationBadgeView.layer.borderColor = UIColor.white.cgColor
|
113
|
+
self.notificationBadgeView.layer.borderWidth = 0.5
|
114
|
+
}
|
115
|
+
}
|
116
|
+
@IBOutlet weak var notificationBadgeCountLabel: UILabel!
|
117
|
+
|
118
|
+
// MARK: - Properties
|
119
|
+
|
120
|
+
let homeStoryboard = UIStoryboard(name: "Home", bundle: Bundle.main)
|
121
|
+
|
122
|
+
var profileImageChanged: Bool = false
|
123
|
+
|
124
|
+
var favorites: [Favorite] = []{
|
125
|
+
didSet{
|
126
|
+
if self.favorites.count > 0{
|
127
|
+
self.noFavoritesView.isHidden = true
|
128
|
+
self.favoritesCollectionView.isHidden = false
|
129
|
+
} else {
|
130
|
+
self.noFavoritesView.isHidden = false
|
131
|
+
self.favoritesCollectionView.isHidden = true
|
132
|
+
}
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
var noMoreFavorites: [Favorite] = []
|
137
|
+
|
138
|
+
var userHistory: [UserHistory] = []{
|
139
|
+
didSet{
|
140
|
+
if self.userHistory.count > 0{
|
141
|
+
self.noTravelsView.isHidden = true
|
142
|
+
self.historyTripsCollectionView.isHidden = false
|
143
|
+
} else {
|
144
|
+
self.noTravelsView.isHidden = false
|
145
|
+
self.historyTripsCollectionView.isHidden = true
|
146
|
+
}
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
private var countries = [Country]()
|
151
|
+
|
152
|
+
var user: User?
|
153
|
+
|
154
|
+
var phoneCountry = ""
|
155
|
+
|
156
|
+
var newNotifications = false{
|
157
|
+
didSet{
|
158
|
+
if newNotifications{
|
159
|
+
self.notificationBadgeView.isHidden = false
|
160
|
+
} else {
|
161
|
+
self.notificationBadgeView.isHidden = true
|
162
|
+
}
|
163
|
+
}
|
164
|
+
}
|
165
|
+
|
166
|
+
var notifications = [Notif]()
|
167
|
+
|
168
|
+
override func viewDidLoad() {
|
169
|
+
super.viewDidLoad()
|
170
|
+
self.fetchData()
|
171
|
+
self.setupViews()
|
172
|
+
|
173
|
+
if #available(iOS 11.0, *) {
|
174
|
+
self.tableView.contentInsetAdjustmentBehavior = .never
|
175
|
+
}
|
176
|
+
|
177
|
+
let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleNotificationTap(_:)))
|
178
|
+
|
179
|
+
self.notificationsTapView.addGestureRecognizer(tap)
|
180
|
+
|
181
|
+
aboutMeTextView.delegate = self
|
182
|
+
|
183
|
+
hideKeyboardWhenTappedAround()
|
184
|
+
|
185
|
+
NotificationCenter.default.addObserver(self, selector: #selector(handleFavoritesUpdated(_:)), name: Notification.Name("FavoritesUpdated"), object: nil)
|
186
|
+
|
187
|
+
|
188
|
+
}
|
189
|
+
|
190
|
+
|
191
|
+
override func viewWillAppear(_ animated: Bool) {
|
192
|
+
super.viewWillAppear(true)
|
193
|
+
//self.updateFavourites()
|
194
|
+
self.navigationController?.navigationBar.isHidden = false
|
195
|
+
self.navigationItem.hidesBackButton = true
|
196
|
+
|
197
|
+
setNotificationBadge()
|
198
|
+
|
199
|
+
}
|
200
|
+
|
201
|
+
func setNotificationBadge(){
|
202
|
+
// TODO: enable when done
|
203
|
+
// APIManager.sharedInstance.getNotifications(){
|
204
|
+
// result, notifications in
|
205
|
+
// self.notifications = notifications.sorted(by: {$0.createdDate.compare($1.createdDate) == .orderedDescending})
|
206
|
+
// let unreadNotif = notifications.filter({!$0.read})
|
207
|
+
// if unreadNotif.count == 0{
|
208
|
+
// self.notificationBadgeView.isHidden = true
|
209
|
+
// } else {
|
210
|
+
// self.notificationBadgeView.isHidden = false
|
211
|
+
// if unreadNotif.count <= 99{
|
212
|
+
// self.notificationBadgeCountLabel.text = "\(unreadNotif.count)"
|
213
|
+
// } else {
|
214
|
+
// self.notificationBadgeCountLabel.text = "99+"
|
215
|
+
// }
|
216
|
+
// }
|
217
|
+
// }
|
218
|
+
}
|
219
|
+
|
220
|
+
|
221
|
+
func fetchData() {
|
222
|
+
self.profileImageLoading.startAnimating()
|
223
|
+
|
224
|
+
self.emailTextField.text = "John"
|
225
|
+
self.nameTextField.text = "Doe"
|
226
|
+
self.lastnameTextField.text = "johndoe@test.com"
|
227
|
+
self.phoneFlagLabel.text = "🇺🇾"
|
228
|
+
self.phoneCountry = "Uruguay"
|
229
|
+
self.phonePrefix.text = "+598"
|
230
|
+
|
231
|
+
self.aboutMeTextView.text = NSLocalizedString("Add something about yourself!", comment: "")
|
232
|
+
self.aboutMeTextView.textColor = UIColor.lightGray
|
233
|
+
|
234
|
+
self.profileImageLoading.stopAnimating()
|
235
|
+
self.editProfileImageView.image = Asset.userTestPhoto.image
|
236
|
+
|
237
|
+
// TODO: Add favorites and history
|
238
|
+
|
239
|
+
}
|
240
|
+
|
241
|
+
func setupViews() {
|
242
|
+
|
243
|
+
self.notificationImage.image = UIImage(named: "notification")
|
244
|
+
|
245
|
+
self.logoutButton.layoutIfNeeded()
|
246
|
+
self.logoutButton.layer.cornerRadius = self.logoutButton.frame.height/7
|
247
|
+
self.logoutButton.layer.masksToBounds = true
|
248
|
+
self.logoutButton.layer.borderWidth = 1
|
249
|
+
self.logoutButton.layer.borderColor = UIColor.white.cgColor
|
250
|
+
self.logoutButton.activityIndicatorColor = UIColor.white
|
251
|
+
|
252
|
+
self.saveChangesButton.layoutIfNeeded()
|
253
|
+
self.saveChangesButton.layer.cornerRadius = self.saveChangesButton.frame.height/7
|
254
|
+
self.saveChangesButton.layer.masksToBounds = true
|
255
|
+
self.saveChangesButton.activityIndicatorColor = UIColor.white
|
256
|
+
|
257
|
+
self.nameTextField.underlined(color: UIColor.white, width: 1.0)
|
258
|
+
self.lastnameTextField.underlined(color: UIColor.white, width: 1.0)
|
259
|
+
self.emailTextField.underlined(color: UIColor.white, width: 1.0)
|
260
|
+
self.phoneTextField.underlined(color: UIColor.white, width: 1.0)
|
261
|
+
|
262
|
+
self.nameTextField.delegate = self
|
263
|
+
self.lastnameTextField.delegate = self
|
264
|
+
self.phoneTextField.delegate = self
|
265
|
+
self.emailTextField.delegate = self
|
266
|
+
|
267
|
+
favoritesCollectionView.delegate = self
|
268
|
+
favoritesCollectionView.dataSource = self
|
269
|
+
|
270
|
+
historyTripsCollectionView.delegate = self
|
271
|
+
historyTripsCollectionView.dataSource = self
|
272
|
+
historyTripsCollectionView.isMultipleTouchEnabled = false
|
273
|
+
historyTripsCollectionView.allowsSelection = false
|
274
|
+
let destNib = UINib(nibName: "DestinationCellView", bundle: nil)
|
275
|
+
historyTripsCollectionView.register(destNib, forCellWithReuseIdentifier: "DestinationCellView")
|
276
|
+
|
277
|
+
}
|
278
|
+
|
279
|
+
override func viewDidLayoutSubviews() {
|
280
|
+
super.viewDidLayoutSubviews()
|
281
|
+
|
282
|
+
self.aboutMeTextView.layoutIfNeeded()
|
283
|
+
self.aboutMeTextView.changeBorderColor(newColor: UIColor.white)
|
284
|
+
}
|
285
|
+
|
286
|
+
// MARK: - TextViewDelegate
|
287
|
+
|
288
|
+
func textViewDidBeginEditing(_ textView: UITextView) {
|
289
|
+
if textView.textColor == UIColor.lightGray {
|
290
|
+
textView.text = nil
|
291
|
+
textView.textColor = UIColor.white
|
292
|
+
}
|
293
|
+
}
|
294
|
+
|
295
|
+
func textViewDidEndEditing(_ textView: UITextView) {
|
296
|
+
if textView.text.isEmpty {
|
297
|
+
textView.text = NSLocalizedString("Add something about yourself!", comment: "")
|
298
|
+
textView.textColor = UIColor.lightGray
|
299
|
+
}
|
300
|
+
}
|
301
|
+
|
302
|
+
// MARK: - TextFieldDelegate
|
303
|
+
|
304
|
+
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
305
|
+
|
306
|
+
let nextTage=textField.tag+1
|
307
|
+
|
308
|
+
// Try to find next responder
|
309
|
+
let nextResponder=textField.superview?.superview?.superview?.viewWithTag(nextTage) as UIResponder!
|
310
|
+
|
311
|
+
if (nextResponder != nil){
|
312
|
+
// Found next responder, so set it.
|
313
|
+
nextResponder?.becomeFirstResponder()
|
314
|
+
}
|
315
|
+
else
|
316
|
+
{
|
317
|
+
// Not found, so remove keyboard
|
318
|
+
textField.resignFirstResponder()
|
319
|
+
}
|
320
|
+
return false // We do not want UITextField to insert line-breaks.
|
321
|
+
}
|
322
|
+
|
323
|
+
override var prefersStatusBarHidden: Bool {
|
324
|
+
return navigationController?.isNavigationBarHidden ?? false
|
325
|
+
}
|
326
|
+
|
327
|
+
// MARK: - Actions
|
328
|
+
|
329
|
+
// function which is triggered when handleTap is called
|
330
|
+
@objc func handleNotificationTap(_ sender: UITapGestureRecognizer) {
|
331
|
+
self.animateViewBounceAndZoom(viewToAnimate: self.notificationButton)
|
332
|
+
guard let vc = self.homeStoryboard.instantiateViewController(withIdentifier: "NotificationsVC") as? NotificationsVC else { return }
|
333
|
+
vc.delegate = self
|
334
|
+
vc.notifications = self.notifications
|
335
|
+
self.navigationController?.pushViewController(vc, animated: true)
|
336
|
+
}
|
337
|
+
|
338
|
+
func setAsRead(value: Bool) {
|
339
|
+
// TODO: enable when done
|
340
|
+
// if value {
|
341
|
+
// APIManager.sharedInstance.readNotifications(){
|
342
|
+
// result in
|
343
|
+
// if result == .success {
|
344
|
+
// self.setNotificationBadge()
|
345
|
+
// }
|
346
|
+
// }
|
347
|
+
//
|
348
|
+
// }
|
349
|
+
}
|
350
|
+
|
351
|
+
@IBAction func handleEditProfileImageButton(_ sender: Any) {
|
352
|
+
|
353
|
+
let pickerController = DKImagePickerController()
|
354
|
+
pickerController.UIDelegate = CustomUIDelegate()
|
355
|
+
pickerController.assetType = .allPhotos
|
356
|
+
pickerController.singleSelect = true
|
357
|
+
pickerController.didSelectAssets = { (assets: [DKAsset]) in
|
358
|
+
for asset in assets {
|
359
|
+
//Gets a fullscreen image for the asset to show in the CollectionView
|
360
|
+
asset.fetchFullScreenImageWithCompleteBlock({ (image, info) in
|
361
|
+
|
362
|
+
self.profileImageChanged = true
|
363
|
+
self.editProfileImageView.image = image
|
364
|
+
|
365
|
+
})
|
366
|
+
}
|
367
|
+
}
|
368
|
+
self.present(pickerController, animated: true, completion: nil)
|
369
|
+
}
|
370
|
+
|
371
|
+
@IBAction func saveDataTapped(_ sender: UIButton) {
|
372
|
+
if self.validateData(){
|
373
|
+
// TODO
|
374
|
+
|
375
|
+
}
|
376
|
+
}
|
377
|
+
|
378
|
+
// func updateProfileImage(name:String,lastname:String,aboutMe:String,phoneCountry:String,phone:String){
|
379
|
+
// let filename = "profile.jpg"
|
380
|
+
//
|
381
|
+
// var localsFileToUpload = [Int:[String]]()
|
382
|
+
//
|
383
|
+
// if !FilesManager.sharedInstance.removeMedia(filename: filename) {
|
384
|
+
// print("Error deleting provider profile image file")
|
385
|
+
// }
|
386
|
+
// let keyPath = "users/\(self.user?.id ?? "")/profile.jpg"
|
387
|
+
//
|
388
|
+
//
|
389
|
+
// if FilesManager.sharedInstance.saveMedia(UIImageJPEGRepresentation(self.editProfileImageView.image!, 0.8)!, filename: filename) {
|
390
|
+
//
|
391
|
+
//
|
392
|
+
// let thumbnailKeyPath = "users/\(self.user?.id ?? "")/profile-thumbnail.jpg"
|
393
|
+
// let thumbnailFilename = "profile-thumbnail.jpg"
|
394
|
+
// let thumbnailImage = self.editProfileImageView.image?.resize(targetSize: CGSize(width: 200, height: 200))
|
395
|
+
//
|
396
|
+
// if !FilesManager.sharedInstance.removeMedia(filename: thumbnailFilename) {
|
397
|
+
// print("Error deleting provider profile thumbnail file")
|
398
|
+
// }
|
399
|
+
//
|
400
|
+
//
|
401
|
+
// if FilesManager.sharedInstance.saveMedia(UIImageJPEGRepresentation(thumbnailImage!, 0.8)!, filename: thumbnailFilename) {
|
402
|
+
//
|
403
|
+
// localsFileToUpload[0] = [thumbnailFilename, thumbnailKeyPath]
|
404
|
+
// localsFileToUpload[1] = [filename, keyPath]
|
405
|
+
//
|
406
|
+
// for file in localsFileToUpload{
|
407
|
+
// S3Manager.sharedInstance.uploadToS3(url: URL(fileURLWithPath: FilesManager.sharedInstance.fileInDocumentsDirectory(file.value[0])), name: file.value[1], completeBlock: { (success: Bool) -> Void in
|
408
|
+
// })
|
409
|
+
// }
|
410
|
+
//
|
411
|
+
// UserRepository.sharedInstance.updateLoggedUser(name: name, lastname: lastname, aboutMe: aboutMe, phoneCountry: phoneCountry, phone: phone, favorites: self.favorites, noMoreFavDest: noMoreFavorites, picture:keyPath, thumbnailPicture: thumbnailKeyPath) { result in
|
412
|
+
// if result == .success {
|
413
|
+
// self.noMoreFavorites.removeAll(keepingCapacity: false)
|
414
|
+
// APIHelper.sharedInstance.showSuccesMessage(with: NSLocalizedString("Saved!", comment: ""), and: NSLocalizedString("Your data has been updated.", comment: ""))
|
415
|
+
// } else {
|
416
|
+
// APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Save error.", comment: ""), and: NSLocalizedString("Please try again.", comment: ""))
|
417
|
+
// }
|
418
|
+
// }
|
419
|
+
// }
|
420
|
+
//
|
421
|
+
// }
|
422
|
+
// }
|
423
|
+
|
424
|
+
func isValidEmail(_ testStr:String) -> Bool {
|
425
|
+
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
|
426
|
+
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
|
427
|
+
return emailTest.evaluate(with: testStr)
|
428
|
+
}
|
429
|
+
|
430
|
+
func isValidName(_ testStr:String) -> Bool {
|
431
|
+
let nameRegEx = "[A-Za-z\\s]+"
|
432
|
+
let nameTest = NSPredicate(format:"SELF MATCHES %@", nameRegEx)
|
433
|
+
return nameTest.evaluate(with: testStr)
|
434
|
+
}
|
435
|
+
|
436
|
+
func isValidPhone(_ testStr:String) -> Bool {
|
437
|
+
let phoneRegEx = "[0-9]*"
|
438
|
+
let phoneTest = NSPredicate(format:"SELF MATCHES %@", phoneRegEx)
|
439
|
+
return phoneTest.evaluate(with: testStr)
|
440
|
+
}
|
441
|
+
|
442
|
+
func validateData() -> Bool{
|
443
|
+
if let name = self.nameTextField.text, let lastname = self.lastnameTextField.text, let phone = self.phoneTextField.text {
|
444
|
+
if !isValidName(name){
|
445
|
+
APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Invalid name", comment: ""), and: "")
|
446
|
+
return false
|
447
|
+
} else if !isValidName(lastname){
|
448
|
+
APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Invalid lastname", comment: ""), and: "")
|
449
|
+
return false
|
450
|
+
} else if !isValidPhone(phone.trimmingCharacters(in: .whitespacesAndNewlines)) {
|
451
|
+
APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Invalid phone number", comment: ""), and: "")
|
452
|
+
return false
|
453
|
+
}
|
454
|
+
}
|
455
|
+
return true
|
456
|
+
}
|
457
|
+
|
458
|
+
@IBAction func selectCountryTapped(_ sender: UIButton) {
|
459
|
+
if self.countries.isEmpty {
|
460
|
+
// TODO: Set countries
|
461
|
+
} else {
|
462
|
+
self.addActionSheetPicker(sender)
|
463
|
+
}
|
464
|
+
}
|
465
|
+
|
466
|
+
func addActionSheetPicker(_ sender: UIButton){
|
467
|
+
let prevCountryValue = self.phonePrefix.text
|
468
|
+
let prevPhoneCountryValue = self.phoneCountry
|
469
|
+
let acp = ActionSheetStringPicker(title: "", rows: self.countries.map{$0.name}, initialSelection: 0, doneBlock: {
|
470
|
+
picker, values, indexes in
|
471
|
+
|
472
|
+
self.phonePrefix.text = self.countries[values].dial_code
|
473
|
+
self.phoneCountry = self.countries[values].name
|
474
|
+
self.phoneFlagLabel.text = self.countries[values].flag
|
475
|
+
return
|
476
|
+
}, cancel: {
|
477
|
+
ActionStringCancelBlock in
|
478
|
+
self.phonePrefix.text = prevCountryValue
|
479
|
+
self.phoneCountry = prevPhoneCountryValue
|
480
|
+
return }, origin: sender)
|
481
|
+
|
482
|
+
acp?.setTextColor(Colors.firstGradientColor)
|
483
|
+
acp?.pickerBackgroundColor = UIColor.white
|
484
|
+
acp?.toolbarBackgroundColor = UIColor.white
|
485
|
+
acp?.toolbarButtonsColor = Colors.firstGradientColor
|
486
|
+
acp?.show()
|
487
|
+
}
|
488
|
+
|
489
|
+
@IBAction func handleLogoutButton(_ sender: UIButton) {
|
490
|
+
|
491
|
+
// TODO: logout remote action
|
492
|
+
let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
|
493
|
+
appDelegate.logout()
|
494
|
+
|
495
|
+
}
|
496
|
+
|
497
|
+
@IBAction func aboutUsTapped(_ sender: UIButton) {
|
498
|
+
guard let vc = self.homeStoryboard.instantiateViewController(withIdentifier: "AboutUsVC") as? AboutUsVC else { return }
|
499
|
+
self.navigationController?.pushViewController(vc, animated: true)
|
500
|
+
}
|
501
|
+
|
502
|
+
@objc func handleFavoritesUpdated(_ notification: Foundation.Notification) {
|
503
|
+
//TODO: Get favorites again
|
504
|
+
|
505
|
+
}
|
506
|
+
|
507
|
+
}
|
508
|
+
|
509
|
+
open class CustomUIDelegate: DKImagePickerControllerDefaultUIDelegate {
|
510
|
+
|
511
|
+
open override func imagePickerControllerCreateCamera(_ imagePickerController: DKImagePickerController) -> UIViewController {
|
512
|
+
|
513
|
+
let picker = CustomCamera()
|
514
|
+
picker.sourceType = .camera
|
515
|
+
picker.mediaTypes = [kUTTypeImage as String]
|
516
|
+
return picker
|
517
|
+
}
|
518
|
+
|
519
|
+
}
|
520
|
+
|
521
|
+
extension ProfileTVC: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
|
522
|
+
|
523
|
+
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
524
|
+
if collectionView == favoritesCollectionView {
|
525
|
+
return favorites.count
|
526
|
+
} else {
|
527
|
+
return userHistory.count
|
528
|
+
}
|
529
|
+
}
|
530
|
+
|
531
|
+
func numberOfSections(in collectionView: UICollectionView) -> Int {
|
532
|
+
return 1
|
533
|
+
}
|
534
|
+
|
535
|
+
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
536
|
+
|
537
|
+
if collectionView == favoritesCollectionView {
|
538
|
+
|
539
|
+
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FavoriteCollectionCell", for: indexPath) as! FavoriteCollectionCell
|
540
|
+
|
541
|
+
let favorite = favorites[indexPath.row]
|
542
|
+
cell.destinationLabel.text = favorite.name
|
543
|
+
cell.removeButton.addTarget(self, action: #selector(handleRemoveButton(_:)), for: .touchUpInside)
|
544
|
+
return cell
|
545
|
+
|
546
|
+
} else {
|
547
|
+
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "DestinationCellView", for: indexPath) as! DestinationCell
|
548
|
+
|
549
|
+
let history = userHistory[indexPath.row]
|
550
|
+
cell.destinationLabel.text = history.name.capitalized
|
551
|
+
cell.destinationBackgroundImage.kf.indicatorType = .activity
|
552
|
+
cell.destinationBackgroundImage.kf.setImage(with: URL(string: history.thumbnailUrl), options: [.transition(.fade(0.2))])
|
553
|
+
// for dest in travelGroup.destinations {
|
554
|
+
// cell.cityLabel.text = "\(cell.cityLabel.text!)\(travelGroup.destinations[0].destination?.city ?? ""), "
|
555
|
+
// }
|
556
|
+
// cell.cityLabel.text?.removeLast(2)
|
557
|
+
return cell
|
558
|
+
}
|
559
|
+
}
|
560
|
+
|
561
|
+
@objc func handleRemoveButton(_ sender: UIButton) {
|
562
|
+
let touchPoint = sender.convert(CGPoint.zero, to: self.favoritesCollectionView)
|
563
|
+
if let clickedIndexPath = self.favoritesCollectionView.indexPathForItem(at: touchPoint) {
|
564
|
+
self.noMoreFavorites.append(favorites[clickedIndexPath.row])
|
565
|
+
let removeDest = self.favorites.remove(at: clickedIndexPath.row)
|
566
|
+
self.noMoreFavorites.append(removeDest)
|
567
|
+
self.favoritesCollectionView.deleteItems(at: [clickedIndexPath])
|
568
|
+
}
|
569
|
+
}
|
570
|
+
|
571
|
+
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
|
572
|
+
if collectionView == favoritesCollectionView {
|
573
|
+
let size = (favorites[indexPath.row].name as NSString).size(withAttributes: [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 16.0)])
|
574
|
+
return CGSize(width: size.width + 65, height: 40)
|
575
|
+
} else {
|
576
|
+
return CGSize(width: 200, height: 100)
|
577
|
+
}
|
578
|
+
}
|
579
|
+
|
580
|
+
}
|
581
|
+
|